diff --git a/include/Nazara/Renderer/ShaderBuilder.hpp b/include/Nazara/Renderer/ShaderBuilder.hpp index 18bb3244e..5bf2dcaff 100644 --- a/include/Nazara/Renderer/ShaderBuilder.hpp +++ b/include/Nazara/Renderer/ShaderBuilder.hpp @@ -13,79 +13,46 @@ namespace Nz { namespace ShaderBuilder { + template + struct AssignOpBuilder + { + std::shared_ptr operator()(const ShaderAst::VariablePtr& left, const ShaderAst::ExpressionPtr& right) const; + }; + + template + struct BinOpBuilder + { + std::shared_ptr operator()(const ShaderAst::ExpressionPtr& left, const ShaderAst::ExpressionPtr& right) const; + }; + + struct BuiltinBuilder + { + std::shared_ptr operator()(ShaderAst::Builtin builtin) const; + }; + template - class GenBuilder + struct GenBuilder { - public: - template - std::shared_ptr operator()(Args&&... args) const - { - return std::make_shared(std::forward(args)...); - } + template std::shared_ptr operator()(Args&&... args) const; }; - template - class AssignOpBuilder + template + struct VarBuilder { - public: - std::shared_ptr operator()(const Nz::ShaderAst::VariablePtr& left, const Nz::ShaderAst::ExpressionPtr& right) const - { - return std::make_shared(op, left, right); - } + template std::shared_ptr operator()(Args&&... args) const; }; - template - class BinOpBuilder - { - public: - std::shared_ptr operator()(const Nz::ShaderAst::ExpressionPtr& left, const Nz::ShaderAst::ExpressionPtr& right) const - { - return std::make_shared(op, left, right); - } - }; - - class BuiltinBuilder - { - public: - std::shared_ptr operator()(Nz::ShaderAst::Builtin builtin) const - { - ShaderAst::ExpressionType exprType = ShaderAst::ExpressionType::None; - - switch (builtin) - { - case ShaderAst::Builtin::VertexPosition: - exprType = ShaderAst::ExpressionType::Float4; - break; - } - - NazaraAssert(exprType != ShaderAst::ExpressionType::None, "Unhandled builtin"); - - return std::make_shared(builtin, exprType); - } - }; - - template - class VarBuilder - { - public: - template - std::shared_ptr operator()(Args&&... args) const - { - return std::make_shared(type, std::forward(args)...); - } - }; - - constexpr BinOpBuilder Add; - constexpr AssignOpBuilder Assign; + constexpr BinOpBuilder Add; + constexpr AssignOpBuilder Assign; constexpr BuiltinBuilder Builtin; - constexpr BinOpBuilder Equal; - constexpr GenBuilder Block; - constexpr GenBuilder Branch; - constexpr GenBuilder Constant; - constexpr GenBuilder ExprStatement; - constexpr VarBuilder Parameter; - constexpr VarBuilder Uniform; - constexpr VarBuilder Variable; + constexpr BinOpBuilder Equal; + constexpr GenBuilder Block; + constexpr GenBuilder Branch; + constexpr GenBuilder Constant; + constexpr GenBuilder ExprStatement; + constexpr VarBuilder Parameter; + constexpr VarBuilder Uniform; + constexpr VarBuilder Variable; } } #include diff --git a/include/Nazara/Renderer/ShaderBuilder.inl b/include/Nazara/Renderer/ShaderBuilder.inl index 94ab292ec..c64da3a82 100644 --- a/include/Nazara/Renderer/ShaderBuilder.inl +++ b/include/Nazara/Renderer/ShaderBuilder.inl @@ -5,11 +5,49 @@ #include #include -namespace Nz +namespace Nz { namespace ShaderBuilder { - namespace ShaderAst + template + template + std::shared_ptr GenBuilder::operator()(Args&&... args) const { + return std::make_shared(std::forward(args)...); } -} + + template + std::shared_ptr AssignOpBuilder::operator()(const ShaderAst::VariablePtr& left, const ShaderAst::ExpressionPtr& right) const + { + return std::make_shared(op, left, right); + } + + template + std::shared_ptr BinOpBuilder::operator()(const ShaderAst::ExpressionPtr& left, const ShaderAst::ExpressionPtr& right) const + { + return std::make_shared(op, left, right); + } + + std::shared_ptr BuiltinBuilder::operator()(ShaderAst::Builtin builtin) const + { + ShaderAst::ExpressionType exprType = ShaderAst::ExpressionType::None; + + switch (builtin) + { + case ShaderAst::Builtin::VertexPosition: + exprType = ShaderAst::ExpressionType::Float4; + break; + } + + NazaraAssert(exprType != ShaderAst::ExpressionType::None, "Unhandled builtin"); + + return std::make_shared(builtin, exprType); + } + + template + template + std::shared_ptr VarBuilder::operator()(Args&&... args) const + { + return std::make_shared(type, std::forward(args)...); + } +} } #include