Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMitchell Stokes <mogurijin@gmail.com>2013-07-16 02:35:09 +0400
committerMitchell Stokes <mogurijin@gmail.com>2013-07-16 02:35:09 +0400
commitefc4b08094e520afd6598a13c8b586df4abcc45a (patch)
treee8e9a00380249b6a5919bcfcc158186f344277ca /source/gameengine/Converter/KX_BlenderSceneConverter.cpp
parent19dee5e413453cc4a2a98c17aaf39f00e04f7619 (diff)
BGE: Fix for [#36023] "Objects of added scene are lit by lights of current scene" reported by Raf Colson (raco).
The material caching now keeps a cache per scene. Before materials from different scenes were sharing the same cache.
Diffstat (limited to 'source/gameengine/Converter/KX_BlenderSceneConverter.cpp')
-rw-r--r--source/gameengine/Converter/KX_BlenderSceneConverter.cpp32
1 files changed, 18 insertions, 14 deletions
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();