ShaderNode: Handle vector component count at runtime

This commit is contained in:
Lynix
2020-05-31 18:39:28 +02:00
parent 2ecc624fe4
commit effd1b4552
28 changed files with 529 additions and 339 deletions

View File

@@ -0,0 +1 @@
#include <ShaderNode/DataTypes/VecData.hpp>

View File

@@ -0,0 +1,28 @@
#pragma once
#ifndef NAZARA_SHADERNODES_FLOATDATA_HPP
#define NAZARA_SHADERNODES_FLOATDATA_HPP
#include <nodes/NodeData>
#include <QtGui/QImage>
struct FloatData : public QtNodes::NodeData
{
inline FloatData();
QtNodes::NodeDataType type() const override
{
return Type();
}
static QtNodes::NodeDataType Type()
{
return { "float", "Float" };
}
QImage preview;
};
#include <ShaderNode/DataTypes/FloatData.inl>
#endif

View File

@@ -0,0 +1,7 @@
#include <ShaderNode/DataTypes/FloatData.hpp>
inline FloatData::FloatData() :
preview(1, 1, QImage::Format_RGBA8888)
{
preview.fill(QColor::fromRgb(255, 255, 255, 0));
}

View File

@@ -1 +1,18 @@
#include <ShaderNode/DataTypes/VecData.hpp>
#include <cassert>
#include <stdexcept>
Nz::ShaderAst::ExpressionType VecData::GetExpressionType() const
{
switch (componentCount)
{
case 2: return Nz::ShaderAst::ExpressionType::Float2;
case 3: return Nz::ShaderAst::ExpressionType::Float3;
case 4: return Nz::ShaderAst::ExpressionType::Float4;
default:
break;
}
assert(false);
throw std::runtime_error("invalid component count");
}

View File

@@ -9,59 +9,48 @@
struct VecData : public QtNodes::NodeData
{
inline VecData();
inline VecData(std::size_t componentCount);
inline QtNodes::NodeDataType type() const override;
Nz::ShaderAst::ExpressionType GetExpressionType() const;
static inline QtNodes::NodeDataType Type();
std::size_t componentCount;
QImage preview;
};
struct Vec2Data : public VecData
template<std::size_t N>
struct VecExpressionTypeHelper;
template<>
struct VecExpressionTypeHelper<1>
{
static constexpr Nz::ShaderAst::ExpressionType ExpressionType = Nz::ShaderAst::ExpressionType::Float1;
};
template<>
struct VecExpressionTypeHelper<2>
{
static constexpr std::size_t ComponentCount = 2;
static constexpr Nz::ShaderAst::ExpressionType ExpressionType = Nz::ShaderAst::ExpressionType::Float2;
QtNodes::NodeDataType type() const override
{
return Type();
}
static QtNodes::NodeDataType Type()
{
return { "vec2", "Vec2" };
}
};
struct Vec3Data : public VecData
template<>
struct VecExpressionTypeHelper<3>
{
static constexpr std::size_t ComponentCount = 3;
static constexpr Nz::ShaderAst::ExpressionType ExpressionType = Nz::ShaderAst::ExpressionType::Float3;
QtNodes::NodeDataType type() const override
{
return Type();
}
static QtNodes::NodeDataType Type()
{
return { "vec3", "Vec3" };
}
};
struct Vec4Data : public VecData
template<>
struct VecExpressionTypeHelper<4>
{
static constexpr std::size_t ComponentCount = 4;
static constexpr Nz::ShaderAst::ExpressionType ExpressionType = Nz::ShaderAst::ExpressionType::Float4;
QtNodes::NodeDataType type() const override
{
return Type();
}
static QtNodes::NodeDataType Type()
{
return { "vec4", "Vec4" };
}
};
template<std::size_t N> constexpr Nz::ShaderAst::ExpressionType VecExpressionType = VecExpressionTypeHelper<N>::template ExpressionType;
struct VecTypeDummy {};
template<std::size_t N>
@@ -76,7 +65,7 @@ struct VecTypeHelper<0>
template<>
struct VecTypeHelper<1>
{
using Type = std::array<float, 1>;
using Type = std::array<float, 1>; //< To allow [0]
};
template<>

View File

@@ -1,7 +1,18 @@
#include <ShaderNode/DataTypes/VecData.hpp>
inline VecData::VecData() :
inline VecData::VecData(std::size_t ComponentCount) :
componentCount(ComponentCount),
preview(64, 64, QImage::Format_RGBA8888)
{
preview.fill(QColor::fromRgb(255, 255, 255, 0));
}
inline QtNodes::NodeDataType VecData::type() const
{
return Type();
}
inline QtNodes::NodeDataType VecData::Type()
{
return { "vector", "Vector" };
}