#include #include #include #include #include #include #include #include #include PositionOutputValue::PositionOutputValue(ShaderGraph& graph) : ShaderNode(graph) { DisableCustomVariableName(); } Nz::ShaderAst::NodePtr PositionOutputValue::BuildNode(Nz::ShaderAst::ExpressionPtr* expressions, std::size_t count, std::size_t outputIndex) const { using namespace Nz; assert(count == 1); assert(outputIndex == 0); auto output = Nz::ShaderBuilder::AccessMember(Nz::ShaderBuilder::Identifier("OutputData"), { "position" }); return ShaderBuilder::Assign(ShaderAst::AssignType::Simple, std::move(output), std::move(expressions[0])); } 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 && value->type().id == VecData::Type().id) { 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(); }