diff --git a/src/ShaderNode/DataModels/PositionOutputValue.cpp b/src/ShaderNode/DataModels/PositionOutputValue.cpp new file mode 100644 index 000000000..ee1be66a2 --- /dev/null +++ b/src/ShaderNode/DataModels/PositionOutputValue.cpp @@ -0,0 +1,84 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include + +PositionOutputValue::PositionOutputValue(ShaderGraph& graph) : +ShaderNode(graph) +{ + DisableCustomVariableName(); +} + +Nz::ShaderNodes::ExpressionPtr PositionOutputValue::GetExpression(Nz::ShaderNodes::ExpressionPtr* expressions, std::size_t count) const +{ + using namespace Nz::ShaderBuilder; + using namespace Nz::ShaderNodes; + + assert(count == 1); + + auto output = Nz::ShaderBuilder::Identifier(Nz::ShaderBuilder::Builtin(BuiltinEntry::VertexPosition)); + return Nz::ShaderBuilder::Assign(std::move(output), *expressions); +} + +QtNodes::NodeDataType PositionOutputValue::dataType(QtNodes::PortType portType, QtNodes::PortIndex portIndex) const +{ + assert(portType == QtNodes::PortType::In); + assert(portIndex == 0); + + return VecData::Type(); +} + +unsigned int PositionOutputValue::nPorts(QtNodes::PortType portType) const +{ + switch (portType) + { + case QtNodes::PortType::In: return 1; + case QtNodes::PortType::Out: return 0; + } + + return 0; +} + +std::shared_ptr PositionOutputValue::outData(QtNodes::PortIndex /*port*/) +{ + return {}; +} + +void PositionOutputValue::setInData(std::shared_ptr value, int index) +{ + assert(index == 0); + if (value) + { + assert(dynamic_cast(value.get()) != nullptr); + m_input = std::static_pointer_cast(value); + } + else + m_input.reset(); +} + +QtNodes::NodeValidationState PositionOutputValue::validationState() const +{ + if (!m_input) + return QtNodes::NodeValidationState::Error; + + if (m_input->componentCount != 4) + return QtNodes::NodeValidationState::Error; + + return QtNodes::NodeValidationState::Valid; +} + +QString PositionOutputValue::validationMessage() const +{ + if (!m_input) + return "Missing input"; + + if (m_input->componentCount != 4) + return QString("Expected vector with 4 components, got ") + QString::number(m_input->componentCount); + + return QString(); +} diff --git a/src/ShaderNode/DataModels/PositionOutputValue.hpp b/src/ShaderNode/DataModels/PositionOutputValue.hpp new file mode 100644 index 000000000..2c2b6eb54 --- /dev/null +++ b/src/ShaderNode/DataModels/PositionOutputValue.hpp @@ -0,0 +1,39 @@ +#pragma once + +#ifndef NAZARA_SHADERNODES_POSITIONOUTPUTVALUE_HPP +#define NAZARA_SHADERNODES_POSITIONOUTPUTVALUE_HPP + +#include +#include +#include + +class QFormLayout; + +class PositionOutputValue : public ShaderNode +{ + public: + PositionOutputValue(ShaderGraph& graph); + + Nz::ShaderNodes::ExpressionPtr GetExpression(Nz::ShaderNodes::ExpressionPtr* expressions, std::size_t count) const override; + + QString caption() const override { return "PositionOutputValue"; } + QString name() const override { return "PositionOutputValue"; } + + 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 setInData(std::shared_ptr value, int index) override; + + QtNodes::NodeValidationState validationState() const override; + QString validationMessage() const override; + + private: + std::shared_ptr m_input; +}; + +#include + +#endif diff --git a/src/ShaderNode/DataModels/PositionOutputValue.inl b/src/ShaderNode/DataModels/PositionOutputValue.inl new file mode 100644 index 000000000..585e40a7f --- /dev/null +++ b/src/ShaderNode/DataModels/PositionOutputValue.inl @@ -0,0 +1 @@ +#include diff --git a/src/ShaderNode/ShaderGraph.cpp b/src/ShaderNode/ShaderGraph.cpp index 5b248bfc3..afa53d2f3 100644 --- a/src/ShaderNode/ShaderGraph.cpp +++ b/src/ShaderNode/ShaderGraph.cpp @@ -10,6 +10,7 @@ #include #include #include +#include #include #include #include @@ -657,6 +658,7 @@ std::shared_ptr ShaderGraph::BuildRegistry() RegisterShaderNode(*this, registry, "Casts"); RegisterShaderNode(*this, registry, "Constants"); RegisterShaderNode(*this, registry, "Inputs"); + RegisterShaderNode(*this, registry, "Outputs"); RegisterShaderNode(*this, registry, "Outputs"); RegisterShaderNode(*this, registry, "Texture"); RegisterShaderNode(*this, registry, "Texture");