diff options
author | Mitchell Stokes <mogurijin@gmail.com> | 2013-08-17 08:37:25 +0400 |
---|---|---|
committer | Mitchell Stokes <mogurijin@gmail.com> | 2013-08-17 08:37:25 +0400 |
commit | 82c845425f0a5e2805ed7e9f6cb74920fa96229f (patch) | |
tree | 04d6b5fe7db2952b1a402aa2219637b2f4b810f6 | |
parent | 51bca0d7dc8fb5033778796e14dd01c1c7f4355a (diff) |
BGE: Adding partial support for LibLoaded lights with GLSL materials.
Any GLSL materials loaded after lights are LibLoaded will now use the lights in
heir shaders. This includes materials loaded from the same scene as the LibLoaded
lights. We could later add a new flag to LibLoad to recompile all existing shaders,
but this commit should offer a lot more flexibility as is.
-rw-r--r-- | source/gameengine/Ketsji/BL_BlenderShader.h | 7 | ||||
-rw-r--r-- | source/gameengine/Ketsji/KX_BlenderMaterial.cpp | 4 | ||||
-rw-r--r-- | source/gameengine/Ketsji/KX_Light.cpp | 16 | ||||
-rw-r--r-- | source/gameengine/Ketsji/KX_Light.h | 4 | ||||
-rw-r--r-- | source/gameengine/Ketsji/KX_Scene.cpp | 9 | ||||
-rw-r--r-- | source/gameengine/Rasterizer/RAS_BucketManager.cpp | 7 |
6 files changed, 26 insertions, 21 deletions
diff --git a/source/gameengine/Ketsji/BL_BlenderShader.h b/source/gameengine/Ketsji/BL_BlenderShader.h index 71f66c2a49d..6d56c06e090 100644 --- a/source/gameengine/Ketsji/BL_BlenderShader.h +++ b/source/gameengine/Ketsji/BL_BlenderShader.h @@ -86,13 +86,6 @@ public: void ReloadMaterial(); int GetAlphaBlend(); - void SetScene(KX_Scene *scene) - { - mScene = scene; - mBlenderScene = scene->GetBlenderScene(); - ReloadMaterial(); - } - bool Equals(BL_BlenderShader *blshader); diff --git a/source/gameengine/Ketsji/KX_BlenderMaterial.cpp b/source/gameengine/Ketsji/KX_BlenderMaterial.cpp index 28abdc898ae..b3a38cb4f98 100644 --- a/source/gameengine/Ketsji/KX_BlenderMaterial.cpp +++ b/source/gameengine/Ketsji/KX_BlenderMaterial.cpp @@ -808,9 +808,7 @@ void KX_BlenderMaterial::UpdateIPO( void KX_BlenderMaterial::Replace_IScene(SCA_IScene *val) { mScene= static_cast<KX_Scene *>(val); - if (mBlenderShader) - mBlenderShader->SetScene(mScene); - + OnConstruction(); } diff --git a/source/gameengine/Ketsji/KX_Light.cpp b/source/gameengine/Ketsji/KX_Light.cpp index a8f309cc592..0e4db0d351e 100644 --- a/source/gameengine/Ketsji/KX_Light.cpp +++ b/source/gameengine/Ketsji/KX_Light.cpp @@ -48,6 +48,9 @@ #include "DNA_scene_types.h" #include "DNA_lamp_types.h" #include "GPU_material.h" + +#include "BKE_scene.h" +#include "MEM_guardedalloc.h" KX_LightObject::KX_LightObject(void* sgReplicationInfo,SG_Callbacks callbacks, class RAS_IRenderTools* rendertools, @@ -62,6 +65,7 @@ KX_LightObject::KX_LightObject(void* sgReplicationInfo,SG_Callbacks callbacks, m_rendertools->AddLight(&m_lightobj); m_glsl = glsl; m_blenderscene = ((KX_Scene*)sgReplicationInfo)->GetBlenderScene(); + m_base = NULL; }; @@ -78,6 +82,11 @@ KX_LightObject::~KX_LightObject() } m_rendertools->RemoveLight(&m_lightobj); + + if (m_base) { + BKE_scene_base_unlink(m_blenderscene, m_base); + MEM_freeN(m_base); + } } @@ -216,6 +225,13 @@ void KX_LightObject::Update() } } +void KX_LightObject::UpdateScene(KX_Scene *kxscene) +{ + m_lightobj.m_scene = (void*)kxscene; + m_blenderscene = kxscene->GetBlenderScene(); + m_base = BKE_scene_base_add(m_blenderscene, GetBlenderObject()); +} + bool KX_LightObject::HasShadowBuffer() { GPULamp *lamp; diff --git a/source/gameengine/Ketsji/KX_Light.h b/source/gameengine/Ketsji/KX_Light.h index f88fc7f6a1b..43421a3faf3 100644 --- a/source/gameengine/Ketsji/KX_Light.h +++ b/source/gameengine/Ketsji/KX_Light.h @@ -37,6 +37,7 @@ struct GPULamp; struct Scene; +struct Base; class KX_Camera; class RAS_IRasterizer; class RAS_IRenderTools; @@ -50,6 +51,7 @@ protected: class RAS_IRenderTools* m_rendertools; //needed for registering and replication of lightobj bool m_glsl; Scene* m_blenderscene; + Base* m_base; public: KX_LightObject(void* sgReplicationInfo,SG_Callbacks callbacks,class RAS_IRenderTools* rendertools,const struct RAS_LightObject& lightobj, bool glsl); @@ -69,7 +71,7 @@ public: struct Image *GetTextureImage(short texslot); void Update(); - void UpdateScene(class KX_Scene *kxscene) {m_lightobj.m_scene = (void*)kxscene;} + void UpdateScene(class KX_Scene *kxscene); virtual int GetGameObjectType() { return OBJ_LIGHT; } diff --git a/source/gameengine/Ketsji/KX_Scene.cpp b/source/gameengine/Ketsji/KX_Scene.cpp index 35084061ab0..0b90e0227c8 100644 --- a/source/gameengine/Ketsji/KX_Scene.cpp +++ b/source/gameengine/Ketsji/KX_Scene.cpp @@ -1953,8 +1953,6 @@ bool KX_Scene::MergeScene(KX_Scene *other) GetBucketManager()->MergeBucketManager(other->GetBucketManager(), this); - /* move materials across, assume they both use the same scene-converters */ - GetSceneConverter()->MergeScene(this, other); /* active + inactive == all ??? - lets hope so */ for (int i = 0; i < other->GetObjectList()->GetCount(); i++) @@ -1991,7 +1989,12 @@ bool KX_Scene::MergeScene(KX_Scene *other) if (env) /* bullet scene? - dummy scenes don't need touching */ env->MergeEnvironment(env_other); #endif - + + /* move materials across, assume they both use the same scene-converters + * Do this after lights are merged so materials can use the lights in shaders + */ + GetSceneConverter()->MergeScene(this, other); + /* merge logic */ { SCA_LogicManager *logicmgr= GetLogicManager(); diff --git a/source/gameengine/Rasterizer/RAS_BucketManager.cpp b/source/gameengine/Rasterizer/RAS_BucketManager.cpp index 7d1190bef5c..713d324bf17 100644 --- a/source/gameengine/Rasterizer/RAS_BucketManager.cpp +++ b/source/gameengine/Rasterizer/RAS_BucketManager.cpp @@ -378,17 +378,10 @@ void RAS_BucketManager::MergeBucketManager(RAS_BucketManager *other, SCA_IScene { /* concatinate lists */ // 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() ); 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() ); other->GetAlphaBuckets().clear(); //printf("AFTER %d %d\n", GetSolidBuckets().size(), GetAlphaBuckets().size()); |