diff --git a/src/ShaderNode/DataModels/FloatValue.cpp b/src/ShaderNode/DataModels/FloatValue.cpp new file mode 100644 index 000000000..23d5a30d3 --- /dev/null +++ b/src/ShaderNode/DataModels/FloatValue.cpp @@ -0,0 +1,106 @@ +#include +#include +#include +#include + +FloatValue::FloatValue(ShaderGraph& graph) : +ShaderNode(graph), +m_value(1.f) +{ + UpdatePreview(); +} + +QString FloatValue::caption() const +{ + static QString caption = "Float constant"; + return caption; +} + +QString FloatValue::name() const +{ + static QString name = "float_constant"; + return name; +} + +QtNodes::NodeDataType FloatValue::dataType(QtNodes::PortType portType, QtNodes::PortIndex portIndex) const +{ + assert(portType == QtNodes::PortType::Out); + assert(portIndex == 0); + + return FloatData::Type(); +} + +unsigned int FloatValue::nPorts(QtNodes::PortType portType) const +{ + switch (portType) + { + case QtNodes::PortType::In: return 0; + case QtNodes::PortType::Out: return 1; + } + + return 0; +} + +std::shared_ptr FloatValue::outData(QtNodes::PortIndex port) +{ + assert(port == 0); + + auto out = std::make_shared(); + out->preview.fill(ToColor()); + + return out; +} + +void FloatValue::BuildNodeEdition(QFormLayout* layout) +{ + ShaderNode::BuildNodeEdition(layout); + + QDoubleSpinBox* spinbox = new QDoubleSpinBox; + spinbox->setDecimals(6); + spinbox->setValue(m_value); + + connect(spinbox, qOverload(&QDoubleSpinBox::valueChanged), [=](double) + { + m_value = spinbox->value(); + Q_EMIT dataUpdated(0); + + UpdatePreview(); + }); + + layout->addRow(tr("Value"), spinbox); +} + +Nz::ShaderAst::ExpressionPtr FloatValue::GetExpression(Nz::ShaderAst::ExpressionPtr* /*expressions*/, std::size_t count) const +{ + assert(count == 0); + + return Nz::ShaderBuilder::Constant(m_value); +} + +bool FloatValue::ComputePreview(QPixmap& pixmap) +{ + pixmap.fill(ToColor()); + return true; +} + +QColor FloatValue::ToColor() const +{ + float value = std::clamp(m_value, 0.f, 1.f); + + return QColor::fromRgbF(value, value, value, value); +} + +void FloatValue::restore(const QJsonObject& data) +{ + m_value = float(data["value"].toDouble(m_value)); + + ShaderNode::restore(data); +} + +QJsonObject FloatValue::save() const +{ + QJsonObject data = ShaderNode::save(); + data["value"] = m_value; + + return data; +} diff --git a/src/ShaderNode/DataModels/FloatValue.hpp b/src/ShaderNode/DataModels/FloatValue.hpp new file mode 100644 index 000000000..44244cd46 --- /dev/null +++ b/src/ShaderNode/DataModels/FloatValue.hpp @@ -0,0 +1,45 @@ +#pragma once + +#ifndef NAZARA_SHADERNODES_FLOATVALUE_HPP +#define NAZARA_SHADERNODES_FLOATVALUE_HPP + +#include +#include +#include +#include +#include +#include +#include + +class FloatValue : public ShaderNode +{ + public: + FloatValue(ShaderGraph& graph); + ~FloatValue() = default; + + QString caption() const override; + QString name() const override; + + QtNodes::NodeDataType dataType(QtNodes::PortType portType, QtNodes::PortIndex portIndex) const override; + + unsigned int nPorts(QtNodes::PortType portType) const override; + + std::shared_ptr outData(QtNodes::PortIndex port) override; + + void BuildNodeEdition(QFormLayout* layout) override; + + Nz::ShaderAst::ExpressionPtr GetExpression(Nz::ShaderAst::ExpressionPtr* expressions, std::size_t count) const override; + + private: + bool ComputePreview(QPixmap& pixmap) override; + QColor ToColor() const; + + void restore(const QJsonObject& data) override; + QJsonObject save() const override; + + float m_value; +}; + +#include + +#endif diff --git a/src/ShaderNode/DataModels/FloatValue.inl b/src/ShaderNode/DataModels/FloatValue.inl new file mode 100644 index 000000000..9f520e6ba --- /dev/null +++ b/src/ShaderNode/DataModels/FloatValue.inl @@ -0,0 +1 @@ +#include diff --git a/src/ShaderNode/DataModels/InputValue.cpp b/src/ShaderNode/DataModels/InputValue.cpp index 6defcb30f..f6b6bf2e4 100644 --- a/src/ShaderNode/DataModels/InputValue.cpp +++ b/src/ShaderNode/DataModels/InputValue.cpp @@ -127,7 +127,9 @@ auto InputValue::dataType(QtNodes::PortType portType, QtNodes::PortIndex portInd switch (inputEntry.type) { //case InputType::Bool: return Nz::ShaderAst::ExpressionType::Boolean; - //case InputType::Float1: return Nz::ShaderAst::ExpressionType::Float1; + case InOutType::Float1: + return FloatData::Type(); + case InOutType::Float2: case InOutType::Float3: case InOutType::Float4: diff --git a/src/ShaderNode/ShaderGraph.cpp b/src/ShaderNode/ShaderGraph.cpp index 63a29a6a0..fd530e504 100644 --- a/src/ShaderNode/ShaderGraph.cpp +++ b/src/ShaderNode/ShaderGraph.cpp @@ -262,6 +262,7 @@ std::shared_ptr ShaderGraph::BuildRegistry() RegisterShaderNode(*this, registry, "Casts"); RegisterShaderNode(*this, registry, "Casts"); RegisterShaderNode(*this, registry, "Casts"); + RegisterShaderNode(*this, registry, "Constants"); RegisterShaderNode(*this, registry, "Inputs"); RegisterShaderNode(*this, registry, "Outputs"); RegisterShaderNode(*this, registry, "Texture");