49 #include "../../GraphicsEngine/interface/Shader.h"
50 #include "../../../Platforms/Basic/interface/DebugUtilities.hpp"
59 template <
typename Def
intionType>
63 for (
size_t i = 0; i < m_Macros.size() && m_Macros[i].Definition !=
nullptr; ++i)
65 if (strcmp(m_Macros[i].Name, Name) == 0)
67 UNEXPECTED(
"Macro '", Name,
"' already exists. Use UpdateMacro() to update the macro value.");
71 std::ostringstream ss;
73 AddShaderMacro<const Char*>(Name, ss.str().c_str());
89 m_Macros.emplace_back(
nullptr,
nullptr);
90 m_bIsFinalized =
true;
98 VERIFY_EXPR(m_Macros.size() > 0 && m_Macros.back().Name ==
nullptr && m_Macros.back().Definition ==
nullptr);
100 m_bIsFinalized =
false;
107 m_StringPool.clear();
108 m_bIsFinalized =
false;
113 if (m_Macros.size() > 0 && !m_bIsFinalized)
115 return m_Macros.size() ? m_Macros.data() :
nullptr;
121 while (i < m_Macros.size() && m_Macros[i].Definition !=
nullptr)
123 if (strcmp(m_Macros[i].Name, Name) == 0)
125 m_Macros.erase(m_Macros.begin() + i);
135 template <
typename Def
intionType>
143 std::vector<ShaderMacro> m_Macros;
144 std::set<std::string> m_StringPool;
145 bool m_bIsFinalized =
false;
152 const auto* PooledDefinition = m_StringPool.insert(Definition).first->c_str();
153 const auto* PooledName = m_StringPool.insert(Name).first->c_str();
154 m_Macros.emplace_back(PooledName, PooledDefinition);
160 AddShaderMacro<const Char*>(Name, Definition ?
"1" :
"0");
166 std::ostringstream ss;
171 if (Definition ==
static_cast<float>(
static_cast<int>(Definition)))
172 ss << std::fixed << std::setprecision(1);
175 AddShaderMacro<const Char*>(Name, ss.str().c_str());
182 std::ostringstream ss;
183 ss << Definition <<
'u';
184 AddShaderMacro<const Char*>(Name, ss.str().c_str());
193 #define ADD_SHADER_MACRO_ENUM_VALUE(Helper, EnumValue) Helper.AddShaderMacro(#EnumValue, static_cast<int>(EnumValue));