Changeset View
Changeset View
Standalone View
Standalone View
source/gameengine/Converter/KX_BlenderSceneConverter.cpp
| Context not available. | |||||
| #include <pthread.h> | #include <pthread.h> | ||||
| /* Helper function prototypes */ | |||||
| void removeCachedMaterial(MaterialCache &cache, KX_Scene* scene, BL_Material* materialToRemove); | |||||
| void removeCachedPolyMaterial(PolyMaterialCache &cache, KX_Scene* scene, RAS_IPolyMaterial* materialToRemove); | |||||
| /* This is used to avoid including pthread.h in KX_BlenderSceneConverter.h */ | /* This is used to avoid including pthread.h in KX_BlenderSceneConverter.h */ | ||||
| typedef struct ThreadInfo { | typedef struct ThreadInfo { | ||||
| vector<pthread_t> threads; | vector<pthread_t> threads; | ||||
| Context not available. | |||||
| /* merge into the base scene */ | /* merge into the base scene */ | ||||
| KX_Scene* other= m_ketsjiEngine->CreateScene((Scene *)scene, true); | KX_Scene* other= m_ketsjiEngine->CreateScene((Scene *)scene, true); | ||||
| scene_merge->MergeScene(other); | scene_merge->MergeScene(other); | ||||
| // RemoveScene(other); // Don't run this, it frees the entire scene converter data, just delete the scene | // RemoveScene(other); // Don't run this, it frees the entire scene converter data, just delete the scene | ||||
| m_polymat_cache.erase(other); | |||||
| m_mat_cache.erase(other); | |||||
| delete other; | delete other; | ||||
| } | } | ||||
| } | } | ||||
| Context not available. | |||||
| KX_Scene* scene = scenes->at(scene_idx); | KX_Scene* scene = scenes->at(scene_idx); | ||||
| if (IS_TAGGED(scene->GetBlenderScene())) { | if (IS_TAGGED(scene->GetBlenderScene())) { | ||||
| m_ketsjiEngine->RemoveScene(scene->GetName()); | m_ketsjiEngine->RemoveScene(scene->GetName()); | ||||
| m_mat_cache.erase(scene); | m_mat_cache.erase(scene);//<-- this is not called for the scene LibLoaded because that is merged with the active one | ||||
| m_polymat_cache.erase(scene); | m_polymat_cache.erase(scene);//<-- same. Values that are still here cause SIGSEGV when LibLoad/LibFree-ing | ||||
| scene_idx--; | scene_idx--; | ||||
| numScenes--; | numScenes--; | ||||
| } | } | ||||
| Context not available. | |||||
| } | } | ||||
| if (IS_TAGGED(bmat)) { | if (IS_TAGGED(bmat)) { | ||||
| delete (*polymit).second; | removeCachedPolyMaterial(m_polymat_cache, (*polymit).first, (*polymit).second); | ||||
| delete (*polymit).second; //<--- This might still be in this->m_polymat_cache | |||||
| *polymit = m_polymaterials.back(); | *polymit = m_polymaterials.back(); | ||||
| m_polymaterials.pop_back(); | m_polymaterials.pop_back(); | ||||
| size--; | size--; | ||||
| Context not available. | |||||
| for (i=0, matit=m_materials.begin(); i<size; ) { | for (i=0, matit=m_materials.begin(); i<size; ) { | ||||
| BL_Material *mat= (*matit).second; | BL_Material *mat= (*matit).second; | ||||
| if (IS_TAGGED(mat->material)) { | if (IS_TAGGED(mat->material)) { | ||||
| delete (*matit).second; | removeCachedMaterial(m_mat_cache, (*matit).first, (*matit).second); | ||||
| delete (*matit).second;//<--- This might still be in this->m_mat_cache | |||||
| *matit = m_materials.back(); | *matit = m_materials.back(); | ||||
| m_materials.pop_back(); | m_materials.pop_back(); | ||||
| size--; | size--; | ||||
| Context not available. | |||||
| m_map_mesh_to_gamemesh.clear(); /* This is at runtime so no need to keep this, BL_ConvertMesh adds */ | m_map_mesh_to_gamemesh.clear(); /* This is at runtime so no need to keep this, BL_ConvertMesh adds */ | ||||
| return meshobj; | return meshobj; | ||||
| } | } | ||||
| /* Helper function implementations */ | |||||
| void removeCachedMaterial(MaterialCache &cache, KX_Scene* scene, BL_Material* materialToRemove) | |||||
| { | |||||
| for(MaterialCache::iterator it = cache.begin(); it != cache.end(); ++it) | |||||
| { | |||||
| std::map<Material*, BL_Material*> materials = it->second; | |||||
| std::vector<Material*> removableKeys; | |||||
| for(std::map<Material*, BL_Material*>::iterator matit = materials.begin(); | |||||
| matit != materials.end(); | |||||
| ++matit) | |||||
| { | |||||
| const bool isRemovable = (matit->second == materialToRemove); | |||||
| if(isRemovable) | |||||
| { | |||||
| removableKeys.push_back(matit->first); | |||||
| } | |||||
| } | |||||
| for(std::size_t i = 0; i < removableKeys.size(); i++) | |||||
| { | |||||
| Material* key = removableKeys[i]; | |||||
| materials.erase(key); | |||||
| } | |||||
| } | |||||
| } | |||||
| void removeCachedPolyMaterial(PolyMaterialCache &cache, KX_Scene* scene, RAS_IPolyMaterial* materialToRemove) | |||||
| { | |||||
| for(PolyMaterialCache::iterator it = cache.begin(); it != cache.end(); ++it) | |||||
| { | |||||
| std::map<Material*, RAS_IPolyMaterial*> materials = it->second; | |||||
| std::vector<Material*> removableKeys; | |||||
| for(std::map<Material*, RAS_IPolyMaterial*>::iterator matit = materials.begin(); | |||||
| matit != materials.end(); | |||||
| ++matit) | |||||
| { | |||||
| const bool isRemovable = (matit->second == materialToRemove); | |||||
| if(isRemovable) | |||||
| { | |||||
| removableKeys.push_back(matit->first); | |||||
| } | |||||
| } | |||||
| for(std::size_t i = 0; i < removableKeys.size(); i++) | |||||
| { | |||||
| Material* key = removableKeys[i]; | |||||
| materials.erase(key); | |||||
| } | |||||
| } | |||||
| } | |||||
| Context not available. | |||||