From 6fe25a0ccc18f44d8ca7b4c787eab7e29f1a4a92 Mon Sep 17 00:00:00 2001 From: Porteries Tristan Date: Wed, 16 Dec 2015 19:47:09 +0100 Subject: [PATCH] UPBGE: Fix NULL returned by GetMeshMaterial. GetMeshMaterial was based on blender material index in a previous commit. but this function is used in loop of NumMaterial() iterations. To solve this the GetMeshMaterial was reset as original and only GetMaterialId (now renamed GetBlenderMaterialId) is still based on blender material index. --- source/gameengine/Rasterizer/RAS_MeshObject.cpp | 14 +++++++------- source/gameengine/Rasterizer/RAS_MeshObject.h | 3 ++- .../RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp | 4 ++-- 3 files changed, 11 insertions(+), 10 deletions(-) diff --git a/source/gameengine/Rasterizer/RAS_MeshObject.cpp b/source/gameengine/Rasterizer/RAS_MeshObject.cpp index 00e64bcfa26d..e20de1b545b9 100644 --- a/source/gameengine/Rasterizer/RAS_MeshObject.cpp +++ b/source/gameengine/Rasterizer/RAS_MeshObject.cpp @@ -141,6 +141,7 @@ void RAS_MeshObject::UpdateAabb() unsigned int nmat = NumMaterials(); for (unsigned int imat = 0; imat < nmat; ++imat) { RAS_MeshMaterial *mmat = GetMeshMaterial(imat); + RAS_MeshSlot *slot = mmat->m_baseslot; if (!slot) continue; @@ -196,13 +197,12 @@ const STR_String& RAS_MeshObject::GetMaterialName(unsigned int matid) RAS_MeshMaterial *RAS_MeshObject::GetMeshMaterial(unsigned int matid) { - for(std::list::iterator it = m_materials.begin(); - it != m_materials.end(); - ++it) - { - if (it->m_index == matid) { - return &*it; + if ((m_materials.empty() == false) && (matid < m_materials.size())) { + list::iterator it = m_materials.begin(); + while (matid--) { + ++it; } + return &*it; } return NULL; @@ -261,7 +261,7 @@ RAS_MeshMaterial *RAS_MeshObject::GetMeshMaterial(RAS_IPolyMaterial *mat) return NULL; } -int RAS_MeshObject::GetMaterialId(RAS_IPolyMaterial *mat) +int RAS_MeshObject::GetBlenderMaterialId(RAS_IPolyMaterial *mat) { list::iterator mit; diff --git a/source/gameengine/Rasterizer/RAS_MeshObject.h b/source/gameengine/Rasterizer/RAS_MeshObject.h index 682f69a0a0f6..d2a8daa3c54e 100644 --- a/source/gameengine/Rasterizer/RAS_MeshObject.h +++ b/source/gameengine/Rasterizer/RAS_MeshObject.h @@ -90,7 +90,8 @@ class RAS_MeshObject RAS_MeshMaterial *GetMeshMaterial(unsigned int matid); RAS_MeshMaterial *GetMeshMaterial(RAS_IPolyMaterial *mat); - int GetMaterialId(RAS_IPolyMaterial *mat); + /// Return the material position in the mesh, like in blender. + int GetBlenderMaterialId(RAS_IPolyMaterial *mat); list::iterator GetFirstMaterial(); list::iterator GetLastMaterial(); diff --git a/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp b/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp index ffa9aa22c3eb..087a17665584 100644 --- a/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp +++ b/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp @@ -836,7 +836,7 @@ void RAS_OpenGLRasterizer::DrawDerivedMesh(class RAS_MeshSlot &ms) if (current_polymat->GetFlag() & RAS_BLENDERGLSL) { // GetMaterialIndex return the original mface material index, // increment by 1 to match what derived mesh is doing - current_blmat_nr = current_mesh->GetMaterialId(current_bucket->GetPolyMaterial()) + 1; + current_blmat_nr = current_mesh->GetBlenderMaterialId(current_bucket->GetPolyMaterial()) + 1; // For GLSL we need to retrieve the GPU material attribute Material* blmat = current_polymat->GetBlenderMaterial(); Scene* blscene = current_polymat->GetBlenderScene(); @@ -850,7 +850,7 @@ void RAS_OpenGLRasterizer::DrawDerivedMesh(class RAS_MeshSlot &ms) GPU_set_material_alpha_blend(current_blend_mode); } else { //ms.m_pDerivedMesh->drawMappedFacesTex(ms.m_pDerivedMesh, CheckTexfaceDM, mcol); - current_blmat_nr = current_mesh->GetMaterialId(current_bucket->GetPolyMaterial()); + current_blmat_nr = current_mesh->GetBlenderMaterialId(current_bucket->GetPolyMaterial()); current_image = current_polymat->GetBlenderImage(); ms.m_pDerivedMesh->drawFacesTex(ms.m_pDerivedMesh, CheckTexDM, NULL, NULL, DM_DRAW_USE_ACTIVE_UV); }