partially functional transform
This commit is contained in:
+1
-1
@@ -36,7 +36,7 @@ extern "C" {
|
|||||||
|
|
||||||
#include "core.h"
|
#include "core.h"
|
||||||
|
|
||||||
int main(int argc, char *argv[]) {
|
int main(int argc, char *argv[]) {
|
||||||
// Create application instance
|
// Create application instance
|
||||||
QApplication a(argc, argv);
|
QApplication a(argc, argv);
|
||||||
|
|
||||||
|
|||||||
@@ -114,6 +114,11 @@ QVariant OpacityNode::Value(NodeOutput *output, const rational &time)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void OpacityNode::Retranslate()
|
||||||
|
{
|
||||||
|
opacity_input_->set_name(tr("Opacity"));
|
||||||
|
}
|
||||||
|
|
||||||
NodeInput *OpacityNode::texture_input()
|
NodeInput *OpacityNode::texture_input()
|
||||||
{
|
{
|
||||||
return texture_input_;
|
return texture_input_;
|
||||||
|
|||||||
@@ -38,6 +38,8 @@ public:
|
|||||||
|
|
||||||
virtual QVariant Value(NodeOutput *output, const rational &time) override;
|
virtual QVariant Value(NodeOutput *output, const rational &time) override;
|
||||||
|
|
||||||
|
virtual void Retranslate() override;
|
||||||
|
|
||||||
NodeInput* texture_input();
|
NodeInput* texture_input();
|
||||||
|
|
||||||
NodeOutput* texture_output();
|
NodeOutput* texture_output();
|
||||||
|
|||||||
@@ -35,6 +35,7 @@ TransformDistort::TransformDistort()
|
|||||||
|
|
||||||
scale_input_ = new NodeInput("scale_in");
|
scale_input_ = new NodeInput("scale_in");
|
||||||
scale_input_->add_data_input(NodeParam::kVec2);
|
scale_input_->add_data_input(NodeParam::kVec2);
|
||||||
|
scale_input_->set_value(QVector2D(100.0f, 100.0f));
|
||||||
AddParameter(scale_input_);
|
AddParameter(scale_input_);
|
||||||
|
|
||||||
anchor_input_ = new NodeInput("anchor_in");
|
anchor_input_ = new NodeInput("anchor_in");
|
||||||
@@ -71,14 +72,28 @@ NodeOutput *TransformDistort::matrix_output()
|
|||||||
return matrix_output_;
|
return matrix_output_;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void TransformDistort::Retranslate()
|
||||||
|
{
|
||||||
|
position_input_->set_name(tr("Position"));
|
||||||
|
rotation_input_->set_name(tr("Rotation"));
|
||||||
|
scale_input_->set_name(tr("Scale"));
|
||||||
|
anchor_input_->set_name(tr("Anchor Point"));
|
||||||
|
}
|
||||||
|
|
||||||
QVariant TransformDistort::Value(NodeOutput *output, const rational &time)
|
QVariant TransformDistort::Value(NodeOutput *output, const rational &time)
|
||||||
{
|
{
|
||||||
if (output == matrix_output_) {
|
if (output == matrix_output_) {
|
||||||
QMatrix4x4 mat;
|
QMatrix4x4 mat;
|
||||||
|
|
||||||
mat.translate(position_input_->get_value(time).value<QVector2D>());
|
// Position translate
|
||||||
//mat.rotate(0)
|
QVector2D pos = position_input_->get_value(time).value<QVector2D>() * 0.01f;
|
||||||
//mat.scale()
|
mat.translate(pos);
|
||||||
|
|
||||||
|
// Rotation
|
||||||
|
mat.rotate(rotation_input_->get_value(time).toFloat(), 0, 0, 1);
|
||||||
|
|
||||||
|
// Scale
|
||||||
|
mat.scale(scale_input_->get_value(time).value<QVector2D>()*0.01f);
|
||||||
|
|
||||||
return mat;
|
return mat;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -36,6 +36,8 @@ public:
|
|||||||
|
|
||||||
NodeOutput* matrix_output();
|
NodeOutput* matrix_output();
|
||||||
|
|
||||||
|
virtual void Retranslate() override;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual QVariant Value(NodeOutput *output, const rational &time) override;
|
virtual QVariant Value(NodeOutput *output, const rational &time) override;
|
||||||
|
|
||||||
|
|||||||
@@ -164,10 +164,17 @@ void NodeInput::set_maximum(const QVariant &max)
|
|||||||
|
|
||||||
NodeParam::DataType NodeInput::data_type()
|
NodeParam::DataType NodeInput::data_type()
|
||||||
{
|
{
|
||||||
|
if (IsConnected()) {
|
||||||
|
// Return the connected output's data type
|
||||||
|
return edges_.first()->output()->data_type();
|
||||||
|
}
|
||||||
|
|
||||||
if (inputs_.isEmpty()) {
|
if (inputs_.isEmpty()) {
|
||||||
|
// Safety if no inputs have been added
|
||||||
return kNone;
|
return kNone;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Return first
|
||||||
return inputs_.first();
|
return inputs_.first();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+6
-1
@@ -45,6 +45,10 @@ void Node::Release()
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Node::Retranslate()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
void Node::AddParameter(NodeParam *param)
|
void Node::AddParameter(NodeParam *param)
|
||||||
{
|
{
|
||||||
// Ensure no other param with this ID has been added to this Node (since that defeats the purpose)
|
// Ensure no other param with this ID has been added to this Node (since that defeats the purpose)
|
||||||
@@ -334,7 +338,8 @@ void Node::Hash(QCryptographicHash *hash, NodeOutput* from, const rational &time
|
|||||||
&& static_cast<NodeInput*>(param)->dependent()) {
|
&& static_cast<NodeInput*>(param)->dependent()) {
|
||||||
// Get the value at this time
|
// Get the value at this time
|
||||||
QVariant v = static_cast<NodeInput*>(param)->get_value(time);
|
QVariant v = static_cast<NodeInput*>(param)->get_value(time);
|
||||||
hash->addData(v.toByteArray()); // FIXME: Does this work on all value types?
|
|
||||||
|
hash->addData(NodeParam::ValueToBytes(param->data_type(), v));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -90,6 +90,11 @@ public:
|
|||||||
*/
|
*/
|
||||||
virtual void Release();
|
virtual void Release();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Function called to retranslate parameter names (should be overridden in derivatives)
|
||||||
|
*/
|
||||||
|
virtual void Retranslate();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Return the parameter at a given index
|
* @brief Return the parameter at a given index
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -39,7 +39,22 @@ NodeParam::DataType NodeOutput::data_type()
|
|||||||
|
|
||||||
void NodeOutput::set_data_type(const NodeParam::DataType &type)
|
void NodeOutput::set_data_type(const NodeParam::DataType &type)
|
||||||
{
|
{
|
||||||
|
if (data_type_ == type) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
data_type_ = type;
|
data_type_ = type;
|
||||||
|
|
||||||
|
// If this output is connected to other inputs, check if they're compatible with this new data type
|
||||||
|
if (IsConnected()) {
|
||||||
|
foreach (NodeEdgePtr edge, edges_) {
|
||||||
|
if (!AreDataTypesCompatible(this, edge->input())) {
|
||||||
|
// FIXME: Possible array out of bounds since this function removes edges while we're iterating through them?
|
||||||
|
// I'm not sure how Qt's `foreach` works.
|
||||||
|
DisconnectEdge(edge);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
QVariant NodeOutput::get_value(const rational& time)
|
QVariant NodeOutput::get_value(const rational& time)
|
||||||
|
|||||||
@@ -20,7 +20,12 @@
|
|||||||
|
|
||||||
#include "param.h"
|
#include "param.h"
|
||||||
|
|
||||||
|
#include <QColor>
|
||||||
#include <QDebug>
|
#include <QDebug>
|
||||||
|
#include <QMatrix4x4>
|
||||||
|
#include <QVector2D>
|
||||||
|
#include <QVector3D>
|
||||||
|
#include <QVector4D>
|
||||||
|
|
||||||
#include "node/node.h"
|
#include "node/node.h"
|
||||||
#include "node/input.h"
|
#include "node/input.h"
|
||||||
@@ -241,6 +246,35 @@ QString NodeParam::GetDefaultDataTypeName(const DataType& type)
|
|||||||
return QString();
|
return QString();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QByteArray NodeParam::ValueToBytes(const NodeParam::DataType &type, const QVariant &value)
|
||||||
|
{
|
||||||
|
switch (type) {
|
||||||
|
case kInt: return ValueToBytesInternal<int>(value);
|
||||||
|
case kFloat: return ValueToBytesInternal<float>(value);
|
||||||
|
case kColor: return ValueToBytesInternal<QColor>(value);
|
||||||
|
case kString: return ValueToBytesInternal<QString>(value);
|
||||||
|
case kBoolean: return ValueToBytesInternal<bool>(value);
|
||||||
|
case kFont: return ValueToBytesInternal<QString>(value); // FIXME: This should probably be a QFont?
|
||||||
|
case kFile: return ValueToBytesInternal<QString>(value);
|
||||||
|
case kMatrix: return ValueToBytesInternal<QMatrix4x4>(value);
|
||||||
|
case kFootage: return ValueToBytesInternal<float>(value); // FIXME: Unsustainble, find some other way to match Footage
|
||||||
|
case kRational: return ValueToBytesInternal<rational>(value);
|
||||||
|
case kVec2: return ValueToBytesInternal<QVector2D>(value);
|
||||||
|
case kVec3: return ValueToBytesInternal<QVector3D>(value);
|
||||||
|
case kVec4: return ValueToBytesInternal<QVector4D>(value);
|
||||||
|
|
||||||
|
// These types have no persistent input
|
||||||
|
case kNone:
|
||||||
|
case kTexture:
|
||||||
|
case kBlock:
|
||||||
|
case kTrack:
|
||||||
|
case kAny:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return QByteArray();
|
||||||
|
}
|
||||||
|
|
||||||
void NodeParam::ClearCachedValue()
|
void NodeParam::ClearCachedValue()
|
||||||
{
|
{
|
||||||
// Since get_value() will (read: should) never receive a negative number, this will effectively invalidate any value
|
// Since get_value() will (read: should) never receive a negative number, this will effectively invalidate any value
|
||||||
@@ -257,3 +291,17 @@ void NodeParam::SetValueCachingEnabled(bool enabled)
|
|||||||
{
|
{
|
||||||
value_caching_ = enabled;
|
value_caching_ = enabled;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
QByteArray NodeParam::ValueToBytesInternal(const QVariant &v)
|
||||||
|
{
|
||||||
|
QByteArray bytes;
|
||||||
|
|
||||||
|
int size_of_type = sizeof(T);
|
||||||
|
|
||||||
|
bytes.resize(size_of_type);
|
||||||
|
T raw_val = v.value<T>();
|
||||||
|
memcpy(bytes.data(), &raw_val, static_cast<size_t>(size_of_type));
|
||||||
|
|
||||||
|
return bytes;
|
||||||
|
}
|
||||||
|
|||||||
@@ -240,6 +240,11 @@ public:
|
|||||||
*/
|
*/
|
||||||
static QString GetDefaultDataTypeName(const DataType &type);
|
static QString GetDefaultDataTypeName(const DataType &type);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Convert a value from a NodeParam into bytes
|
||||||
|
*/
|
||||||
|
static QByteArray ValueToBytes(const DataType &type, const QVariant& value);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Clear the cached value
|
* @brief Clear the cached value
|
||||||
*/
|
*/
|
||||||
@@ -293,6 +298,12 @@ protected:
|
|||||||
bool value_caching_;
|
bool value_caching_;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
/**
|
||||||
|
* @brief Internal function for returning a value in the form of bytes
|
||||||
|
*/
|
||||||
|
template<typename T>
|
||||||
|
static QByteArray ValueToBytesInternal(const QVariant& v);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Internal name string
|
* @brief Internal name string
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -364,7 +364,7 @@ void RendererProcessor::CacheNext()
|
|||||||
|
|
||||||
rational cache_frame = cache_queue_.takeFirst();
|
rational cache_frame = cache_queue_.takeFirst();
|
||||||
|
|
||||||
//qDebug() << "[RendererProcessor] Caching" << cache_frame.toDouble();
|
qDebug() << "[RendererProcessor] Caching" << cache_frame.toDouble();
|
||||||
|
|
||||||
threads_.first()->Queue(NodeDependency(texture_input_->get_connected_output(), cache_frame), true);
|
threads_.first()->Queue(NodeDependency(texture_input_->get_connected_output(), cache_frame), true);
|
||||||
|
|
||||||
|
|||||||
@@ -22,7 +22,7 @@
|
|||||||
|
|
||||||
#include <QCheckBox>
|
#include <QCheckBox>
|
||||||
#include <QDebug>
|
#include <QDebug>
|
||||||
|
#include <QEvent>
|
||||||
#include <QPainter>
|
#include <QPainter>
|
||||||
|
|
||||||
#include "project/item/sequence/sequence.h"
|
#include "project/item/sequence/sequence.h"
|
||||||
@@ -92,7 +92,9 @@ bool NodeParamViewItem::CanAddNode(Node* n)
|
|||||||
|
|
||||||
void NodeParamViewItem::changeEvent(QEvent *e)
|
void NodeParamViewItem::changeEvent(QEvent *e)
|
||||||
{
|
{
|
||||||
// FIXME: Retranslate all UI elements
|
if (e->type() == QEvent::LanguageChange && !nodes_.isEmpty()) {
|
||||||
|
Retranslate();
|
||||||
|
}
|
||||||
|
|
||||||
QWidget::changeEvent(e);
|
QWidget::changeEvent(e);
|
||||||
}
|
}
|
||||||
@@ -103,8 +105,6 @@ void NodeParamViewItem::SetupUI()
|
|||||||
|
|
||||||
Node* first_node = nodes_.first();
|
Node* first_node = nodes_.first();
|
||||||
|
|
||||||
title_bar_lbl_->setText(first_node->Name());
|
|
||||||
|
|
||||||
int row_count = 0;
|
int row_count = 0;
|
||||||
|
|
||||||
for (int i=0;i<first_node->ParameterCount();i++) {
|
for (int i=0;i<first_node->ParameterCount();i++) {
|
||||||
@@ -114,7 +114,8 @@ void NodeParamViewItem::SetupUI()
|
|||||||
if (param->type() == NodeParam::kInput) {
|
if (param->type() == NodeParam::kInput) {
|
||||||
|
|
||||||
// Add descriptor label
|
// Add descriptor label
|
||||||
QLabel* param_label = new QLabel(tr("%1:").arg(param->name()));
|
QLabel* param_label = new QLabel();
|
||||||
|
param_lbls_.append(param_label);
|
||||||
|
|
||||||
content_layout_->addWidget(param_label, row_count, 0);
|
content_layout_->addWidget(param_label, row_count, 0);
|
||||||
|
|
||||||
@@ -132,6 +133,8 @@ void NodeParamViewItem::SetupUI()
|
|||||||
row_count++;
|
row_count++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Retranslate();
|
||||||
}
|
}
|
||||||
|
|
||||||
void NodeParamViewItem::AddAdditionalNode(Node *n)
|
void NodeParamViewItem::AddAdditionalNode(Node *n)
|
||||||
@@ -149,6 +152,28 @@ void NodeParamViewItem::AddAdditionalNode(Node *n)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void NodeParamViewItem::Retranslate()
|
||||||
|
{
|
||||||
|
Node* first_node = nodes_.first();
|
||||||
|
|
||||||
|
first_node->Retranslate();
|
||||||
|
|
||||||
|
title_bar_lbl_->setText(first_node->Name());
|
||||||
|
|
||||||
|
int row_count = 0;
|
||||||
|
|
||||||
|
for (int i=0;i<first_node->ParameterCount();i++) {
|
||||||
|
NodeParam* param = first_node->ParamAt(i);
|
||||||
|
|
||||||
|
// This widget only needs to show input parameters
|
||||||
|
if (param->type() == NodeParam::kInput) {
|
||||||
|
param_lbls_.at(row_count)->setText(tr("%1:").arg(param->name()));
|
||||||
|
|
||||||
|
row_count++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void NodeParamViewItem::SetExpanded(bool e)
|
void NodeParamViewItem::SetExpanded(bool e)
|
||||||
{
|
{
|
||||||
expanded_ = e;
|
expanded_ = e;
|
||||||
|
|||||||
@@ -56,12 +56,16 @@ private:
|
|||||||
|
|
||||||
void AddAdditionalNode(Node* n);
|
void AddAdditionalNode(Node* n);
|
||||||
|
|
||||||
|
void Retranslate();
|
||||||
|
|
||||||
bool expanded_;
|
bool expanded_;
|
||||||
|
|
||||||
NodeParamViewItemTitleBar* title_bar_;
|
NodeParamViewItemTitleBar* title_bar_;
|
||||||
|
|
||||||
QLabel* title_bar_lbl_;
|
QLabel* title_bar_lbl_;
|
||||||
|
|
||||||
|
QVector<QLabel*> param_lbls_;
|
||||||
|
|
||||||
QPushButton* title_bar_collapse_btn_;
|
QPushButton* title_bar_collapse_btn_;
|
||||||
|
|
||||||
QWidget* contents_;
|
QWidget* contents_;
|
||||||
|
|||||||
Reference in New Issue
Block a user