[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [59196] trunk/blender/source/gameengine: BGE: Adding partial support for LibLoaded lights with GLSL materials.

Mitchell Stokes mogurijin at gmail.com
Sat Aug 17 06:37:28 CEST 2013


Revision: 59196
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=59196
Author:   moguri
Date:     2013-08-17 04:37:25 +0000 (Sat, 17 Aug 2013)
Log Message:
-----------
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.

Modified Paths:
--------------
    trunk/blender/source/gameengine/Ketsji/BL_BlenderShader.h
    trunk/blender/source/gameengine/Ketsji/KX_BlenderMaterial.cpp
    trunk/blender/source/gameengine/Ketsji/KX_Light.cpp
    trunk/blender/source/gameengine/Ketsji/KX_Light.h
    trunk/blender/source/gameengine/Ketsji/KX_Scene.cpp
    trunk/blender/source/gameengine/Rasterizer/RAS_BucketManager.cpp

Modified: trunk/blender/source/gameengine/Ketsji/BL_BlenderShader.h
===================================================================
--- trunk/blender/source/gameengine/Ketsji/BL_BlenderShader.h	2013-08-17 04:35:23 UTC (rev 59195)
+++ trunk/blender/source/gameengine/Ketsji/BL_BlenderShader.h	2013-08-17 04:37:25 UTC (rev 59196)
@@ -86,13 +86,6 @@
 	void ReloadMaterial();
 	int GetAlphaBlend();
 
-	void SetScene(KX_Scene *scene)
-	{
-		mScene = scene;
-		mBlenderScene = scene->GetBlenderScene();
-		ReloadMaterial();
-	}
-
 	bool Equals(BL_BlenderShader *blshader);
 	
 	

Modified: trunk/blender/source/gameengine/Ketsji/KX_BlenderMaterial.cpp
===================================================================
--- trunk/blender/source/gameengine/Ketsji/KX_BlenderMaterial.cpp	2013-08-17 04:35:23 UTC (rev 59195)
+++ trunk/blender/source/gameengine/Ketsji/KX_BlenderMaterial.cpp	2013-08-17 04:37:25 UTC (rev 59196)
@@ -808,9 +808,7 @@
 void KX_BlenderMaterial::Replace_IScene(SCA_IScene *val)
 {
 	mScene= static_cast<KX_Scene *>(val);
-	if (mBlenderShader)
-		mBlenderShader->SetScene(mScene);
-	
+
 	OnConstruction();
 }
 

Modified: trunk/blender/source/gameengine/Ketsji/KX_Light.cpp
===================================================================
--- trunk/blender/source/gameengine/Ketsji/KX_Light.cpp	2013-08-17 04:35:23 UTC (rev 59195)
+++ trunk/blender/source/gameengine/Ketsji/KX_Light.cpp	2013-08-17 04:37:25 UTC (rev 59196)
@@ -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 @@
 	m_rendertools->AddLight(&m_lightobj);
 	m_glsl = glsl;
 	m_blenderscene = ((KX_Scene*)sgReplicationInfo)->GetBlenderScene();
+	m_base = NULL;
 };
 
 
@@ -78,6 +82,11 @@
 	}
 
 	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::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;

Modified: trunk/blender/source/gameengine/Ketsji/KX_Light.h
===================================================================
--- trunk/blender/source/gameengine/Ketsji/KX_Light.h	2013-08-17 04:35:23 UTC (rev 59195)
+++ trunk/blender/source/gameengine/Ketsji/KX_Light.h	2013-08-17 04:37:25 UTC (rev 59196)
@@ -37,6 +37,7 @@
 
 struct GPULamp;
 struct Scene;
+struct Base;
 class KX_Camera;
 class RAS_IRasterizer;
 class RAS_IRenderTools;
@@ -50,6 +51,7 @@
 	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 @@
 	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; }
 

Modified: trunk/blender/source/gameengine/Ketsji/KX_Scene.cpp
===================================================================
--- trunk/blender/source/gameengine/Ketsji/KX_Scene.cpp	2013-08-17 04:35:23 UTC (rev 59195)
+++ trunk/blender/source/gameengine/Ketsji/KX_Scene.cpp	2013-08-17 04:37:25 UTC (rev 59196)
@@ -1953,8 +1953,6 @@
 
 	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 @@
 	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();

Modified: trunk/blender/source/gameengine/Rasterizer/RAS_BucketManager.cpp
===================================================================
--- trunk/blender/source/gameengine/Rasterizer/RAS_BucketManager.cpp	2013-08-17 04:35:23 UTC (rev 59195)
+++ trunk/blender/source/gameengine/Rasterizer/RAS_BucketManager.cpp	2013-08-17 04:37:25 UTC (rev 59196)
@@ -378,17 +378,10 @@
 {
 	/* 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());




More information about the Bf-blender-cvs mailing list