Add shadernode (big WIP)
This commit is contained in:
44
src/ShaderNode/DataModels/FragmentOutput.cpp
Normal file
44
src/ShaderNode/DataModels/FragmentOutput.cpp
Normal file
@@ -0,0 +1,44 @@
|
||||
#include <DataModels/FragmentOutput.hpp>
|
||||
#include <Nazara/Renderer/ShaderBuilder.hpp>
|
||||
#include <DataModels/VecValue.hpp>
|
||||
|
||||
Nz::ShaderAst::ExpressionPtr FragmentOutput::GetExpression(Nz::ShaderAst::ExpressionPtr* expressions, std::size_t count) const
|
||||
{
|
||||
using namespace Nz::ShaderAst;
|
||||
using namespace Nz::ShaderBuilder;
|
||||
|
||||
assert(count == 1);
|
||||
|
||||
auto output = Nz::ShaderBuilder::Output("RenderTarget0", ExpressionType::Float4);
|
||||
|
||||
return Nz::ShaderBuilder::Assign(output, *expressions);
|
||||
}
|
||||
|
||||
QtNodes::NodeDataType FragmentOutput::dataType(QtNodes::PortType portType, QtNodes::PortIndex portIndex) const
|
||||
{
|
||||
assert(portType == QtNodes::PortType::In);
|
||||
assert(portIndex == 0);
|
||||
|
||||
return Vec4Data::Type();
|
||||
}
|
||||
|
||||
QWidget* FragmentOutput::embeddedWidget()
|
||||
{
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
unsigned int FragmentOutput::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> FragmentOutput::outData(QtNodes::PortIndex /*port*/)
|
||||
{
|
||||
return {};
|
||||
}
|
||||
31
src/ShaderNode/DataModels/FragmentOutput.hpp
Normal file
31
src/ShaderNode/DataModels/FragmentOutput.hpp
Normal file
@@ -0,0 +1,31 @@
|
||||
#pragma once
|
||||
|
||||
#ifndef NAZARA_SHADERNODES_FRAGMENTOUTPUT_HPP
|
||||
#define NAZARA_SHADERNODES_FRAGMENTOUTPUT_HPP
|
||||
|
||||
#include <DataModels/ShaderNode.hpp>
|
||||
#include <QtWidgets/QDoubleSpinBox>
|
||||
#include <QtWidgets/QFormLayout>
|
||||
|
||||
class FragmentOutput : public ShaderNode
|
||||
{
|
||||
public:
|
||||
Nz::ShaderAst::ExpressionPtr GetExpression(Nz::ShaderAst::ExpressionPtr* expressions, std::size_t count) const override;
|
||||
|
||||
QString caption() const override { return "Fragment shader output"; }
|
||||
QString name() const override { return "FragmentShaderOutput"; }
|
||||
|
||||
QtNodes::NodeDataType dataType(QtNodes::PortType portType, QtNodes::PortIndex portIndex) const override;
|
||||
|
||||
QWidget* embeddedWidget() 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>, int) override {};
|
||||
|
||||
};
|
||||
|
||||
#include <DataModels/FragmentOutput.inl>
|
||||
|
||||
#endif
|
||||
1
src/ShaderNode/DataModels/FragmentOutput.inl
Normal file
1
src/ShaderNode/DataModels/FragmentOutput.inl
Normal file
@@ -0,0 +1 @@
|
||||
#include <DataModels/FragmentOutput.hpp>
|
||||
1
src/ShaderNode/DataModels/ShaderNode.cpp
Normal file
1
src/ShaderNode/DataModels/ShaderNode.cpp
Normal file
@@ -0,0 +1 @@
|
||||
#include <DataModels/ShaderNode.hpp>
|
||||
17
src/ShaderNode/DataModels/ShaderNode.hpp
Normal file
17
src/ShaderNode/DataModels/ShaderNode.hpp
Normal file
@@ -0,0 +1,17 @@
|
||||
#pragma once
|
||||
|
||||
#ifndef NAZARA_SHADERNODES_SHADERNODE_HPP
|
||||
#define NAZARA_SHADERNODES_SHADERNODE_HPP
|
||||
|
||||
#include <Nazara/Renderer/ShaderAst.hpp>
|
||||
#include <nodes/NodeDataModel>
|
||||
|
||||
class ShaderNode : public QtNodes::NodeDataModel
|
||||
{
|
||||
public:
|
||||
virtual Nz::ShaderAst::ExpressionPtr GetExpression(Nz::ShaderAst::ExpressionPtr* expressions, std::size_t count) const = 0;
|
||||
};
|
||||
|
||||
#include <DataModels/ShaderNode.inl>
|
||||
|
||||
#endif
|
||||
1
src/ShaderNode/DataModels/ShaderNode.inl
Normal file
1
src/ShaderNode/DataModels/ShaderNode.inl
Normal file
@@ -0,0 +1 @@
|
||||
#include <DataModels/ShaderNode.hpp>
|
||||
34
src/ShaderNode/DataModels/VecValue.cpp
Normal file
34
src/ShaderNode/DataModels/VecValue.cpp
Normal file
@@ -0,0 +1,34 @@
|
||||
#include <DataModels/VecValue.hpp>
|
||||
#include <Nazara/Renderer/ShaderBuilder.hpp>
|
||||
|
||||
Nz::ShaderAst::ExpressionPtr Vec4Value::GetExpression(Nz::ShaderAst::ExpressionPtr* /*expressions*/, std::size_t count) const
|
||||
{
|
||||
assert(count == 0);
|
||||
|
||||
return Nz::ShaderBuilder::Constant(GetValue());
|
||||
}
|
||||
|
||||
auto Vec4Value::dataType(QtNodes::PortType portType, QtNodes::PortIndex portIndex) const -> QtNodes::NodeDataType
|
||||
{
|
||||
assert(portType == QtNodes::PortType::Out);
|
||||
assert(portIndex == 0);
|
||||
|
||||
return Vec4Data::Type();
|
||||
}
|
||||
|
||||
std::shared_ptr<QtNodes::NodeData> Vec4Value::outData(QtNodes::PortIndex port)
|
||||
{
|
||||
assert(port == 0);
|
||||
|
||||
return std::make_shared<Vec4Data>(GetValue());
|
||||
}
|
||||
|
||||
Nz::Vector4f Vec4Value::GetValue() const
|
||||
{
|
||||
float x = float(m_values[0]->value());
|
||||
float y = float(m_values[1]->value());
|
||||
float z = float(m_values[2]->value());
|
||||
float w = float(m_values[3]->value());
|
||||
|
||||
return Nz::Vector4f(x, y, z, w);
|
||||
}
|
||||
66
src/ShaderNode/DataModels/VecValue.hpp
Normal file
66
src/ShaderNode/DataModels/VecValue.hpp
Normal file
@@ -0,0 +1,66 @@
|
||||
#pragma once
|
||||
|
||||
#ifndef NAZARA_SHADERNODES_VECVALUE_HPP
|
||||
#define NAZARA_SHADERNODES_VECVALUE_HPP
|
||||
|
||||
#include <QtWidgets/QDoubleSpinBox>
|
||||
#include <QtWidgets/QFormLayout>
|
||||
#include <DataModels/ShaderNode.hpp>
|
||||
#include <array>
|
||||
|
||||
template<std::size_t N>
|
||||
class VecValue : public ShaderNode
|
||||
{
|
||||
public:
|
||||
VecValue();
|
||||
~VecValue() = default;
|
||||
|
||||
QWidget* embeddedWidget() override;
|
||||
unsigned int nPorts(QtNodes::PortType portType) const override;
|
||||
|
||||
protected:
|
||||
QWidget* m_widget;
|
||||
QFormLayout* m_layout;
|
||||
std::array<QDoubleSpinBox*, N> m_values;
|
||||
};
|
||||
|
||||
class Vec4Data : public QtNodes::NodeData
|
||||
{
|
||||
public:
|
||||
inline Vec4Data(const Nz::Vector4f& vec);
|
||||
|
||||
QtNodes::NodeDataType type() const override
|
||||
{
|
||||
return Type();
|
||||
}
|
||||
|
||||
static QtNodes::NodeDataType Type()
|
||||
{
|
||||
return { "vec4", "Vec4" };
|
||||
}
|
||||
|
||||
Nz::Vector4f value;
|
||||
};
|
||||
|
||||
class Vec4Value : public VecValue<4>
|
||||
{
|
||||
public:
|
||||
Nz::ShaderAst::ExpressionPtr GetExpression(Nz::ShaderAst::ExpressionPtr* expressions, std::size_t count) const override;
|
||||
|
||||
QString caption() const override { return "Vec4 value"; }
|
||||
bool captionVisible() const override { return true; }
|
||||
QString name() const override { return "Vec4Value"; }
|
||||
|
||||
QtNodes::NodeDataType dataType(QtNodes::PortType portType, QtNodes::PortIndex portIndex) const override;
|
||||
|
||||
std::shared_ptr<QtNodes::NodeData> outData(QtNodes::PortIndex port) override;
|
||||
|
||||
void setInData(std::shared_ptr<QtNodes::NodeData>, int) override {};
|
||||
|
||||
private:
|
||||
Nz::Vector4f GetValue() const;
|
||||
};
|
||||
|
||||
#include <DataModels/VecValue.inl>
|
||||
|
||||
#endif
|
||||
44
src/ShaderNode/DataModels/VecValue.inl
Normal file
44
src/ShaderNode/DataModels/VecValue.inl
Normal file
@@ -0,0 +1,44 @@
|
||||
#include <DataModels/VecValue.hpp>
|
||||
#include <array>
|
||||
|
||||
template<std::size_t N>
|
||||
VecValue<N>::VecValue()
|
||||
{
|
||||
constexpr std::array<char, 4> componentName = { 'X', 'Y', 'Z', 'W' };
|
||||
static_assert(N <= componentName.size());
|
||||
|
||||
m_layout = new QFormLayout;
|
||||
for (std::size_t i = 0; i < N; ++i)
|
||||
{
|
||||
m_values[i] = new QDoubleSpinBox;
|
||||
m_values[i]->setStyleSheet("background-color: rgba(255,255,255,255)");
|
||||
m_layout->addRow(QString::fromUtf8(&componentName[i], 1), m_values[i]);
|
||||
}
|
||||
|
||||
m_widget = new QWidget;
|
||||
m_widget->setStyleSheet("background-color: rgba(0,0,0,0)");
|
||||
m_widget->setLayout(m_layout);
|
||||
}
|
||||
|
||||
template<std::size_t N>
|
||||
QWidget* VecValue<N>::embeddedWidget()
|
||||
{
|
||||
return m_widget;
|
||||
}
|
||||
|
||||
template<std::size_t N>
|
||||
unsigned int VecValue<N>::nPorts(QtNodes::PortType portType) const
|
||||
{
|
||||
switch (portType)
|
||||
{
|
||||
case QtNodes::PortType::In: return 0;
|
||||
case QtNodes::PortType::Out: return 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
Vec4Data::Vec4Data(const Nz::Vector4f& vec) :
|
||||
value(vec)
|
||||
{
|
||||
}
|
||||
Reference in New Issue
Block a user