BGE: Adding partial support for LibLoaded lights with GLSL materials.
authorMitchell Stokes <mogurijin@gmail.com>
Sat, 17 Aug 2013 04:37:25 +0000 (04:37 +0000)
committerMitchell Stokes <mogurijin@gmail.com>
Sat, 17 Aug 2013 04:37:25 +0000 (04:37 +0000)
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.

source/gameengine/Ketsji/BL_BlenderShader.h
source/gameengine/Ketsji/KX_BlenderMaterial.cpp
source/gameengine/Ketsji/KX_Light.cpp
source/gameengine/Ketsji/KX_Light.h
source/gameengine/Ketsji/KX_Scene.cpp
source/gameengine/Rasterizer/RAS_BucketManager.cpp

index 71f66c2a49dab843aa5d128b7e30d92f399aa4c4..6d56c06e090aa59cd35b957aba62cd6eb3f3324f 100644 (file)
@@ -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);
        
        
index 28abdc898ae5d5e8b8bf882e144f51228298002b..b3a38cb4f98f93b17f43b1851cf5d26bf7377da0 100644 (file)
@@ -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();
 }
 
index a8f309cc592ce91a141c2d357fd6ddbecafc9b11..0e4db0d351e661babc9187e5d8ccef74f16633b3 100644 (file)
@@ -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;
index f88fc7f6a1bbb9c8af1e13b760e6ee4bf4a4a302..43421a3faf37c4399d419a2e240626ebb52a2b5a 100644 (file)
@@ -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; }
 
index 35084061ab05a2b851bf461dacf80cefbab8300d..0b90e0227c886f758297e3060544f5b107233de0 100644 (file)
@@ -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();
index 7d1190bef5ca000854eb27df8f88811b3b456982..713d324bf17e392b21763a0ae847b9ba313c127b 100644 (file)
@@ -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());