diff --git a/app/node/block/transition/transition.cpp b/app/node/block/transition/transition.cpp index 559b871c8..03814f919 100644 --- a/app/node/block/transition/transition.cpp +++ b/app/node/block/transition/transition.cpp @@ -1,5 +1,7 @@ #include "transition.h" +#include "common/clamp.h" + TransitionBlock::TransitionBlock() : connected_out_block_(nullptr), connected_in_block_(nullptr) @@ -48,6 +50,44 @@ rational TransitionBlock::out_offset() const return 0; } +Block *TransitionBlock::connected_out_block() const +{ + return connected_out_block_; +} + +Block *TransitionBlock::connected_in_block() const +{ + return connected_in_block_; +} + +double TransitionBlock::GetTotalProgress(const rational &time) const +{ + return GetInternalTransitionTime(time) / length().toDouble(); +} + +double TransitionBlock::GetOutProgress(const rational &time) const +{ + if (out_offset() == 0) { + return 0; + } + + return clamp(1.0 - (GetInternalTransitionTime(time) / out_offset().toDouble()), 0.0, 1.0); +} + +double TransitionBlock::GetInProgress(const rational &time) const +{ + if (in_offset() == 0) { + return 0; + } + + return clamp((GetInternalTransitionTime(time) - out_offset().toDouble()) / in_offset().toDouble(), 0.0, 1.0); +} + +double TransitionBlock::GetInternalTransitionTime(const rational &time) const +{ + return time.toDouble() - in().toDouble(); +} + void TransitionBlock::BlockConnected(NodeEdgePtr edge) { if (!edge->output()->parentNode()->IsBlock()) { diff --git a/app/node/block/transition/transition.h b/app/node/block/transition/transition.h index 0d6e258e4..c7a5ea895 100644 --- a/app/node/block/transition/transition.h +++ b/app/node/block/transition/transition.h @@ -21,7 +21,13 @@ public: Block* connected_out_block() const; Block* connected_in_block() const; + double GetTotalProgress(const rational& time) const; + double GetOutProgress(const rational& time) const; + double GetInProgress(const rational& time) const; + private: + double GetInternalTransitionTime(const rational& time) const; + NodeInput* out_block_input_; NodeInput* in_block_input_; diff --git a/app/render/backend/opengl/openglworker.cpp b/app/render/backend/opengl/openglworker.cpp index e1545c243..bc6c06a85 100644 --- a/app/render/backend/opengl/openglworker.cpp +++ b/app/render/backend/opengl/openglworker.cpp @@ -275,29 +275,14 @@ void OpenGLWorker::RunNodeAccelerated(const Node *node, const TimeRange &range, if (block_node->type() == Block::kTransition) { const TransitionBlock* transition_node = static_cast(node); - // Provide transition information - double internal_time = (range.in() - block_node->in()).toDouble(); - - GLfloat all_prog = static_cast(internal_time / block_node->length().toDouble()); - GLfloat out_prog = 0; - GLfloat in_prog = 0; - - if (transition_node->out_offset() != 0) { - out_prog = static_cast(clamp(1.0 - (internal_time / transition_node->out_offset().toDouble()), 0.0, 1.0)); - } - - if (transition_node->in_offset() != 0) { - in_prog = static_cast(clamp((internal_time - transition_node->out_offset().toDouble()) / transition_node->in_offset().toDouble(), 0.0, 1.0)); - } - // Provides total transition progress from 0.0 (start) - 1.0 (end) - shader->setUniformValue("ove_tprog_all", all_prog); + shader->setUniformValue("ove_tprog_all", static_cast(transition_node->GetTotalProgress(range.in()))); // Provides progress of out section from 1.0 (start) - 0.0 (end) - shader->setUniformValue("ove_tprog_out", out_prog); + shader->setUniformValue("ove_tprog_out", static_cast(transition_node->GetOutProgress(range.in()))); // Provides progress of in section from 0.0 (start) - 1.0 (end) - shader->setUniformValue("ove_tprog_in", in_prog); + shader->setUniformValue("ove_tprog_in", static_cast(transition_node->GetInProgress(range.in()))); } }