diff --git a/include/Nazara/Renderer/GlslWriter.hpp b/include/Nazara/Renderer/GlslWriter.hpp index 8a06a3fbe..d4042e882 100644 --- a/include/Nazara/Renderer/GlslWriter.hpp +++ b/include/Nazara/Renderer/GlslWriter.hpp @@ -40,6 +40,7 @@ namespace Nz void Write(const ShaderAst::ExpressionStatement& node) override; void Write(const ShaderAst::NamedVariable& node) override; void Write(const ShaderAst::NodePtr& node) override; + void Write(const ShaderAst::Sample2D& node) override; void Write(const ShaderAst::StatementBlock& node) override; void Write(const ShaderAst::SwizzleOp& node) override; diff --git a/include/Nazara/Renderer/ShaderAst.hpp b/include/Nazara/Renderer/ShaderAst.hpp index 549b45194..d6cc45789 100644 --- a/include/Nazara/Renderer/ShaderAst.hpp +++ b/include/Nazara/Renderer/ShaderAst.hpp @@ -42,12 +42,13 @@ namespace Nz enum class ExpressionType { - Boolean, // bool - Float1, // float - Float2, // vec2 - Float3, // vec3 - Float4, // vec4 - Mat4x4, // mat4 + Boolean, // bool + Float1, // float + Float2, // vec2 + Float3, // vec3 + Float4, // vec4 + Mat4x4, // mat4 + Sampler2D, // sampler2D Void // void }; @@ -284,6 +285,21 @@ namespace Nz std::size_t componentCount; ExpressionPtr expression; }; + + ////////////////////////////////////////////////////////////////////////// + + class NAZARA_RENDERER_API Sample2D : public Expression + { + public: + inline Sample2D(ExpressionPtr samplerPtr, ExpressionPtr coordinatesPtr); + + ExpressionType GetExpressionType() const override; + void Register(ShaderWriter& visitor) override; + void Visit(ShaderWriter& visitor) override; + + ExpressionPtr sampler; + ExpressionPtr coordinates; + }; } } diff --git a/include/Nazara/Renderer/ShaderAst.inl b/include/Nazara/Renderer/ShaderAst.inl index 2235c9a74..cb9024b48 100644 --- a/include/Nazara/Renderer/ShaderAst.inl +++ b/include/Nazara/Renderer/ShaderAst.inl @@ -2,6 +2,7 @@ // This file is part of the "Nazara Engine - Renderer module" // For conditions of distribution and use, see copyright notice in Config.hpp +#include #include namespace Nz @@ -225,6 +226,17 @@ namespace Nz std::copy(swizzleComponents.begin(), swizzleComponents.end(), components.begin()); } + + inline Sample2D::Sample2D(ExpressionPtr samplerPtr, ExpressionPtr coordinatesPtr) : + sampler(std::move(samplerPtr)), + coordinates(std::move(coordinatesPtr)) + { + if (sampler->GetExpressionType() != ExpressionType::Sampler2D) + throw std::runtime_error("Sampler must be a Sampler2D"); + + if (coordinates->GetExpressionType() != ExpressionType::Float2) + throw std::runtime_error("Coordinates must be a Float2"); + } } } diff --git a/include/Nazara/Renderer/ShaderBuilder.hpp b/include/Nazara/Renderer/ShaderBuilder.hpp index 79512e90f..b0ba09cc4 100644 --- a/include/Nazara/Renderer/ShaderBuilder.hpp +++ b/include/Nazara/Renderer/ShaderBuilder.hpp @@ -66,6 +66,7 @@ namespace Nz { namespace ShaderBuilder constexpr BinOpBuilder Multiply; constexpr VarBuilder Output; constexpr VarBuilder Parameter; + constexpr GenBuilder Sample2D; constexpr GenBuilder Swizzle; constexpr BinOpBuilder Substract; constexpr VarBuilder Uniform; diff --git a/include/Nazara/Renderer/ShaderWriter.hpp b/include/Nazara/Renderer/ShaderWriter.hpp index f20061e05..64dddcf9f 100644 --- a/include/Nazara/Renderer/ShaderWriter.hpp +++ b/include/Nazara/Renderer/ShaderWriter.hpp @@ -41,6 +41,7 @@ namespace Nz virtual void Write(const ShaderAst::ExpressionStatement& node) = 0; virtual void Write(const ShaderAst::NamedVariable& node) = 0; virtual void Write(const ShaderAst::NodePtr& node) = 0; + virtual void Write(const ShaderAst::Sample2D& node) = 0; virtual void Write(const ShaderAst::StatementBlock& node) = 0; virtual void Write(const ShaderAst::SwizzleOp& node) = 0; diff --git a/src/Nazara/Renderer/GlslWriter.cpp b/src/Nazara/Renderer/GlslWriter.cpp index 1c0752b85..badf3648f 100644 --- a/src/Nazara/Renderer/GlslWriter.cpp +++ b/src/Nazara/Renderer/GlslWriter.cpp @@ -128,6 +128,15 @@ namespace Nz node->Visit(*this); } + void GlslWriter::Write(const ShaderAst::Sample2D& node) + { + Append("texture("); + Write(node.sampler); + Append(", "); + Write(node.coordinates); + Append(")"); + } + void GlslWriter::Write(const ShaderAst::AssignOp& node) { Write(node.variable); @@ -338,6 +347,9 @@ namespace Nz case ShaderAst::ExpressionType::Mat4x4: Append("mat4"); break; + case ShaderAst::ExpressionType::Sampler2D: + Append("sampler2D"); + break; case ShaderAst::ExpressionType::Void: Append("void"); break; diff --git a/src/Nazara/Renderer/ShaderAst.cpp b/src/Nazara/Renderer/ShaderAst.cpp index 180930595..d45c8b739 100644 --- a/src/Nazara/Renderer/ShaderAst.cpp +++ b/src/Nazara/Renderer/ShaderAst.cpp @@ -6,7 +6,7 @@ #include #include -namespace Nz { namespace ShaderAst +namespace Nz::ShaderAst { void ExpressionStatement::Register(ShaderWriter& visitor) { @@ -192,5 +192,21 @@ namespace Nz { namespace ShaderAst { visitor.Write(*this); } -} + + + ExpressionType Sample2D::GetExpressionType() const + { + return ExpressionType::Float4; + } + + void Sample2D::Register(ShaderWriter& visitor) + { + sampler->Register(visitor); + coordinates->Register(visitor); + } + + void Sample2D::Visit(ShaderWriter& visitor) + { + visitor.Write(*this); + } }