From 25562a5856315a70fe5ceab57065a6d1ff108bfc Mon Sep 17 00:00:00 2001 From: Lynix Date: Thu, 4 Jun 2020 18:29:50 +0200 Subject: [PATCH] Renderer/ShaderAst: Add BinaryFunc --- include/Nazara/Renderer/GlslWriter.hpp | 1 + include/Nazara/Renderer/ShaderAst.hpp | 25 +++++++++++++++++++++++- include/Nazara/Renderer/ShaderAst.inl | 23 ++++++++++++++++++++++ src/Nazara/Renderer/ShaderAst.cpp | 27 ++++++++++++++++++++++++++ 4 files changed, 75 insertions(+), 1 deletion(-) diff --git a/include/Nazara/Renderer/GlslWriter.hpp b/include/Nazara/Renderer/GlslWriter.hpp index 13d7c8459..373a9950e 100644 --- a/include/Nazara/Renderer/GlslWriter.hpp +++ b/include/Nazara/Renderer/GlslWriter.hpp @@ -33,6 +33,7 @@ namespace Nz void Write(const ShaderAst::AssignOp& node) override; void Write(const ShaderAst::Branch& node) override; + void Write(const ShaderAst::BinaryFunc& node) override; void Write(const ShaderAst::BinaryOp& node) override; void Write(const ShaderAst::BuiltinVariable& node) override; void Write(const ShaderAst::Cast& node) override; diff --git a/include/Nazara/Renderer/ShaderAst.hpp b/include/Nazara/Renderer/ShaderAst.hpp index 08e8e20b2..6dd43ea89 100644 --- a/include/Nazara/Renderer/ShaderAst.hpp +++ b/include/Nazara/Renderer/ShaderAst.hpp @@ -26,13 +26,20 @@ namespace Nz Simple //< = }; + enum class BinaryIntrinsic + { + CrossProduct, + DotProduct + }; + enum class BinaryType { Add, //< + Substract, //< - Multiply, //< * Divide, //< / - Equality //< == + + Equality //< == }; enum class BuiltinEntry @@ -325,6 +332,22 @@ namespace Nz ExpressionPtr sampler; ExpressionPtr coordinates; }; + + ////////////////////////////////////////////////////////////////////////// + + class NAZARA_RENDERER_API BinaryFunc : public Expression + { + public: + inline BinaryFunc(BinaryIntrinsic Op, ExpressionPtr Left, ExpressionPtr Right); + + ExpressionType GetExpressionType() const override; + void Register(ShaderWriter& visitor) override; + void Visit(ShaderWriter& visitor) override; + + BinaryIntrinsic intrinsic; + ExpressionPtr left; + ExpressionPtr right; + }; } } diff --git a/include/Nazara/Renderer/ShaderAst.inl b/include/Nazara/Renderer/ShaderAst.inl index e837cbdb4..958baecfe 100644 --- a/include/Nazara/Renderer/ShaderAst.inl +++ b/include/Nazara/Renderer/ShaderAst.inl @@ -243,6 +243,29 @@ namespace Nz if (coordinates->GetExpressionType() != ExpressionType::Float2) throw std::runtime_error("Coordinates must be a Float2"); } + + inline BinaryFunc::BinaryFunc(BinaryIntrinsic Op, ExpressionPtr Left, ExpressionPtr Right) : + intrinsic(Op), + left(Left), + right(Right) + { + ExpressionType leftType = left->GetExpressionType(); + ExpressionType rightType = right->GetExpressionType(); + + if (leftType != rightType) + //TODO: AstParseError + throw std::runtime_error("Left expression type must match right expression type"); + + switch (intrinsic) + { + case BinaryIntrinsic::CrossProduct: + { + if (leftType != ExpressionType::Float3) + //TODO: AstParseError + throw std::runtime_error("CrossProduct only works with Float3 expressions"); + } + } + } } } diff --git a/src/Nazara/Renderer/ShaderAst.cpp b/src/Nazara/Renderer/ShaderAst.cpp index a0a0cc031..0a2373d17 100644 --- a/src/Nazara/Renderer/ShaderAst.cpp +++ b/src/Nazara/Renderer/ShaderAst.cpp @@ -254,4 +254,31 @@ namespace Nz::ShaderAst { visitor.Write(*this); } + + + ExpressionType BinaryFunc::GetExpressionType() const + { + switch (intrinsic) + { + case BinaryIntrinsic::CrossProduct: + return left->GetExpressionType(); + + case BinaryIntrinsic::DotProduct: + return ExpressionType::Float1; + } + + NazaraAssert(false, "Unhandled builtin"); + return ExpressionType::Void; + } + + void BinaryFunc::Register(ShaderWriter& visitor) + { + left->Register(visitor); + right->Register(visitor); + } + + void BinaryFunc::Visit(ShaderWriter& visitor) + { + visitor.Write(*this); + } }