From 5061f2eb62e1e940d83636dda7584b06c5e8166d Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Tue, 10 Apr 2012 13:10:44 +0000 Subject: [PATCH] fix [#30839] Blender crashes while open/close a scene and deletes .blend-file --- source/gameengine/Converter/BL_BlenderDataConversion.cpp | 7 ++++++- source/gameengine/Ketsji/BL_Material.cpp | 2 +- source/gameengine/Ketsji/BL_Material.h | 3 ++- source/gameengine/Ketsji/KX_BlenderMaterial.cpp | 7 ++----- 4 files changed, 11 insertions(+), 8 deletions(-) diff --git a/source/gameengine/Converter/BL_BlenderDataConversion.cpp b/source/gameengine/Converter/BL_BlenderDataConversion.cpp index a49a84a327d..e112537d0f6 100644 --- a/source/gameengine/Converter/BL_BlenderDataConversion.cpp +++ b/source/gameengine/Converter/BL_BlenderDataConversion.cpp @@ -892,7 +892,12 @@ bool ConvertMaterial( if (validmat) material->matname =(mat->id.name); - material->tface = tface; + if (tface) { + material->tface = *tface; + } + else { + memset(&material->tface, 0, sizeof(material->tface)); + } material->material = mat; return true; } diff --git a/source/gameengine/Ketsji/BL_Material.cpp b/source/gameengine/Ketsji/BL_Material.cpp index 2061a763331..4c7518769e1 100644 --- a/source/gameengine/Ketsji/BL_Material.cpp +++ b/source/gameengine/Ketsji/BL_Material.cpp @@ -58,7 +58,7 @@ void BL_Material::Initialize() alpha = 1.f; emit = 0.f; material = 0; - tface = 0; + memset(&tface, 0, sizeof(tface)); materialindex = 0; amb=0.5f; num_enabled = 0; diff --git a/source/gameengine/Ketsji/BL_Material.h b/source/gameengine/Ketsji/BL_Material.h index 7b1779fed10..70fd640a07e 100644 --- a/source/gameengine/Ketsji/BL_Material.h +++ b/source/gameengine/Ketsji/BL_Material.h @@ -8,6 +8,7 @@ #include "STR_String.h" #include "MT_Point2.h" +#include "DNA_meshdata_types.h" #ifdef WITH_CXX_GUARDEDALLOC #include "MEM_guardedalloc.h" @@ -83,7 +84,7 @@ public: Material* material; - MTFace* tface; + MTFace tface; /* copy of the derived meshes tface */ Image* img[MAXTEX]; EnvMap* cubemap[MAXTEX]; diff --git a/source/gameengine/Ketsji/KX_BlenderMaterial.cpp b/source/gameengine/Ketsji/KX_BlenderMaterial.cpp index 13727be8b98..018a8d44cc1 100644 --- a/source/gameengine/Ketsji/KX_BlenderMaterial.cpp +++ b/source/gameengine/Ketsji/KX_BlenderMaterial.cpp @@ -118,8 +118,7 @@ KX_BlenderMaterial::~KX_BlenderMaterial() MTFace* KX_BlenderMaterial::GetMTFace(void) const { // fonts on polys - MT_assert(mMaterial->tface); - return mMaterial->tface; + return &mMaterial->tface; } unsigned int* KX_BlenderMaterial::GetMCol(void) const @@ -238,9 +237,7 @@ void KX_BlenderMaterial::OnExit() /* used to call with 'mMaterial->tface' but this can be a freed array, * see: [#30493], so just call with NULL, this is best since it clears * the 'lastface' pointer in GPU too - campbell */ - if (mMaterial->tface) { - GPU_set_tpage(NULL, 1, mMaterial->alphablend); - } + GPU_set_tpage(NULL, 1, mMaterial->alphablend); }