From bf74a94420b2a32af74b3a68a5c54d68116edd91 Mon Sep 17 00:00:00 2001 From: Almamu Date: Tue, 2 Sep 2025 00:28:34 +0200 Subject: [PATCH] chore: remove magic string values in favour of enums in Material info --- src/WallpaperEngine/Data/Model/DynamicValue.h | 2 +- src/WallpaperEngine/Data/Model/Material.h | 34 +++++++-- .../Data/Parsers/MaterialParser.cpp | 66 +++++++++++++++-- .../Data/Parsers/MaterialParser.h | 5 ++ src/WallpaperEngine/Render/Objects/CImage.cpp | 10 +-- .../Render/Objects/Effects/CPass.cpp | 71 ++++++++++++------- .../Render/Objects/Effects/CPass.h | 7 +- 7 files changed, 151 insertions(+), 44 deletions(-) diff --git a/src/WallpaperEngine/Data/Model/DynamicValue.h b/src/WallpaperEngine/Data/Model/DynamicValue.h index 7bf8ccc..aa120f9 100644 --- a/src/WallpaperEngine/Data/Model/DynamicValue.h +++ b/src/WallpaperEngine/Data/Model/DynamicValue.h @@ -33,7 +33,7 @@ class DynamicValue { explicit DynamicValue(float value); explicit DynamicValue(int value); explicit DynamicValue(bool value); - ~DynamicValue (); + virtual ~DynamicValue (); [[nodiscard]] const glm::ivec4& getIVec4 () const; [[nodiscard]] const glm::ivec3& getIVec3 () const; diff --git a/src/WallpaperEngine/Data/Model/Material.h b/src/WallpaperEngine/Data/Model/Material.h index 339d977..6f77ca9 100644 --- a/src/WallpaperEngine/Data/Model/Material.h +++ b/src/WallpaperEngine/Data/Model/Material.h @@ -8,16 +8,42 @@ #include "Types.h" namespace WallpaperEngine::Data::Model { + +enum BlendingMode { + BlendingMode_Unknown = 0, + BlendingMode_Normal = 1, + BlendingMode_Translucent = 2, + BlendingMode_Additive = 3, +}; + +enum CullingMode { + CullingMode_Unknown = 0, + CullingMode_Normal = 1, + CullingMode_Disable = 2 +}; + +enum DepthtestMode { + DepthtestMode_Unknown = 0, + DepthtestMode_Disabled = 1, + DepthtestMode_Enabled = 2, +}; + +enum DepthwriteMode { + DepthwriteMode_Unknown = 0, + DepthwriteMode_Disabled = 1, + DepthwriteMode_Enabled = 2, +}; + struct MaterialPass { // TODO: WRITE ENUMS FOR THESE /** Blending mode */ - std::string blending; + BlendingMode blending; /** Culling mode */ - std::string cullmode; + CullingMode cullmode; /** Depth test mode */ - std::string depthtest; + DepthtestMode depthtest; /** Depth write mode */ - std::string depthwrite; + DepthwriteMode depthwrite; /** Shader file to use for this pass */ std::string shader; /** List of textures defined for this pass */ diff --git a/src/WallpaperEngine/Data/Parsers/MaterialParser.cpp b/src/WallpaperEngine/Data/Parsers/MaterialParser.cpp index 9714c73..1f03df9 100644 --- a/src/WallpaperEngine/Data/Parsers/MaterialParser.cpp +++ b/src/WallpaperEngine/Data/Parsers/MaterialParser.cpp @@ -41,10 +41,10 @@ MaterialPassUniquePtr MaterialParser::parsePass (const JSON& it, Project& projec return std::make_unique (MaterialPass { //TODO: REMOVE THIS UGLY STD::STRING CREATION - .blending = it.optional ("blending", std::string ("normal")), - .cullmode = it.optional ("cullmode", std::string ("disabled")), - .depthtest = it.optional ("depthtest", std::string ("disabled")), - .depthwrite = it.optional ("depthwrite", std::string ("disabled")), + .blending = parseBlendMode (it.optional ("blending", std::string ("normal"))), + .cullmode = parseCullMode (it.optional ("cullmode", std::string ("nocull"))), + .depthtest = parseDepthtestMode (it.optional ("depthtest", std::string ("disabled"))), + .depthwrite = parseDepthwriteMode (it.optional ("depthwrite", std::string ("disabled"))), .shader = it.require ("shader", "Material pass must have a shader"), .textures = textures.has_value () ? parseTextures (*textures) : TextureMap {}, .usertextures = usertextures.has_value () ? parseTextures (*usertextures) : TextureMap {}, @@ -89,4 +89,60 @@ std::map MaterialParser::parseCombos (const JSON& it) { } return result; -} \ No newline at end of file +} + +BlendingMode MaterialParser::parseBlendMode (const std::string& mode) { + if (mode == "normal") { + return BlendingMode_Normal; + } + + if (mode == "additive") { + return BlendingMode_Additive; + } + + if (mode == "translucent") { + return BlendingMode_Translucent; + } + + sLog.error ("Unknown blending mode: ", mode, " defaulting to normal"); + return BlendingMode_Normal; +} + +CullingMode MaterialParser::parseCullMode (const std::string& mode) { + if (mode == "nocull") { + return CullingMode_Disable; + } + + if (mode == "normal") { + return CullingMode_Normal; + } + + sLog.error ("Unknown culling mode: ", mode, " defaulting to nocull"); + return CullingMode_Disable; +} + +DepthtestMode MaterialParser::parseDepthtestMode (const std::string& mode) { + if (mode == "disabled") { + return DepthtestMode_Disabled; + } + + if (mode == "enabled") { + return DepthtestMode_Enabled; + } + + sLog.error ("Unknown depthtest mode: ", mode, " defaulting to disabled"); + return DepthtestMode_Disabled; +} + +DepthwriteMode MaterialParser::parseDepthwriteMode (const std::string& mode) { + if (mode == "disabled") { + return DepthwriteMode_Disabled; + } + + if (mode == "enabled") { + return DepthwriteMode_Enabled; + } + + sLog.error ("Unknown depthwrite mode: ", mode, " defaulting to disabled"); + return DepthwriteMode_Disabled; +} diff --git a/src/WallpaperEngine/Data/Parsers/MaterialParser.h b/src/WallpaperEngine/Data/Parsers/MaterialParser.h index f145fa3..85caaa1 100644 --- a/src/WallpaperEngine/Data/Parsers/MaterialParser.h +++ b/src/WallpaperEngine/Data/Parsers/MaterialParser.h @@ -1,6 +1,7 @@ #pragma once #include "WallpaperEngine/Data/JSON.h" +#include "WallpaperEngine/Data/Model/Material.h" #include "WallpaperEngine/Data/Model/Types.h" namespace WallpaperEngine::Data::Parsers { @@ -15,5 +16,9 @@ class MaterialParser { static MaterialPassUniquePtr parsePass (const JSON& it, Project& project); static std::map parseTextures (const JSON& it); static std::map parseCombos (const JSON& it); + static BlendingMode parseBlendMode (const std::string& mode); + static CullingMode parseCullMode (const std::string& mode); + static DepthtestMode parseDepthtestMode (const std::string& mode); + static DepthwriteMode parseDepthwriteMode (const std::string& mode); }; } // namespace WallpaperEngine::Data::Parsers diff --git a/src/WallpaperEngine/Render/Objects/CImage.cpp b/src/WallpaperEngine/Render/Objects/CImage.cpp index b3b9175..c9ccd7f 100644 --- a/src/WallpaperEngine/Render/Objects/CImage.cpp +++ b/src/WallpaperEngine/Render/Objects/CImage.cpp @@ -294,10 +294,10 @@ void CImage::setup () { } const auto virtualPass = MaterialPass { - .blending = "normal", - .cullmode = "nocull", - .depthtest = "disabled", - .depthwrite = "disabled", + .blending = BlendingMode_Normal, + .cullmode = CullingMode_Disable, + .depthtest = DepthtestMode_Disabled, + .depthwrite = DepthwriteMode_Disabled, .shader = "commands/copy", .textures = { {0, *(*curEffect)->source} @@ -363,7 +363,7 @@ void CImage::setup () { const auto last = this->m_passes.rbegin (); (*last)->setBlendingMode ((*first)->getBlendingMode ()); - (*first)->setBlendingMode ("normal"); + (*first)->setBlendingMode (BlendingMode_Normal); } // calculate full animation time (if any) diff --git a/src/WallpaperEngine/Render/Objects/Effects/CPass.cpp b/src/WallpaperEngine/Render/Objects/Effects/CPass.cpp index 7f3cfba..e7f9671 100644 --- a/src/WallpaperEngine/Render/Objects/Effects/CPass.cpp +++ b/src/WallpaperEngine/Render/Objects/Effects/CPass.cpp @@ -89,36 +89,55 @@ void CPass::setupRenderFramebuffer () { glViewport (0, 0, this->m_drawTo->getRealWidth (), this->m_drawTo->getRealHeight ()); // set texture blending - if (this->getBlendingMode () == "translucent") { - glEnable (GL_BLEND); - glBlendFuncSeparate (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - } else if (this->getBlendingMode () == "additive") { - glEnable (GL_BLEND); - glBlendFuncSeparate (GL_SRC_ALPHA, GL_ONE, GL_SRC_ALPHA, GL_ONE); - } else if (this->getBlendingMode () == "normal") { - glEnable (GL_BLEND); - glBlendFuncSeparate (GL_ONE, GL_ZERO, GL_ONE, GL_ZERO); - } else { + switch (this->getBlendingMode ()) { + case BlendingMode_Translucent: + glEnable (GL_BLEND); + glBlendFuncSeparate (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + break; + case BlendingMode_Additive: + glEnable (GL_BLEND); + glBlendFuncSeparate (GL_SRC_ALPHA, GL_ONE, GL_SRC_ALPHA, GL_ONE); + break; + case BlendingMode_Normal: + glEnable (GL_BLEND); + glBlendFuncSeparate (GL_ONE, GL_ZERO, GL_ONE, GL_ZERO); + break; + default: glDisable (GL_BLEND); + break; } - // set depth testing - if (this->m_pass.depthtest == "disabled") { - glDisable (GL_DEPTH_TEST); - } else { - glEnable (GL_DEPTH_TEST); + switch (this->m_pass.depthtest) { + case DepthtestMode_Enabled: + glEnable (GL_DEPTH_TEST); + break; + case DepthtestMode_Disabled: + default: + glDisable (GL_DEPTH_TEST); + break; + } - if (this->m_pass.cullmode == "nocull") { - glDisable (GL_CULL_FACE); - } else { - glEnable (GL_CULL_FACE); + switch (this->m_pass.cullmode) { + case CullingMode_Normal: + glEnable (GL_CULL_FACE); + break; + + case CullingMode_Disable: + default: + glDisable (GL_CULL_FACE); + break; } - if (this->m_pass.depthwrite == "disabled") { - glDepthMask (false); - } else { - glDepthMask (true); + switch (this->m_pass.depthwrite) { + case DepthwriteMode_Enabled: + glDepthMask (true); + break; + + case DepthwriteMode_Disabled: + default: + glDepthMask (false); + break; } } @@ -322,11 +341,11 @@ void CPass::setViewProjectionMatrix (const glm::mat4* viewProjection) { this->m_viewProjectionMatrix = viewProjection; } -void CPass::setBlendingMode (std::string blendingmode) { - this->m_blendingmode = std::move(blendingmode); +void CPass::setBlendingMode (BlendingMode blendingmode) { + this->m_blendingmode = blendingmode; } -const std::string& CPass::getBlendingMode () const { +BlendingMode CPass::getBlendingMode () const { return this->m_blendingmode; } diff --git a/src/WallpaperEngine/Render/Objects/Effects/CPass.h b/src/WallpaperEngine/Render/Objects/Effects/CPass.h index a4a6efc..8014457 100644 --- a/src/WallpaperEngine/Render/Objects/Effects/CPass.h +++ b/src/WallpaperEngine/Render/Objects/Effects/CPass.h @@ -3,6 +3,7 @@ #include #include +#include "WallpaperEngine/Data/Model/Material.h" #include "WallpaperEngine/Assets/ITexture.h" #include "WallpaperEngine/Render/CFBO.h" #include "WallpaperEngine/Render/CFBOProvider.h" @@ -37,8 +38,8 @@ class CPass final : public Helpers::CContextAware { void setModelViewProjectionMatrixInverse (const glm::mat4* projection); void setModelMatrix (const glm::mat4* model); void setViewProjectionMatrix (const glm::mat4* viewProjection); - void setBlendingMode (std::string blendingmode); - [[nodiscard]] const std::string& getBlendingMode () const; + void setBlendingMode (BlendingMode blendingmode); + [[nodiscard]] BlendingMode getBlendingMode () const; [[nodiscard]] std::shared_ptr resolveFBO (const std::string& name) const; [[nodiscard]] std::shared_ptr getFBOProvider () const; @@ -163,7 +164,7 @@ class CPass final : public Helpers::CContextAware { std::vector m_attribs = {}; std::map m_uniforms = {}; std::map m_referenceUniforms = {}; - std::string m_blendingmode = ""; + BlendingMode m_blendingmode = BlendingMode_Normal; const glm::mat4* m_modelViewProjectionMatrix; const glm::mat4* m_modelViewProjectionMatrixInverse; const glm::mat4* m_modelMatrix;