BGE: When dynamically loading scenes (bge.logic.LibLoad()) in GLSL mode, the lights in the loaded scene would not affect the current scene and vice versa. To fix this, I've updated to merge code to update the scenes that the shaders are using to the scene being merged into.

This commit is contained in:
Mitchell Stokes 2010-06-16 19:07:20 +00:00
parent dd3513e362
commit 08a94f9bbd
5 changed files with 19 additions and 3 deletions

@ -56,6 +56,13 @@ public:
void ReloadMaterial(); void ReloadMaterial();
int GetBlendMode(); int GetBlendMode();
void SetScene(KX_Scene *scene)
{
mScene = scene;
mBlenderScene = scene->GetBlenderScene();
ReloadMaterial();
}
bool Equals(BL_BlenderShader *blshader); bool Equals(BL_BlenderShader *blshader);

@ -89,6 +89,7 @@ public:
virtual void Replace_IScene(SCA_IScene *val) virtual void Replace_IScene(SCA_IScene *val)
{ {
mScene= static_cast<KX_Scene *>(val); mScene= static_cast<KX_Scene *>(val);
mBlenderShader->SetScene(mScene);
}; };
#ifndef DISABLE_PYTHON #ifndef DISABLE_PYTHON

@ -1754,7 +1754,7 @@ bool KX_Scene::MergeScene(KX_Scene *other)
} }
GetBucketManager()->MergeBucketManager(other->GetBucketManager()); GetBucketManager()->MergeBucketManager(other->GetBucketManager(), this);
/* move materials across, assume they both use the same scene-converters */ /* move materials across, assume they both use the same scene-converters */
GetSceneConverter()->MergeScene(this, other); GetSceneConverter()->MergeScene(this, other);

@ -346,13 +346,21 @@ void RAS_BucketManager::RemoveMaterial(RAS_IPolyMaterial * mat)
//#include <stdio.h> //#include <stdio.h>
void RAS_BucketManager::MergeBucketManager(RAS_BucketManager *other) void RAS_BucketManager::MergeBucketManager(RAS_BucketManager *other, SCA_IScene *scene)
{ {
/* concatinate lists */ /* concatinate lists */
// printf("BEFORE %d %d\n", GetSolidBuckets().size(), GetAlphaBuckets().size()); // printf("BEFORE %d %d\n", GetSolidBuckets().size(), GetAlphaBuckets().size());
BucketList::iterator it;
for (it = other->GetSolidBuckets().begin(); it != other->GetSolidBuckets().end(); ++it)
(*it)->GetPolyMaterial()->Replace_IScene(scene);
GetSolidBuckets().insert( GetSolidBuckets().end(), other->GetSolidBuckets().begin(), other->GetSolidBuckets().end() ); GetSolidBuckets().insert( GetSolidBuckets().end(), other->GetSolidBuckets().begin(), other->GetSolidBuckets().end() );
other->GetSolidBuckets().clear(); other->GetSolidBuckets().clear();
for (it = other->GetAlphaBuckets().begin(); it != other->GetAlphaBuckets().end(); ++it)
(*it)->GetPolyMaterial()->Replace_IScene(scene);
GetAlphaBuckets().insert( GetAlphaBuckets().end(), other->GetAlphaBuckets().begin(), other->GetAlphaBuckets().end() ); GetAlphaBuckets().insert( GetAlphaBuckets().end(), other->GetAlphaBuckets().begin(), other->GetAlphaBuckets().end() );
other->GetAlphaBuckets().clear(); other->GetAlphaBuckets().clear();
//printf("AFTER %d %d\n", GetSolidBuckets().size(), GetAlphaBuckets().size()); //printf("AFTER %d %d\n", GetSolidBuckets().size(), GetAlphaBuckets().size());

@ -63,7 +63,7 @@ public:
void RemoveMaterial(RAS_IPolyMaterial * mat); // freeing scenes only void RemoveMaterial(RAS_IPolyMaterial * mat); // freeing scenes only
/* for merging */ /* for merging */
void MergeBucketManager(RAS_BucketManager *other); void MergeBucketManager(RAS_BucketManager *other, SCA_IScene *scene);
BucketList & GetSolidBuckets() {return m_SolidBuckets;}; BucketList & GetSolidBuckets() {return m_SolidBuckets;};
BucketList & GetAlphaBuckets() {return m_AlphaBuckets;}; BucketList & GetAlphaBuckets() {return m_AlphaBuckets;};