diff --git a/src/graphics/render_geometry.cpp b/src/graphics/render_geometry.cpp index 829721c7c..27c2b9beb 100644 --- a/src/graphics/render_geometry.cpp +++ b/src/graphics/render_geometry.cpp @@ -128,19 +128,8 @@ void renderMeshes1stPass(const std::vector &TexUnits, std::vector(meshes->at(i))); for (unsigned j = 0; j < TexUnits.size(); j++) { - if (!mesh.textures[TexUnits[j].m_id]) - mesh.textures[j] = getUnicolorTexture(video::SColor(255, 255, 255, 255)); - compressTexture(mesh.textures[TexUnits[j].m_id], TexUnits[j].m_premul_alpha); if (UserConfigParams::m_azdo) - { -#ifdef Bindless_Texture_Support - if (!mesh.TextureHandles[TexUnits[j].m_id]) - mesh.TextureHandles[TexUnits[j].m_id] = glGetTextureSamplerHandleARB(getTextureGLuint(mesh.textures[TexUnits[j].m_id]), Shader::getInstance()->SamplersId[j]); - if (!glIsTextureHandleResidentARB(mesh.TextureHandles[TexUnits[j].m_id])) - glMakeTextureHandleResidentARB(mesh.TextureHandles[TexUnits[j].m_id]); -#endif Handles.push_back(mesh.TextureHandles[TexUnits[j].m_id]); - } else Textures.push_back(getTextureGLuint(mesh.textures[TexUnits[j].m_id])); } @@ -211,12 +200,7 @@ void renderInstancedMeshes1stPass(const std::vector &TexUnits, std::vec if (!irr_driver->hasARB_base_instance()) glBindVertexArray(mesh.vao); for (unsigned j = 0; j < TexUnits.size(); j++) - { - if (!mesh.textures[TexUnits[j].m_id]) - mesh.textures[j] = getUnicolorTexture(video::SColor(255, 255, 255, 255)); - compressTexture(mesh.textures[TexUnits[j].m_id], TexUnits[j].m_premul_alpha); Textures.push_back(getTextureGLuint(mesh.textures[TexUnits[j].m_id])); - } Shader::getInstance()->SetTextureUnits(Textures); instanced_custom_unroll_args::template exec(Shader::getInstance(), meshes->at(i)); } @@ -412,19 +396,8 @@ void renderMeshes2ndPass(const std::vector &TexUnits, std::vector(meshes->at(i))); for (unsigned j = 0; j < TexUnits.size(); j++) { - if (!mesh.textures[TexUnits[j].m_id]) - mesh.textures[TexUnits[j].m_id] = getUnicolorTexture(video::SColor(255, 255, 255, 255)); - compressTexture(mesh.textures[TexUnits[j].m_id], TexUnits[j].m_premul_alpha); if (UserConfigParams::m_azdo) - { -#ifdef Bindless_Texture_Support - if (!mesh.TextureHandles[TexUnits[j].m_id]) - mesh.TextureHandles[TexUnits[j].m_id] = glGetTextureSamplerHandleARB(getTextureGLuint(mesh.textures[TexUnits[j].m_id]), Shader::getInstance()->SamplersId[Handles.size()]); - if (!glIsTextureHandleResidentARB(mesh.TextureHandles[TexUnits[j].m_id])) - glMakeTextureHandleResidentARB(mesh.TextureHandles[TexUnits[j].m_id]); Handles.push_back(mesh.TextureHandles[TexUnits[j].m_id]); -#endif - } else Textures.push_back(getTextureGLuint(mesh.textures[TexUnits[j].m_id])); } @@ -457,13 +430,7 @@ void renderInstancedMeshes2ndPass(const std::vector &TexUnits, std::vec std::vector Textures(Prefilled_tex); for (unsigned j = 0; j < TexUnits.size(); j++) - { - if (!mesh.textures[TexUnits[j].m_id]) - mesh.textures[TexUnits[j].m_id] = getUnicolorTexture(video::SColor(255, 255, 255, 255)); - compressTexture(mesh.textures[TexUnits[j].m_id], TexUnits[j].m_premul_alpha); Textures.push_back(getTextureGLuint(mesh.textures[TexUnits[j].m_id])); - - } Shader::getInstance()->SetTextureUnits(Textures); instanced_custom_unroll_args::template exec(Shader::getInstance(), meshes->at(i)); } @@ -816,15 +783,7 @@ void renderShadow(const std::vector TextureUnits, unsigned cascade, cons { compressTexture(mesh->textures[TextureUnits[j]], true); if (UserConfigParams::m_azdo) - { -#ifdef Bindless_Texture_Support - if (!mesh->TextureHandles[TextureUnits[j]]) - mesh->TextureHandles[TextureUnits[j]] = glGetTextureSamplerHandleARB(getTextureGLuint(mesh->textures[TextureUnits[j]]), T::getInstance()->SamplersId[j]); - if (!glIsTextureHandleResidentARB(mesh->TextureHandles[TextureUnits[j]])) - glMakeTextureHandleResidentARB(mesh->TextureHandles[TextureUnits[j]]); -#endif Handles.push_back(mesh->TextureHandles[TextureUnits[j]]); - } else Textures.push_back(getTextureGLuint(mesh->textures[TextureUnits[j]])); } @@ -885,11 +844,8 @@ void renderInstancedShadow(const std::vector TextureUnits, unsigned casc glBindVertexArray(mesh->vao_shadow_pass); for (unsigned j = 0; j < TextureUnits.size(); j++) - { - compressTexture(mesh->textures[TextureUnits[j]], true); Textures.push_back(getTextureGLuint(mesh->textures[TextureUnits[j]])); - } T::getInstance()->SetTextureUnits(Textures); instanced_shadow_custom_unroll_args::template exec(T::getInstance(), cascade, t->at(i)); } @@ -1071,12 +1027,7 @@ void drawRSM(const core::matrix4 & rsm_matrix, const std::vector &Textur std::vector Textures; GLMesh *mesh = STK::tuple_get<0>(t->at(i)); for (unsigned j = 0; j < TextureUnits.size(); j++) - { - if (!mesh->textures[TextureUnits[j]]) - mesh->textures[TextureUnits[j]] = getUnicolorTexture(video::SColor(255, 255, 255, 255)); - compressTexture(mesh->textures[TextureUnits[j]], true); Textures.push_back(getTextureGLuint(mesh->textures[TextureUnits[j]])); - } T::getInstance()->SetTextureUnits(Textures); rsm_custom_unroll_args::template exec(rsm_matrix, t->at(i)); } diff --git a/src/graphics/stkanimatedmesh.cpp b/src/graphics/stkanimatedmesh.cpp index 2c952e62a..54ad2a5c3 100644 --- a/src/graphics/stkanimatedmesh.cpp +++ b/src/graphics/stkanimatedmesh.cpp @@ -106,6 +106,7 @@ void STKAnimatedMesh::render() { MeshMaterial MatType = MaterialTypeToMeshMaterial(type, mb->getVertexType()); MeshSolidMaterial[MatType].push_back(&mesh); + InitTextures(mesh, MatType); } std::pair p = VAOManager::getInstance()->getBase(mb); mesh.vaoBaseVertex = p.first; diff --git a/src/graphics/stkinstancedscenenode.cpp b/src/graphics/stkinstancedscenenode.cpp index 1059ae366..27ebb01d7 100644 --- a/src/graphics/stkinstancedscenenode.cpp +++ b/src/graphics/stkinstancedscenenode.cpp @@ -124,6 +124,7 @@ void STKInstancedSceneNode::setFirstTimeMaterial() if (irr_driver->hasARB_base_instance()) mesh.vaoBaseInstance = VAOManager::getInstance()->appendInstance(InstanceTypeDefault, instanceData[i]); MeshSolidMaterial[MatType].push_back(&mesh); + InitTextures(mesh, MatType); } isMaterialInitialized = true; } diff --git a/src/graphics/stkmesh.cpp b/src/graphics/stkmesh.cpp index 568479942..831865ed5 100644 --- a/src/graphics/stkmesh.cpp +++ b/src/graphics/stkmesh.cpp @@ -292,4 +292,46 @@ bool isObject(video::E_MATERIAL_TYPE type) if (type == video::EMT_TRANSPARENT_ALPHA_CHANNEL_REF) return true; return false; +} + +static void +SetTexture(GLMesh &mesh, unsigned i, bool isSrgb) +{ + if (!mesh.textures[i]) + mesh.textures[i] = getUnicolorTexture(video::SColor(255, 255, 255, 255)); + compressTexture(mesh.textures[i], isSrgb); + if (UserConfigParams::m_azdo) + { + if (!mesh.TextureHandles[i]) + mesh.TextureHandles[i] = glGetTextureSamplerHandleARB(getTextureGLuint(mesh.textures[i]), MeshShader::ObjectPass1Shader::getInstance()->SamplersId[0]); + if (!glIsTextureHandleResidentARB(mesh.TextureHandles[i])) + glMakeTextureHandleResidentARB(mesh.TextureHandles[i]); + } +} + +void InitTextures(GLMesh &mesh, MeshMaterial Mat) +{ + switch (Mat) + { + default: + case MAT_DEFAULT: + case MAT_ALPHA_REF: + case MAT_GRASS: + case MAT_SPHEREMAP: + case MAT_UNLIT: + SetTexture(mesh, 0, true); + break; + case MAT_DETAIL: + case MAT_NORMAL_MAP: + SetTexture(mesh, 0, true); + SetTexture(mesh, 1, false); + break; + case MAT_SPLATTING: + SetTexture(mesh, 0, true); + SetTexture(mesh, 1, true); + SetTexture(mesh, 2, true); + SetTexture(mesh, 3, true); + SetTexture(mesh, 4, true); + break; + } } \ No newline at end of file diff --git a/src/graphics/stkmesh.hpp b/src/graphics/stkmesh.hpp index 87fdf9071..c47f8b601 100644 --- a/src/graphics/stkmesh.hpp +++ b/src/graphics/stkmesh.hpp @@ -109,4 +109,6 @@ void drawBubble(const GLMesh &mesh, const core::matrix4 &ModelViewProjectionMatr MeshMaterial MaterialTypeToMeshMaterial(video::E_MATERIAL_TYPE, video::E_VERTEX_TYPE); TransparentMaterial MaterialTypeToTransparentMaterial(video::E_MATERIAL_TYPE, f32 MaterialTypeParam); +void InitTextures(GLMesh &mesh, MeshMaterial); + #endif // STKMESH_H diff --git a/src/graphics/stkmeshscenenode.cpp b/src/graphics/stkmeshscenenode.cpp index 74d93d060..da3e39cd1 100644 --- a/src/graphics/stkmeshscenenode.cpp +++ b/src/graphics/stkmeshscenenode.cpp @@ -90,7 +90,10 @@ void STKMeshSceneNode::setFirstTimeMaterial() glBindVertexArray(0); } else + { + InitTextures(mesh, MatType); MeshSolidMaterials[MatType].push_back(&mesh); + } } if (!immediate_draw)