diff options
Diffstat (limited to 'source/gameengine/Converter')
3 files changed, 33 insertions, 25 deletions
diff --git a/source/gameengine/Converter/BL_BlenderDataConversion.cpp b/source/gameengine/Converter/BL_BlenderDataConversion.cpp index ad16c96dc70..4890db193eb 100644 --- a/source/gameengine/Converter/BL_BlenderDataConversion.cpp +++ b/source/gameengine/Converter/BL_BlenderDataConversion.cpp @@ -890,8 +890,8 @@ static bool ConvertMaterial( static RAS_MaterialBucket *material_from_mesh(Material *ma, MFace *mface, MTFace *tface, MCol *mcol, MTF_localLayer *layers, int lightlayer, unsigned int *rgb, MT_Point2 uvs[4][RAS_TexVert::MAX_UNIT], const char *tfaceName, KX_Scene* scene, KX_BlenderSceneConverter *converter) { - RAS_IPolyMaterial* polymat = converter->FindCachedPolyMaterial(ma); - BL_Material* bl_mat = converter->FindCachedBlenderMaterial(ma); + RAS_IPolyMaterial* polymat = converter->FindCachedPolyMaterial(scene, ma); + BL_Material* bl_mat = converter->FindCachedBlenderMaterial(scene, ma); KX_BlenderMaterial* kx_blmat = NULL; KX_PolygonMaterial* kx_polymat = NULL; @@ -907,7 +907,7 @@ static RAS_MaterialBucket *material_from_mesh(Material *ma, MFace *mface, MTFace converter->GetGLSLMaterials()); if (ma && (ma->mode & MA_FACETEXTURE) == 0) - converter->CacheBlenderMaterial(ma, bl_mat); + converter->CacheBlenderMaterial(scene, ma, bl_mat); } const bool use_vcol = GetMaterialUseVColor(ma, bl_mat->glslmat); @@ -923,7 +923,7 @@ static RAS_MaterialBucket *material_from_mesh(Material *ma, MFace *mface, MTFace kx_blmat->Initialize(scene, bl_mat, (ma?&ma->game:NULL), lightlayer); polymat = static_cast<RAS_IPolyMaterial*>(kx_blmat); if (ma && (ma->mode & MA_FACETEXTURE) == 0) - converter->CachePolyMaterial(ma, polymat); + converter->CachePolyMaterial(scene, ma, polymat); } } else { @@ -1052,7 +1052,7 @@ static RAS_MaterialBucket *material_from_mesh(Material *ma, MFace *mface, MTFace polymat->m_shininess = 35.0; } - converter->CachePolyMaterial(ma, polymat); + converter->CachePolyMaterial(scene, ma, polymat); } } diff --git a/source/gameengine/Converter/KX_BlenderSceneConverter.cpp b/source/gameengine/Converter/KX_BlenderSceneConverter.cpp index 5df431db4b3..7a53144657d 100644 --- a/source/gameengine/Converter/KX_BlenderSceneConverter.cpp +++ b/source/gameengine/Converter/KX_BlenderSceneConverter.cpp @@ -174,7 +174,7 @@ KX_BlenderSceneConverter::~KX_BlenderSceneConverter() vector<pair<KX_Scene*,RAS_IPolyMaterial*> >::iterator itp = m_polymaterials.begin(); while (itp != m_polymaterials.end()) { - m_polymat_cache.erase((*itp).second->GetBlenderMaterial()); + //m_polymat_cache.erase((*itp).second->GetBlenderMaterial()); delete (*itp).second; itp++; } @@ -183,7 +183,7 @@ KX_BlenderSceneConverter::~KX_BlenderSceneConverter() // delete after RAS_IPolyMaterial vector<pair<KX_Scene*,BL_Material *> >::iterator itmat = m_materials.begin(); while (itmat != m_materials.end()) { - m_mat_cache.erase((*itmat).second->material); + //m_mat_cache.erase((*itmat).second->material); delete (*itmat).second; itmat++; } @@ -439,7 +439,7 @@ void KX_BlenderSceneConverter::RemoveScene(KX_Scene *scene) size = m_polymaterials.size(); for (i=0, polymit=m_polymaterials.begin(); i<size; ) { if ((*polymit).first == scene) { - m_polymat_cache.erase((*polymit).second->GetBlenderMaterial()); + m_polymat_cache[scene].erase((*polymit).second->GetBlenderMaterial()); delete (*polymit).second; *polymit = m_polymaterials.back(); m_polymaterials.pop_back(); @@ -450,11 +450,13 @@ void KX_BlenderSceneConverter::RemoveScene(KX_Scene *scene) } } + m_polymat_cache.erase(scene); + vector<pair<KX_Scene*,BL_Material*> >::iterator matit; size = m_materials.size(); for (i=0, matit=m_materials.begin(); i<size; ) { if ((*matit).first == scene) { - m_mat_cache.erase((*matit).second->material); + m_mat_cache[scene].erase((*matit).second->material); delete (*matit).second; *matit = m_materials.back(); m_materials.pop_back(); @@ -465,6 +467,8 @@ void KX_BlenderSceneConverter::RemoveScene(KX_Scene *scene) } } + m_mat_cache.erase(scene); + vector<pair<KX_Scene*,RAS_MeshObject*> >::iterator meshit; size = m_meshobjects.size(); for (i=0, meshit=m_meshobjects.begin(); i<size; ) { @@ -603,26 +607,26 @@ void KX_BlenderSceneConverter::RegisterPolyMaterial(RAS_IPolyMaterial *polymat) m_polymaterials.push_back(pair<KX_Scene*,RAS_IPolyMaterial*>(m_currentScene,polymat)); } -void KX_BlenderSceneConverter::CachePolyMaterial(struct Material *mat, RAS_IPolyMaterial *polymat) +void KX_BlenderSceneConverter::CachePolyMaterial(KX_Scene *scene, Material *mat, RAS_IPolyMaterial *polymat) { if (m_use_mat_cache && mat) - m_polymat_cache[mat] = polymat; + m_polymat_cache[scene][mat] = polymat; } -RAS_IPolyMaterial *KX_BlenderSceneConverter::FindCachedPolyMaterial(struct Material *mat) +RAS_IPolyMaterial *KX_BlenderSceneConverter::FindCachedPolyMaterial(KX_Scene *scene, struct Material *mat) { - return (m_use_mat_cache) ? m_polymat_cache[mat] : NULL; + return (m_use_mat_cache) ? m_polymat_cache[scene][mat] : NULL; } -void KX_BlenderSceneConverter::CacheBlenderMaterial(struct Material *mat, BL_Material *blmat) +void KX_BlenderSceneConverter::CacheBlenderMaterial(KX_Scene *scene, struct Material *mat, BL_Material *blmat) { if (m_use_mat_cache && mat) - m_mat_cache[mat] = blmat; + m_mat_cache[scene][mat] = blmat; } -BL_Material *KX_BlenderSceneConverter::FindCachedBlenderMaterial(struct Material *mat) +BL_Material *KX_BlenderSceneConverter::FindCachedBlenderMaterial(KX_Scene *scene, struct Material *mat) { - return (m_use_mat_cache) ? m_mat_cache[mat] : NULL; + return (m_use_mat_cache) ? m_mat_cache[scene][mat] : NULL; } void KX_BlenderSceneConverter::RegisterInterpolatorList( @@ -1262,6 +1266,8 @@ bool KX_BlenderSceneConverter::FreeBlendFile(struct Main *maggie) KX_Scene* scene = scenes->at(scene_idx); if (IS_TAGGED(scene->GetBlenderScene())) { m_ketsjiEngine->RemoveScene(scene->GetName()); + m_mat_cache.erase(scene); + m_polymat_cache.erase(scene); scene_idx--; numScenes--; } @@ -1456,7 +1462,6 @@ bool KX_BlenderSceneConverter::FreeBlendFile(struct Main *maggie) } if (IS_TAGGED(bmat)) { - m_polymat_cache.erase((*polymit).second->GetBlenderMaterial()); delete (*polymit).second; *polymit = m_polymaterials.back(); m_polymaterials.pop_back(); @@ -1474,7 +1479,6 @@ bool KX_BlenderSceneConverter::FreeBlendFile(struct Main *maggie) for (i=0, matit=m_materials.begin(); i<size; ) { BL_Material *mat= (*matit).second; if (IS_TAGGED(mat->material)) { - m_mat_cache.erase((*matit).second->material); delete (*matit).second; *matit = m_materials.back(); m_materials.pop_back(); diff --git a/source/gameengine/Converter/KX_BlenderSceneConverter.h b/source/gameengine/Converter/KX_BlenderSceneConverter.h index 06dac1707c5..7ed75ad7614 100644 --- a/source/gameengine/Converter/KX_BlenderSceneConverter.h +++ b/source/gameengine/Converter/KX_BlenderSceneConverter.h @@ -53,6 +53,10 @@ class BL_Material; struct Main; struct Scene; struct ThreadInfo; +struct Material; + +typedef map<KX_Scene*, map<Material*, BL_Material*> > MaterialCache; +typedef map<KX_Scene*, map<Material*, RAS_IPolyMaterial*> > PolyMaterialCache; class KX_BlenderSceneConverter : public KX_ISceneConverter { @@ -66,8 +70,8 @@ class KX_BlenderSceneConverter : public KX_ISceneConverter ThreadInfo *m_threadinfo; // Cached material conversions - map<struct Material*, BL_Material*> m_mat_cache; - map<struct Material*, RAS_IPolyMaterial*> m_polymat_cache; + MaterialCache m_mat_cache; + PolyMaterialCache m_polymat_cache; // Saved KX_LibLoadStatus objects map<char *, class KX_LibLoadStatus*> m_status_map; @@ -126,12 +130,12 @@ public: RAS_MeshObject *FindGameMesh(struct Mesh *for_blendermesh/*, unsigned int onlayer*/); void RegisterPolyMaterial(RAS_IPolyMaterial *polymat); - void CachePolyMaterial(struct Material *mat, RAS_IPolyMaterial *polymat); - RAS_IPolyMaterial *FindCachedPolyMaterial(struct Material *mat); + void CachePolyMaterial(KX_Scene *scene, Material *mat, RAS_IPolyMaterial *polymat); + RAS_IPolyMaterial *FindCachedPolyMaterial(KX_Scene *scene, Material *mat); void RegisterBlenderMaterial(BL_Material *mat); - void CacheBlenderMaterial(struct Material *mat, BL_Material *blmat); - BL_Material *FindCachedBlenderMaterial(struct Material *mat); + void CacheBlenderMaterial(KX_Scene *scene, Material *mat, BL_Material *blmat); + BL_Material *FindCachedBlenderMaterial(KX_Scene *scene, Material *mat); void RegisterInterpolatorList(BL_InterpolatorList *actList, struct bAction *for_act); BL_InterpolatorList *FindInterpolatorList(struct bAction *for_act); |