#include #include #include // shader compiler #include #include #include #include #include #include "WallpaperEngine/Render/Shaders/Variables/CShaderVariable.h" #include "CGLSLContext.h" using namespace WallpaperEngine::Core; using namespace WallpaperEngine::Assets; namespace WallpaperEngine::Render::Shaders { CShader::CShader ( std::shared_ptr container, std::string filename, const std::map& combos, const std::map& textures, const std::map& constants ) : m_file (std::move (filename)), m_combos (combos), m_passTextures (textures), m_vertex ( CGLSLContext::UnitType_Vertex, filename, container->readVertexShader (filename), container, constants, textures, combos), m_fragment ( CGLSLContext::UnitType_Fragment, filename, container->readFragmentShader (filename), container, constants, textures, combos) { // link shaders between them this->m_vertex.linkToUnit (&this->m_fragment); this->m_fragment.linkToUnit (&this->m_vertex); } const std::string& CShader::vertex () { return this->m_vertex.compile (); } const std::string& CShader::fragment () { return this->m_fragment.compile (); } const CShaderUnit& CShader::getVertex () const { return this->m_vertex; } const CShaderUnit& CShader::getFragment () const { return this->m_fragment; } const std::map& CShader::getCombos () const { return this->m_combos; } CShader::ParameterSearchResult CShader::findParameter (const std::string& name) { Variables::CShaderVariable* vertex = nullptr; Variables::CShaderVariable* fragment = nullptr; for (const auto& cur : this->m_vertex.getParameters ()) { if (cur->getIdentifierName () == name) { vertex = cur; break; } } for (const auto& cur : this->m_fragment.getParameters()) { if (cur->getIdentifierName () == name) { fragment = cur; break; } } return { .vertex = vertex, .fragment = fragment, }; } } // namespace WallpaperEngine::Render::Shaders