ShaderNode: Handle vector component count at runtime
This commit is contained in:
1
src/ShaderNode/DataTypes/FloatData.cpp
Normal file
1
src/ShaderNode/DataTypes/FloatData.cpp
Normal file
@@ -0,0 +1 @@
|
||||
#include <ShaderNode/DataTypes/VecData.hpp>
|
||||
28
src/ShaderNode/DataTypes/FloatData.hpp
Normal file
28
src/ShaderNode/DataTypes/FloatData.hpp
Normal 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
|
||||
7
src/ShaderNode/DataTypes/FloatData.inl
Normal file
7
src/ShaderNode/DataTypes/FloatData.inl
Normal 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));
|
||||
}
|
||||
@@ -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");
|
||||
}
|
||||
|
||||
@@ -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<>
|
||||
|
||||
@@ -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" };
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user