From c3790dd7afd0b3b23c803a6a95ca576b3ca02842 Mon Sep 17 00:00:00 2001 From: sfan5 Date: Fri, 7 Nov 2025 13:30:26 +0100 Subject: [PATCH] Introduce EMT_INVALID as safe placeholder --- irr/include/EMaterialTypes.h | 10 +++++----- irr/src/CNullDriver.cpp | 12 +----------- irr/src/COpenGLDriver.cpp | 2 ++ irr/src/OpenGL/Driver.cpp | 2 ++ src/client/content_cao.cpp | 4 ++-- src/client/content_cao.h | 3 +-- src/client/shader.cpp | 2 +- src/client/shader.h | 4 ++-- 8 files changed, 16 insertions(+), 23 deletions(-) diff --git a/irr/include/EMaterialTypes.h b/irr/include/EMaterialTypes.h index 424fce1e4a..d22ff04a3b 100644 --- a/irr/include/EMaterialTypes.h +++ b/irr/include/EMaterialTypes.h @@ -10,7 +10,7 @@ namespace video { //! Abstracted and easy to use fixed function/programmable pipeline material modes. -enum E_MATERIAL_TYPE +enum E_MATERIAL_TYPE : u32 { //! Standard solid material. /** Only first texture is used, which is supposed to be the @@ -51,15 +51,15 @@ enum E_MATERIAL_TYPE pack_textureBlendFunc (for 2D) or pack_textureBlendFuncSeparate (for 3D). */ EMT_ONETEXTURE_BLEND, - //! This value is not used. It only forces this enumeration to compile to 32 bit. - EMT_FORCE_32BIT = 0x7fffffff + //! Invalid value + EMT_INVALID = 0xffffffff, }; //! Array holding the built in material type names const char *const sBuiltInMaterialTypeNames[] = { "solid", - "trans_alphach", - "trans_alphach_ref", + "trans_alpha", + "trans_alpha_ref", "trans_vertex_alpha", "onetexture_blend", 0, diff --git a/irr/src/CNullDriver.cpp b/irr/src/CNullDriver.cpp index 5a54e8c7c0..d7b8216332 100644 --- a/irr/src/CNullDriver.cpp +++ b/irr/src/CNullDriver.cpp @@ -38,16 +38,6 @@ IImageWriter *createImageWriterJPG(); //! creates a writer which is able to save png images IImageWriter *createImageWriterPNG(); -namespace -{ -//! no-op material renderer -class CDummyMaterialRenderer : public IMaterialRenderer -{ -public: - CDummyMaterialRenderer() {} -}; -} - //! constructor CNullDriver::CNullDriver(io::IFileSystem *io, const core::dimension2d &screenSize) : SharedRenderTarget(0), CurrentRenderTarget(0), CurrentRenderTargetSize(0, 0), FileSystem(io), MeshManipulator(0), @@ -1505,7 +1495,7 @@ void CNullDriver::deleteShaderMaterial(s32 material) auto &ref = MaterialRenderers[idx]; if (ref.Renderer) ref.Renderer->drop(); - ref.Renderer = new CDummyMaterialRenderer(); + ref.Renderer = new IMaterialRenderer(); ref.Name.clear(); } diff --git a/irr/src/COpenGLDriver.cpp b/irr/src/COpenGLDriver.cpp index 18c0c8176c..1e7817bc00 100644 --- a/irr/src/COpenGLDriver.cpp +++ b/irr/src/COpenGLDriver.cpp @@ -1700,6 +1700,8 @@ void COpenGLDriver::setRenderStates3DMode() if (static_cast(Material.MaterialType) < MaterialRenderers.size()) MaterialRenderers[Material.MaterialType].Renderer->OnSetMaterial( Material, LastMaterial, ResetRenderStates, this); + else + os::Printer::log("Attempt to render with invalid material", ELL_WARNING); LastMaterial = Material; CacheHandler->correctCacheMaterial(LastMaterial); diff --git a/irr/src/OpenGL/Driver.cpp b/irr/src/OpenGL/Driver.cpp index b94fb1cec3..c9eba04fe2 100644 --- a/irr/src/OpenGL/Driver.cpp +++ b/irr/src/OpenGL/Driver.cpp @@ -1176,6 +1176,8 @@ void COpenGL3DriverBase::setRenderStates3DMode() if (static_cast(Material.MaterialType) < MaterialRenderers.size()) MaterialRenderers[Material.MaterialType].Renderer->OnSetMaterial( Material, LastMaterial, ResetRenderStates, this); + else + os::Printer::log("Attempt to render with invalid material", ELL_WARNING); LastMaterial = Material; CacheHandler->correctCacheMaterial(LastMaterial); diff --git a/src/client/content_cao.cpp b/src/client/content_cao.cpp index e2ad60e9ec..74daa36f1e 100644 --- a/src/client/content_cao.cpp +++ b/src/client/content_cao.cpp @@ -599,14 +599,14 @@ void GenericCAO::addToScene(ITextureSource *tsrc, scene::ISceneManager *smgr) m_material_type = shader_source->getShaderInfo(shader_id).material; } else { // Not used, so make sure it's not valid - m_material_type = EMT_INVALID; + m_material_type = video::EMT_INVALID; } m_matrixnode = m_smgr->addDummyTransformationSceneNode(); m_matrixnode->grab(); auto setMaterial = [this] (video::SMaterial &mat) { - if (m_material_type != EMT_INVALID) + if (m_material_type != video::EMT_INVALID) mat.MaterialType = m_material_type; mat.FogEnable = true; mat.forEachTexture([] (auto &tex) { diff --git a/src/client/content_cao.h b/src/client/content_cao.h index c6f31bb236..c1cb30245b 100644 --- a/src/client/content_cao.h +++ b/src/client/content_cao.h @@ -74,7 +74,6 @@ struct MeshAnimationInfo { class GenericCAO : public ClientActiveObject { private: - static constexpr auto EMT_INVALID = video::EMT_FORCE_32BIT; // Only set at initialization std::string m_name = ""; @@ -101,7 +100,7 @@ private: std::vector m_meshnode_animation; // Material - video::E_MATERIAL_TYPE m_material_type = EMT_INVALID; + video::E_MATERIAL_TYPE m_material_type = video::EMT_INVALID; // Movement v3f m_position = v3f(0.0f, 10.0f * BS, 0); diff --git a/src/client/shader.cpp b/src/client/shader.cpp index 9055ec3f77..5715738e65 100644 --- a/src/client/shader.cpp +++ b/src/client/shader.cpp @@ -640,7 +640,7 @@ void ShaderSource::rebuildShaders() for (ShaderInfo &i : m_shaderinfo_cache) { if (!i.name.empty()) { gpu->deleteShaderMaterial(i.material); - i.material = video::EMT_SOLID; // invalidate + i.material = video::EMT_INVALID; } } diff --git a/src/client/shader.h b/src/client/shader.h index e5c6b23aec..b7e02bc03e 100644 --- a/src/client/shader.h +++ b/src/client/shader.h @@ -229,9 +229,9 @@ using CachedStructPixelShaderSetting = CachedStructShaderSetting