ShaderNode: Add PositionOutputValue

This commit is contained in:
Jérôme Leclercq 2020-07-22 14:47:00 +02:00
parent 5a350ee76b
commit 471194ec16
4 changed files with 126 additions and 0 deletions

View File

@ -0,0 +1,84 @@
#include <ShaderNode/DataModels/PositionOutputValue.hpp>
#include <Nazara/Renderer/ShaderBuilder.hpp>
#include <ShaderNode/ShaderGraph.hpp>
#include <ShaderNode/DataTypes/BoolData.hpp>
#include <ShaderNode/DataTypes/FloatData.hpp>
#include <ShaderNode/DataTypes/Matrix4Data.hpp>
#include <ShaderNode/DataTypes/VecData.hpp>
#include <QtWidgets/QComboBox>
#include <QtWidgets/QFormLayout>
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<QtNodes::NodeData> PositionOutputValue::outData(QtNodes::PortIndex /*port*/)
{
return {};
}
void PositionOutputValue::setInData(std::shared_ptr<QtNodes::NodeData> value, int index)
{
assert(index == 0);
if (value)
{
assert(dynamic_cast<VecData*>(value.get()) != nullptr);
m_input = std::static_pointer_cast<VecData>(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();
}

View File

@ -0,0 +1,39 @@
#pragma once
#ifndef NAZARA_SHADERNODES_POSITIONOUTPUTVALUE_HPP
#define NAZARA_SHADERNODES_POSITIONOUTPUTVALUE_HPP
#include <ShaderNode/ShaderGraph.hpp>
#include <ShaderNode/DataModels/ShaderNode.hpp>
#include <ShaderNode/DataTypes/VecData.hpp>
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<QtNodes::NodeData> outData(QtNodes::PortIndex port) override;
void setInData(std::shared_ptr<QtNodes::NodeData> value, int index) override;
QtNodes::NodeValidationState validationState() const override;
QString validationMessage() const override;
private:
std::shared_ptr<VecData> m_input;
};
#include <ShaderNode/DataModels/OutputValue.inl>
#endif

View File

@ -0,0 +1 @@
#include <ShaderNode/DataModels/OutputValue.hpp>

View File

@ -10,6 +10,7 @@
#include <ShaderNode/DataModels/TextureValue.hpp>
#include <ShaderNode/DataModels/Mat4BinOp.hpp>
#include <ShaderNode/DataModels/Mat4VecMul.hpp>
#include <ShaderNode/DataModels/PositionOutputValue.hpp>
#include <ShaderNode/DataModels/VecBinOp.hpp>
#include <ShaderNode/DataModels/VecDot.hpp>
#include <ShaderNode/DataModels/VecFloatMul.hpp>
@ -657,6 +658,7 @@ std::shared_ptr<QtNodes::DataModelRegistry> ShaderGraph::BuildRegistry()
RegisterShaderNode<CastToVec4>(*this, registry, "Casts");
RegisterShaderNode<FloatValue>(*this, registry, "Constants");
RegisterShaderNode<InputValue>(*this, registry, "Inputs");
RegisterShaderNode<PositionOutputValue>(*this, registry, "Outputs");
RegisterShaderNode<OutputValue>(*this, registry, "Outputs");
RegisterShaderNode<SampleTexture>(*this, registry, "Texture");
RegisterShaderNode<TextureValue>(*this, registry, "Texture");