diff --git a/include/Nazara/Renderer/ShaderAst.hpp b/include/Nazara/Renderer/ShaderAst.hpp index eb556ab55..52ad7eb5d 100644 --- a/include/Nazara/Renderer/ShaderAst.hpp +++ b/include/Nazara/Renderer/ShaderAst.hpp @@ -229,7 +229,11 @@ namespace Nz class NAZARA_RENDERER_API Constant : public Expression { public: + inline explicit Constant(bool value); inline explicit Constant(float value); + inline explicit Constant(const Vector2f& value); + inline explicit Constant(const Vector3f& value); + inline explicit Constant(const Vector4f& value); ExpressionType GetExpressionType() const override; void Register(ShaderWriter& visitor) override; @@ -239,10 +243,11 @@ namespace Nz union { + bool bool1; float vec1; - Nz::Vector2f vec2; - Nz::Vector3f vec3; - Nz::Vector4f vec4; + Vector2f vec2; + Vector3f vec3; + Vector4f vec4; } values; }; } diff --git a/include/Nazara/Renderer/ShaderAst.inl b/include/Nazara/Renderer/ShaderAst.inl index 398956187..a334a1bd1 100644 --- a/include/Nazara/Renderer/ShaderAst.inl +++ b/include/Nazara/Renderer/ShaderAst.inl @@ -157,11 +157,35 @@ namespace Nz throw std::runtime_error("Component count doesn't match required component count"); } + inline Constant::Constant(bool value) : + exprType(ExpressionType::Boolean) + { + values.bool1 = value; + } + inline Constant::Constant(float value) : exprType(ExpressionType::Float1) { values.vec1 = value; } + + inline Constant::Constant(const Vector2f& value) : + exprType(ExpressionType::Float2) + { + values.vec2 = value; + } + + inline Constant::Constant(const Vector3f& value) : + exprType(ExpressionType::Float3) + { + values.vec3 = value; + } + + inline Constant::Constant(const Vector4f& value) : + exprType(ExpressionType::Float4) + { + values.vec4 = value; + } } } diff --git a/src/Nazara/Renderer/GlslWriter.cpp b/src/Nazara/Renderer/GlslWriter.cpp index 9edaeeb0d..74ccd7728 100644 --- a/src/Nazara/Renderer/GlslWriter.cpp +++ b/src/Nazara/Renderer/GlslWriter.cpp @@ -224,10 +224,28 @@ namespace Nz { switch (node.exprType) { + case ShaderAst::ExpressionType::Boolean: + Append((node.values.bool1) ? "true" : "false"); + break; + case ShaderAst::ExpressionType::Float1: Append(String::Format("%F", node.values.vec1)); break; + + case ShaderAst::ExpressionType::Float2: + Append(String::Format("vec2(%F, %F)", node.values.vec2.x, node.values.vec2.y)); + break; + + case ShaderAst::ExpressionType::Float3: + Append(String::Format("vec3(%F, %F, %F)", node.values.vec3.x, node.values.vec3.y, node.values.vec3.z)); + break; + + case ShaderAst::ExpressionType::Float4: + Append(String::Format("vec4(%F, %F, %F, %F)", node.values.vec4.x, node.values.vec4.y, node.values.vec4.z, node.values.vec4.w)); + break; } + + throw std::runtime_error("Unhandled expression type"); } void GlslWriter::Write(const ShaderAst::ExpressionStatement& node)