[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [37743] branches/soc-2011-cucumber: Adding in the blender light pool to KX_Light to give it some blender lights to use with dynamic lights .

Daniel Stokes kupomail at gmail.com
Thu Jun 23 06:17:30 CEST 2011


Revision: 37743
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=37743
Author:   kupoman
Date:     2011-06-23 04:17:25 +0000 (Thu, 23 Jun 2011)
Log Message:
-----------
Adding in the blender light pool to KX_Light to give it some blender lights to use with dynamic lights. Dynamic lights created via replication now light the scene.

Modified Paths:
--------------
    branches/soc-2011-cucumber/release/scripts/startup/bl_ui/properties_game.py
    branches/soc-2011-cucumber/source/blender/makesdna/DNA_scene_types.h
    branches/soc-2011-cucumber/source/blender/makesrna/intern/rna_scene.c
    branches/soc-2011-cucumber/source/gameengine/Converter/KX_BlenderSceneConverter.cpp
    branches/soc-2011-cucumber/source/gameengine/Ketsji/KX_Light.cpp
    branches/soc-2011-cucumber/source/gameengine/Ketsji/KX_Light.h

Modified: branches/soc-2011-cucumber/release/scripts/startup/bl_ui/properties_game.py
===================================================================
--- branches/soc-2011-cucumber/release/scripts/startup/bl_ui/properties_game.py	2011-06-22 17:53:04 UTC (rev 37742)
+++ branches/soc-2011-cucumber/release/scripts/startup/bl_ui/properties_game.py	2011-06-23 04:17:25 UTC (rev 37743)
@@ -384,6 +384,9 @@
         row = layout.row()
         row.label("Exit Key")
         row.prop(gs, "exit_key", text="", event=True)
+        
+        row = layout.row()
+        row.prop(gs, "dynamic_lights")
 
 
 class RENDER_PT_game_display(RenderButtonsPanel, bpy.types.Panel):

Modified: branches/soc-2011-cucumber/source/blender/makesdna/DNA_scene_types.h
===================================================================
--- branches/soc-2011-cucumber/source/blender/makesdna/DNA_scene_types.h	2011-06-22 17:53:04 UTC (rev 37742)
+++ branches/soc-2011-cucumber/source/blender/makesdna/DNA_scene_types.h	2011-06-23 04:17:25 UTC (rev 37743)
@@ -434,11 +434,12 @@
 	 * bit 3: (gameengine): Activity culling is enabled.
 	 * bit 5: (gameengine) : enable Bullet DBVT tree for view frustrum culling
 	*/
-	short mode, flag, matmode, pad[2];
+	short mode, flag, matmode, pad[1];
 	short occlusionRes;		/* resolution of occlusion Z buffer in pixel */
 	short physicsEngine;
 	short ticrate, maxlogicstep, physubstep, maxphystep;
 	short exitkey;
+	short dynlights;
 
 	/*  standalone player */
 	struct GameFraming framing;

Modified: branches/soc-2011-cucumber/source/blender/makesrna/intern/rna_scene.c
===================================================================
--- branches/soc-2011-cucumber/source/blender/makesrna/intern/rna_scene.c	2011-06-22 17:53:04 UTC (rev 37742)
+++ branches/soc-2011-cucumber/source/blender/makesrna/intern/rna_scene.c	2011-06-23 04:17:25 UTC (rev 37743)
@@ -1715,6 +1715,13 @@
 	RNA_def_property_enum_funcs(prop, NULL, "rna_GameSettings_exit_key_set", NULL);
 	RNA_def_property_ui_text(prop, "Exit Key",  "Sets the key that exits the Game Engine");
 	RNA_def_property_update(prop, NC_SCENE, NULL);
+
+	prop= RNA_def_property(srna, "dynamic_lights", PROP_INT, PROP_NONE);
+	RNA_def_property_int_sdna(prop, NULL, "dynlights");
+	RNA_def_property_range(prop, 0, 100);
+	RNA_def_property_ui_range(prop, 0, 15, 1, 1);
+	RNA_def_property_ui_text(prop, "Dynamic Lights", "Number of lights available for dynamic use");
+	RNA_def_property_update(prop, NC_SCENE, NULL);
 	
 	// Do we need it here ? (since we already have it in World
 	prop= RNA_def_property(srna, "frequency", PROP_INT, PROP_NONE);

Modified: branches/soc-2011-cucumber/source/gameengine/Converter/KX_BlenderSceneConverter.cpp
===================================================================
--- branches/soc-2011-cucumber/source/gameengine/Converter/KX_BlenderSceneConverter.cpp	2011-06-22 17:53:04 UTC (rev 37742)
+++ branches/soc-2011-cucumber/source/gameengine/Converter/KX_BlenderSceneConverter.cpp	2011-06-23 04:17:25 UTC (rev 37743)
@@ -36,6 +36,7 @@
 #endif
 
 #include "KX_Scene.h"
+#include "KX_Light.h"
 #include "KX_GameObject.h"
 #include "KX_BlenderSceneConverter.h"
 #include "KX_IpoConvert.h"
@@ -330,6 +331,9 @@
 				physics_engine = UseNone;
 			}
 		}
+
+		if (m_useglslmat)
+			KX_LightObject::InitBlenderLightPool(blenderscene->gm.dynlights, blenderscene);
 	}
 
 	switch (physics_engine)
@@ -454,6 +458,8 @@
 			meshit++;
 		}
 	}
+
+	KX_LightObject::FreeBlenderLightPool();
 }
 
 // use blender materials

Modified: branches/soc-2011-cucumber/source/gameengine/Ketsji/KX_Light.cpp
===================================================================
--- branches/soc-2011-cucumber/source/gameengine/Ketsji/KX_Light.cpp	2011-06-22 17:53:04 UTC (rev 37742)
+++ branches/soc-2011-cucumber/source/gameengine/Ketsji/KX_Light.cpp	2011-06-23 04:17:25 UTC (rev 37743)
@@ -47,6 +47,22 @@
 #include "DNA_object_types.h"
 #include "DNA_scene_types.h"
 #include "GPU_material.h"
+
+#include "MEM_guardedalloc.h"
+
+extern "C"
+{
+#include "BKE_object.h"
+#include "BKE_scene.h"
+#include "BKE_library.h"
+#include "BKE_global.h"
+#include "BKE_main.h"
+#include "BLI_listbase.h"
+}
+
+static Scene* m_blenderlight_scene = NULL;
+static int m_blenderlight_count = 0;
+static std::vector<Object*> m_blenderlight_pool = vector<Object*>();
  
 KX_LightObject::KX_LightObject(void* sgReplicationInfo,SG_Callbacks callbacks,
 							   class RAS_IRenderTools* rendertools,
@@ -61,12 +77,14 @@
 	m_rendertools->AddLight(&m_lightobj);
 	m_glsl = glsl;
 	m_blenderscene = ((KX_Scene*)sgReplicationInfo)->GetBlenderScene();
+	m_dynamic = false;
 };
 
 
 KX_LightObject::~KX_LightObject()
 {
 	GPULamp *lamp;
+	Object* obj;
 
 	if((lamp = GetGPULamp())) {
 		float obmat[4][4] = {{0}};
@@ -74,6 +92,10 @@
 	}
 
 	m_rendertools->RemoveLight(&m_lightobj);
+
+	obj=GetBlenderObject();
+	if (m_dynamic && obj)
+		checkin_blenderlight(obj);
 }
 
 
@@ -87,6 +109,9 @@
 	replica->m_lightobj.m_light = replica;
 	m_rendertools->AddLight(&replica->m_lightobj);
 
+	replica->SetBlenderObject(checkout_blenderlight());
+	replica->m_dynamic = true;
+
 	return replica;
 }
 
@@ -182,7 +207,7 @@
 
 GPULamp *KX_LightObject::GetGPULamp()
 {
-	if(m_glsl)
+	if(m_glsl && GetBlenderObject())
 		return GPU_lamp_from_blender(m_blenderscene, GetBlenderObject(), GetBlenderGroupObject());
 	else
 		return NULL;
@@ -264,6 +289,66 @@
 	GPU_lamp_shadow_buffer_unbind(lamp);
 }
 
+void KX_LightObject::InitBlenderLightPool(int count, Scene *scene)
+{
+	Lamp* la;
+
+	m_blenderlight_scene = scene;
+	m_blenderlight_count = count;
+	m_blenderlight_pool.resize(m_blenderlight_count);
+
+	for (int i = 0; i < m_blenderlight_count; ++i)
+	{
+		m_blenderlight_pool[i] = add_object(m_blenderlight_scene, OB_LAMP);
+		la = (Lamp*)m_blenderlight_pool[i]->data;
+
+		la->energy = 0;
+	}
+
+	GPU_materials_free();
+}
+
+Object* KX_LightObject::checkout_blenderlight()
+{
+
+	if (m_blenderlight_pool.size() == 0)
+		return NULL; //Sorry, out of lights :(
+
+	Object* obj = m_blenderlight_pool.back();
+	m_blenderlight_pool.pop_back();
+	return obj;
+}
+
+void KX_LightObject::checkin_blenderlight(Object* lamp)
+{
+	m_blenderlight_pool.push_back(lamp);
+}
+
+void KX_LightObject::FreeBlenderLightPool()
+{
+	Base *base;
+	unsigned int i = 0;
+	
+	if (m_blenderlight_pool.size() != m_blenderlight_count)
+	{
+		printf("Light pool still has lights checked out. Not all dynamic lights have been destroyed\n");
+		return;
+	}
+
+	for (int i = 0; i < m_blenderlight_count; ++i)
+	{
+		base = object_in_scene(m_blenderlight_pool[i], m_blenderlight_scene);
+		BLI_remlink(&m_blenderlight_scene->base, base);
+		free_libblock_us(&G.main->object, base->object);
+		if(m_blenderlight_scene->basact==base) m_blenderlight_scene->basact=NULL;
+		MEM_freeN(base);
+	}
+
+	m_blenderlight_count = 0;
+
+	//GPU_materials_free();
+}
+
 #ifdef WITH_PYTHON
 /* ------------------------------------------------------------------------- */
 /* Python Integration Hooks					                                 */

Modified: branches/soc-2011-cucumber/source/gameengine/Ketsji/KX_Light.h
===================================================================
--- branches/soc-2011-cucumber/source/gameengine/Ketsji/KX_Light.h	2011-06-22 17:53:04 UTC (rev 37742)
+++ branches/soc-2011-cucumber/source/gameengine/Ketsji/KX_Light.h	2011-06-23 04:17:25 UTC (rev 37743)
@@ -36,6 +36,7 @@
 
 #include "RAS_LightObject.h"
 #include "KX_GameObject.h"
+#include "DNA_lamp_types.h"
 
 struct GPULamp;
 struct Scene;
@@ -53,6 +54,10 @@
 	bool				m_glsl;
 	Scene*				m_blenderscene;
 
+	bool				m_dynamic;
+	Object* checkout_blenderlight();
+	void checkin_blenderlight(Object* lamp);
+
 public:
 	KX_LightObject(void* sgReplicationInfo,SG_Callbacks callbacks,class RAS_IRenderTools* rendertools,const struct RAS_LightObject&	lightobj, bool glsl);
 	virtual ~KX_LightObject();
@@ -69,6 +74,10 @@
 	void BindShadowBuffer(class RAS_IRasterizer *ras, class KX_Camera *cam, class MT_Transform& camtrans);
 	void UnbindShadowBuffer(class RAS_IRasterizer *ras);
 	void Update();
+
+	/* Light Pool */
+	static void InitBlenderLightPool(int count, Scene *scene);
+	static void FreeBlenderLightPool();
 	
 	void UpdateScene(class KX_Scene *kxscene) {m_lightobj.m_scene = (void*)kxscene;}
 




More information about the Bf-blender-cvs mailing list