diff --git a/app/node/input.cpp b/app/node/input.cpp index 434a2e222..1b5d53307 100644 --- a/app/node/input.cpp +++ b/app/node/input.cpp @@ -32,6 +32,7 @@ #include "output.h" #include "inputarray.h" #include "project/item/footage/stream.h" +#include "render/color.h" NodeInput::NodeInput(const QString& id, const DataType &type, const QVariant &default_value) : NodeParam(id), @@ -49,6 +50,7 @@ NodeInput::NodeInput(const QString& id, const DataType &type, const QVariant &de track_size = 3; break; case kVec4: + case kColor: track_size = 4; break; default: @@ -280,23 +282,34 @@ void NodeInput::SaveInternal(QXmlStreamWriter*) const QString NodeInput::ValueToString(const QVariant &value) const { - switch (data_type_) { + return ValueToString(data_type_, value); +} + +QString NodeInput::ValueToString(const DataType& data_type, const QVariant &value) +{ + switch (data_type) { case kRational: return value.value().toString(); case kFootage: return QString::number(reinterpret_cast(value.value().get())); + case kColor: + { + Color c = value.value(); + + return QStringLiteral("%1,%2,%3,%4").arg(c.red(), c.green(), c.blue(), c.alpha()); + } default: if (value.canConvert()) { return value.toString(); } if (!value.isNull()) { - qWarning() << "Failed to convert type" << QStringLiteral("%1").arg(data_type_, 0, 16) << "to string"; + qWarning() << "Failed to convert type" << QStringLiteral("%1").arg(data_type, 0, 16) << "to string"; } /* fall through */ - // These data types need no XML representation + // These data types need no XML representation case kTexture: case kSamples: case kBuffer: @@ -304,19 +317,39 @@ QString NodeInput::ValueToString(const QVariant &value) const } } -QVariant NodeInput::StringToValue(const QString &string, QList& footage_connections) +QVariant NodeInput::StringToValue(const DataType& data_type, const QString &string) { - switch (data_type_) { + switch (data_type) { + case kColor: + { + Color c; + + QStringList s = string.split(','); + + int ele_count = qMin(kRGBAChannels, s.size()); + + for (int i=0;i& footage_connections) +{ + if (data_type_ == NodeParam::kFootage) { + footage_connections.append({this, string.toULongLong()}); + } + + return StringToValue(data_type_, string); +} + NodeOutput *NodeInput::get_connected_output() const { if (!edges_.isEmpty()) { @@ -962,6 +995,15 @@ QVector NodeInput::split_normal_value_into_track_values(const QVariant vals.replace(3, vec.w()); break; } + case kColor: + { + Color c = value.value(); + vals.replace(0, c.red()); + vals.replace(1, c.green()); + vals.replace(2, c.blue()); + vals.replace(3, c.alpha()); + break; + } default: vals.replace(0, value); } @@ -990,6 +1032,13 @@ QVariant NodeInput::combine_track_values_into_normal_value(const QVector& split) const; + static QString ValueToString(const DataType& data_type, const QVariant& value); + + static QVariant StringToValue(const DataType &data_type, const QString &string); + signals: void ValueChanged(const rational& start, const rational& end);