moved progress calculations from openglworker to transitionblock
These functions are universal transition functions that have use outside of the OpenGL workers.
This commit is contained in:
@@ -1,5 +1,7 @@
|
|||||||
#include "transition.h"
|
#include "transition.h"
|
||||||
|
|
||||||
|
#include "common/clamp.h"
|
||||||
|
|
||||||
TransitionBlock::TransitionBlock() :
|
TransitionBlock::TransitionBlock() :
|
||||||
connected_out_block_(nullptr),
|
connected_out_block_(nullptr),
|
||||||
connected_in_block_(nullptr)
|
connected_in_block_(nullptr)
|
||||||
@@ -48,6 +50,44 @@ rational TransitionBlock::out_offset() const
|
|||||||
return 0;
|
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)
|
void TransitionBlock::BlockConnected(NodeEdgePtr edge)
|
||||||
{
|
{
|
||||||
if (!edge->output()->parentNode()->IsBlock()) {
|
if (!edge->output()->parentNode()->IsBlock()) {
|
||||||
|
|||||||
@@ -21,7 +21,13 @@ public:
|
|||||||
Block* connected_out_block() const;
|
Block* connected_out_block() const;
|
||||||
Block* connected_in_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:
|
private:
|
||||||
|
double GetInternalTransitionTime(const rational& time) const;
|
||||||
|
|
||||||
NodeInput* out_block_input_;
|
NodeInput* out_block_input_;
|
||||||
|
|
||||||
NodeInput* in_block_input_;
|
NodeInput* in_block_input_;
|
||||||
|
|||||||
@@ -275,29 +275,14 @@ void OpenGLWorker::RunNodeAccelerated(const Node *node, const TimeRange &range,
|
|||||||
if (block_node->type() == Block::kTransition) {
|
if (block_node->type() == Block::kTransition) {
|
||||||
const TransitionBlock* transition_node = static_cast<const TransitionBlock*>(node);
|
const TransitionBlock* transition_node = static_cast<const TransitionBlock*>(node);
|
||||||
|
|
||||||
// Provide transition information
|
|
||||||
double internal_time = (range.in() - block_node->in()).toDouble();
|
|
||||||
|
|
||||||
GLfloat all_prog = static_cast<GLfloat>(internal_time / block_node->length().toDouble());
|
|
||||||
GLfloat out_prog = 0;
|
|
||||||
GLfloat in_prog = 0;
|
|
||||||
|
|
||||||
if (transition_node->out_offset() != 0) {
|
|
||||||
out_prog = static_cast<GLfloat>(clamp(1.0 - (internal_time / transition_node->out_offset().toDouble()), 0.0, 1.0));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (transition_node->in_offset() != 0) {
|
|
||||||
in_prog = static_cast<GLfloat>(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)
|
// 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<GLfloat>(transition_node->GetTotalProgress(range.in())));
|
||||||
|
|
||||||
// Provides progress of out section from 1.0 (start) - 0.0 (end)
|
// 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<GLfloat>(transition_node->GetOutProgress(range.in())));
|
||||||
|
|
||||||
// Provides progress of in section from 0.0 (start) - 1.0 (end)
|
// 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<GLfloat>(transition_node->GetInProgress(range.in())));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user