hash the transition's progress

Since the transition progress directly affects the resulting image, it's
important to include it in the frame hash.
This commit is contained in:
itsmattkc
2020-01-06 17:25:38 +11:00
parent 8358d7d221
commit d3ed7f9863
3 changed files with 43 additions and 5 deletions
+24 -2
View File
@@ -42,12 +42,34 @@ void TransitionBlock::Retranslate()
rational TransitionBlock::in_offset() const
{
return 0;
// If no in block is connected, there's no in offset
if (!connected_in_block()) {
return 0;
}
if (!connected_out_block()) {
// Assume only an in block is connected, in which case this entire transition length
return length();
}
// Assume both are connected, in which case the in offset will be <= length
return length() / 2 + media_in();
}
rational TransitionBlock::out_offset() const
{
return 0;
// If no in block is connected, there's no in offset
if (!connected_out_block()) {
return 0;
}
if (!connected_in_block()) {
// Assume only an in block is connected, in which case this entire transition length
return length();
}
// Assume both are connected, in which case the in offset will be <= length
return length() / 2 - media_in();
}
Block *TransitionBlock::connected_out_block() const
+13
View File
@@ -1,6 +1,7 @@
#include "videorenderworker.h"
#include "common/define.h"
#include "node/block/transition/transition.h"
#include "node/node.h"
#include "project/project.h"
#include "render/pixelservice.h"
@@ -76,6 +77,18 @@ void VideoRenderWorker::HashNodeRecursively(QCryptographicHash *hash, const Node
// Add this Node's ID
hash->addData(n->id().toUtf8());
if (n->IsBlock() && static_cast<const Block*>(n)->type() == Block::kTransition) {
const TransitionBlock* transition = static_cast<const TransitionBlock*>(n);
double all_prog = transition->GetTotalProgress(time);
double in_prog = transition->GetInProgress(time);
double out_prog = transition->GetOutProgress(time);
hash->addData(reinterpret_cast<const char*>(&all_prog), sizeof(double));
hash->addData(reinterpret_cast<const char*>(&in_prog), sizeof(double));
hash->addData(reinterpret_cast<const char*>(&out_prog), sizeof(double));
}
foreach (NodeParam* param, n->parameters()) {
// For each input, try to hash its value
if (param->type() == NodeParam::kInput) {
@@ -145,15 +145,18 @@ void TimelineViewBlockItem::paint(QPainter *painter, const QStyleOptionGraphicsI
painter->setRenderHint(QPainter::Antialiasing);
TransitionBlock* t = static_cast<TransitionBlock*>(block_);
if (t->out_block_input()->IsConnected()) {
if (t->connected_out_block()) {
// Transition fades something out, we'll draw a line
painter->drawLine(rect().topLeft(), rect().bottomRight());
}
if (t->in_block_input()->IsConnected()) {
if (t->connected_in_block()) {
// Transition fades something in, we'll draw a line
painter->drawLine(rect().bottomLeft(), rect().topRight());
}
if (t->out_block_input()->IsConnected() && t->in_block_input()->IsConnected()) {
if (t->connected_out_block() && t->connected_in_block()) {
// Draw line between out offset and in offset
qreal crossover_line = rect().left();
crossover_line += TimeToScene(t->out_offset());