From cb69b1ed017dc6f991443fc0cd1b42ce4b9dbe37 Mon Sep 17 00:00:00 2001 From: Lynix Date: Sat, 21 Jan 2017 15:53:18 +0100 Subject: [PATCH] Renderer/ShaderAst: Add ConditionalStatement --- include/Nazara/Renderer/ShaderAst.inl | 6 ++++++ include/Nazara/Renderer/ShaderBuilder.hpp | 1 + include/Nazara/Renderer/ShaderWriter.hpp | 9 +++++++++ src/Nazara/Renderer/ShaderAst.cpp | 13 +++++++++++++ src/Nazara/Renderer/ShaderWriter.cpp | 13 +++++++++++++ 5 files changed, 42 insertions(+) diff --git a/include/Nazara/Renderer/ShaderAst.inl b/include/Nazara/Renderer/ShaderAst.inl index b23078f0a..b03045386 100644 --- a/include/Nazara/Renderer/ShaderAst.inl +++ b/include/Nazara/Renderer/ShaderAst.inl @@ -53,6 +53,12 @@ namespace Nz { } + inline ConditionalStatement::ConditionalStatement(const String& condition, StatementPtr statementPtr) : + conditionName(condition), + statement(std::move(statementPtr)) + { + } + template StatementBlock::StatementBlock(Args&& ...args) : statements({std::forward(args)...}) diff --git a/include/Nazara/Renderer/ShaderBuilder.hpp b/include/Nazara/Renderer/ShaderBuilder.hpp index 0cfefca7e..e642ea8d3 100644 --- a/include/Nazara/Renderer/ShaderBuilder.hpp +++ b/include/Nazara/Renderer/ShaderBuilder.hpp @@ -57,6 +57,7 @@ namespace Nz { namespace ShaderBuilder constexpr BuiltinBuilder Builtin; constexpr GenBuilder Block; constexpr GenBuilder Branch; + constexpr GenBuilder ConditionalStatement; constexpr GenBuilder Constant; constexpr BinOpBuilder Divide; constexpr BinOpBuilder Equal; diff --git a/include/Nazara/Renderer/ShaderWriter.hpp b/include/Nazara/Renderer/ShaderWriter.hpp index 35baf3959..13ef6e367 100644 --- a/include/Nazara/Renderer/ShaderWriter.hpp +++ b/include/Nazara/Renderer/ShaderWriter.hpp @@ -8,8 +8,10 @@ #define NAZARA_SHADERWRITER_HPP #include +#include #include #include +#include namespace Nz { @@ -21,6 +23,10 @@ namespace Nz ShaderWriter(ShaderWriter&&) = delete; virtual ~ShaderWriter(); + void EnableCondition(const String& name, bool cond); + + bool IsConditionEnabled(const String& name) const; + virtual Nz::String Generate(const ShaderAst::StatementPtr& node) = 0; virtual void RegisterFunction(const String& name, ShaderAst::StatementPtr node, std::initializer_list parameters, ShaderAst::ExpressionType ret) = 0; @@ -37,6 +43,9 @@ namespace Nz virtual void Write(const ShaderAst::NodePtr& node) = 0; virtual void Write(const ShaderAst::StatementBlock& node) = 0; virtual void Write(const ShaderAst::SwizzleOp& node) = 0; + + private: + std::unordered_set m_conditions; }; } diff --git a/src/Nazara/Renderer/ShaderAst.cpp b/src/Nazara/Renderer/ShaderAst.cpp index 71b4b27cf..ef6860d68 100644 --- a/src/Nazara/Renderer/ShaderAst.cpp +++ b/src/Nazara/Renderer/ShaderAst.cpp @@ -19,6 +19,19 @@ namespace Nz { namespace ShaderAst } + void ConditionalStatement::Register(ShaderWriter& visitor) + { + if (visitor.IsConditionEnabled(conditionName)) + statement->Register(visitor); + } + + void ConditionalStatement::Visit(ShaderWriter& visitor) + { + if (visitor.IsConditionEnabled(conditionName)) + statement->Visit(visitor); + } + + void StatementBlock::Register(ShaderWriter& visitor) { for (auto& statementPtr : statements) diff --git a/src/Nazara/Renderer/ShaderWriter.cpp b/src/Nazara/Renderer/ShaderWriter.cpp index 8ca48da3e..c862572ab 100644 --- a/src/Nazara/Renderer/ShaderWriter.cpp +++ b/src/Nazara/Renderer/ShaderWriter.cpp @@ -8,4 +8,17 @@ namespace Nz { ShaderWriter::~ShaderWriter() = default; + + void ShaderWriter::EnableCondition(const String& name, bool cond) + { + if (cond) + m_conditions.insert(name); + else + m_conditions.erase(name); + } + + bool ShaderWriter::IsConditionEnabled(const String & name) const + { + return m_conditions.count(name) != 0; + } }