forked from bartvdbraak/blender
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.
This commit is contained in:
parent
19dee5e413
commit
efc4b08094
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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();
|
||||
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user