[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [37805] branches/soc-2011-cucumber: Adding support and UI options for dynamic spot, sun, hemi, and are lights.

Daniel Stokes kupomail at gmail.com
Sat Jun 25 07:00:58 CEST 2011


Revision: 37805
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=37805
Author:   kupoman
Date:     2011-06-25 05:00:55 +0000 (Sat, 25 Jun 2011)
Log Message:
-----------
Adding support and UI options for dynamic spot, sun, hemi, and are lights. Currently area lights don't work in the BGE so the UI option is commented out, but everything should be ready to go if this ever changes.

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/BL_BlenderDataConversion.cpp
    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
    branches/soc-2011-cucumber/source/gameengine/Rasterizer/RAS_LightObject.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-25 02:10:13 UTC (rev 37804)
+++ branches/soc-2011-cucumber/release/scripts/startup/bl_ui/properties_game.py	2011-06-25 05:00:55 UTC (rev 37805)
@@ -355,6 +355,15 @@
         layout.prop(gs, "material_mode", expand=True)
 
         if gs.material_mode == 'GLSL':
+            col = layout.column(align=True)
+            col.prop(gs, "dynamic_points")
+            col.prop(gs, "dynamic_spots")
+            col.prop(gs, "dynamic_suns")
+            col.prop(gs, "dynamic_hemis")
+            
+            # When area lights work in the BGE, this should be ready
+            # col.prop(gs, "dynamic_areas")
+            
             split = layout.split()
 
             col = split.column()
@@ -367,8 +376,7 @@
             col.prop(gs, "use_glsl_ramps", text="Ramps")
             col.prop(gs, "use_glsl_nodes", text="Nodes")
             col.prop(gs, "use_glsl_extra_textures", text="Extra Textures")
-
-
+            
 class RENDER_PT_game_system(RenderButtonsPanel, bpy.types.Panel):
     bl_label = "System"
     COMPAT_ENGINES = {'BLENDER_GAME'}
@@ -384,9 +392,6 @@
         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-25 02:10:13 UTC (rev 37804)
+++ branches/soc-2011-cucumber/source/blender/makesdna/DNA_scene_types.h	2011-06-25 05:00:55 UTC (rev 37805)
@@ -439,8 +439,14 @@
 	short physicsEngine;
 	short ticrate, maxlogicstep, physubstep, maxphystep;
 	short exitkey;
-	short dynlights;
 
+	/* Dynamic Lights */
+	short dynpoints;
+	short dynspots;
+	short dynsuns;
+	short dynhemis;
+	short dynareas;
+
 	/*  standalone player */
 	struct GameFraming framing;
 	short fullscreen, xplay, yplay, freqplay;

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-25 02:10:13 UTC (rev 37804)
+++ branches/soc-2011-cucumber/source/blender/makesrna/intern/rna_scene.c	2011-06-25 05:00:55 UTC (rev 37805)
@@ -1715,13 +1715,6 @@
 	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);
@@ -1735,6 +1728,42 @@
 	RNA_def_property_ui_text(prop, "Fullscreen", "Starts player in a new fullscreen display");
 	RNA_def_property_update(prop, NC_SCENE, NULL);
 
+	/* Dynamic Lights */
+	prop= RNA_def_property(srna, "dynamic_points", PROP_INT, PROP_NONE);
+	RNA_def_property_int_sdna(prop, NULL, "dynpoints");
+	RNA_def_property_range(prop, 0, 100);
+	RNA_def_property_ui_range(prop, 0, 15, 1, 1);
+	RNA_def_property_ui_text(prop, "Dynamic Point Lights", "Number of point lights available for dynamic use");
+	RNA_def_property_update(prop, NC_SCENE, NULL);
+
+	prop= RNA_def_property(srna, "dynamic_spots", PROP_INT, PROP_NONE);
+	RNA_def_property_int_sdna(prop, NULL, "dynspots");
+	RNA_def_property_range(prop, 0, 100);
+	RNA_def_property_ui_range(prop, 0, 15, 1, 1);
+	RNA_def_property_ui_text(prop, "Dynamic Spot Lights", "Number of spot lights available for dynamic use");
+	RNA_def_property_update(prop, NC_SCENE, NULL);
+
+	prop= RNA_def_property(srna, "dynamic_suns", PROP_INT, PROP_NONE);
+	RNA_def_property_int_sdna(prop, NULL, "dynsuns");
+	RNA_def_property_range(prop, 0, 100);
+	RNA_def_property_ui_range(prop, 0, 15, 1, 1);
+	RNA_def_property_ui_text(prop, "Dynamic Sun Lights", "Number of sun lights available for dynamic use");
+	RNA_def_property_update(prop, NC_SCENE, NULL);
+
+	prop= RNA_def_property(srna, "dynamic_hemis", PROP_INT, PROP_NONE);
+	RNA_def_property_int_sdna(prop, NULL, "dynhemis");
+	RNA_def_property_range(prop, 0, 100);
+	RNA_def_property_ui_range(prop, 0, 15, 1, 1);
+	RNA_def_property_ui_text(prop, "Dynamic Hemi Lights", "Number of hemi lights available for dynamic use");
+	RNA_def_property_update(prop, NC_SCENE, NULL);
+
+	prop= RNA_def_property(srna, "dynamic_areas", PROP_INT, PROP_NONE);
+	RNA_def_property_int_sdna(prop, NULL, "dynareas");
+	RNA_def_property_range(prop, 0, 100);
+	RNA_def_property_ui_range(prop, 0, 15, 1, 1);
+	RNA_def_property_ui_text(prop, "Dynamic Area Lights", "Number of area lights available for dynamic use");
+	RNA_def_property_update(prop, NC_SCENE, NULL);
+
 	/* Framing */
 	prop= RNA_def_property(srna, "frame_type", PROP_ENUM, PROP_NONE);
 	RNA_def_property_enum_sdna(prop, NULL, "framing.type");

Modified: branches/soc-2011-cucumber/source/gameengine/Converter/BL_BlenderDataConversion.cpp
===================================================================
--- branches/soc-2011-cucumber/source/gameengine/Converter/BL_BlenderDataConversion.cpp	2011-06-25 02:10:13 UTC (rev 37804)
+++ branches/soc-2011-cucumber/source/gameengine/Converter/BL_BlenderDataConversion.cpp	2011-06-25 05:00:55 UTC (rev 37805)
@@ -1850,7 +1850,11 @@
 		lightobj.m_type = RAS_LightObject::LIGHT_SUN;
 	} else if (la->type==LA_SPOT) {
 		lightobj.m_type = RAS_LightObject::LIGHT_SPOT;
-	} else {
+	} else if (la->type==LA_HEMI) {
+		lightobj.m_type = RAS_LightObject::LIGHT_HEMI;
+	} else if (la->type==LA_AREA) {
+		lightobj.m_type = RAS_LightObject::LIGHT_AREA;
+	}else {
 		lightobj.m_type = RAS_LightObject::LIGHT_NORMAL;
 	}
 

Modified: branches/soc-2011-cucumber/source/gameengine/Converter/KX_BlenderSceneConverter.cpp
===================================================================
--- branches/soc-2011-cucumber/source/gameengine/Converter/KX_BlenderSceneConverter.cpp	2011-06-25 02:10:13 UTC (rev 37804)
+++ branches/soc-2011-cucumber/source/gameengine/Converter/KX_BlenderSceneConverter.cpp	2011-06-25 05:00:55 UTC (rev 37805)
@@ -331,9 +331,6 @@
 				physics_engine = UseNone;
 			}
 		}
-
-		if (m_useglslmat)
-			KX_LightObject::InitBlenderLightPool(blenderscene->gm.dynlights, blenderscene);
 	}
 
 	switch (physics_engine)
@@ -369,6 +366,16 @@
 			break;
 	}
 
+	//For now this is before converting blender objects (which means the light pool gets converted to KX_lights that never get used)
+	//If this is moved after the conversion, things go crazy with materials since InitBlenderLightPool frees the materials
+	if(blenderscene && m_useglslmat)
+		KX_LightObject::InitBlenderLightPool(blenderscene,
+											blenderscene->gm.dynpoints,
+											blenderscene->gm.dynspots,
+											blenderscene->gm.dynsuns,
+											blenderscene->gm.dynhemis,
+											blenderscene->gm.dynareas);
+
 	BL_ConvertBlenderObjects(m_maggie,
 		destinationscene,
 		m_ketsjiEngine,

Modified: branches/soc-2011-cucumber/source/gameengine/Ketsji/KX_Light.cpp
===================================================================
--- branches/soc-2011-cucumber/source/gameengine/Ketsji/KX_Light.cpp	2011-06-25 02:10:13 UTC (rev 37804)
+++ branches/soc-2011-cucumber/source/gameengine/Ketsji/KX_Light.cpp	2011-06-25 05:00:55 UTC (rev 37805)
@@ -62,7 +62,12 @@
 
 static Scene* m_blenderlight_scene = NULL;
 static int m_blenderlight_count = 0;
-static std::vector<Object*> m_blenderlight_pool = vector<Object*>();
+
+static std::vector<Object*> m_blenderlight_points = vector<Object*>();
+static std::vector<Object*> m_blenderlight_spots = vector<Object*>();
+static std::vector<Object*> m_blenderlight_suns = vector<Object*>();
+static std::vector<Object*> m_blenderlight_hemis = vector<Object*>();
+static std::vector<Object*> m_blenderlight_areas = vector<Object*>();
  
 KX_LightObject::KX_LightObject(void* sgReplicationInfo,SG_Callbacks callbacks,
 							   class RAS_IRenderTools* rendertools,
@@ -291,59 +296,104 @@
 	GPU_lamp_shadow_buffer_unbind(lamp);
 }
 
-void KX_LightObject::InitBlenderLightPool(int count, Scene *scene)
+void init_subpool(Scene *scene, std::vector<Object*> *subpool, int count, short type)
 {
+	Lamp *la;
+	subpool->resize(count);
+	for (int i = 0; i < count; ++i)
+	{
+		subpool->at(i) = add_object(m_blenderlight_scene, OB_LAMP);
+		la = (Lamp*)subpool->at(i)->data;
+
+		la->type = type;
+		la->energy = 0;
+	}
+
+}
+
+void KX_LightObject::InitBlenderLightPool(Scene *scene, int point_count, int spot_count, int sun_count, int hemi_count, int area_count)
+{
 	Lamp* la;
 
+	//If the light pool is already built, there is no need to rebuild it.
+	if (m_blenderlight_count != 0)
+		return;
+
 	m_blenderlight_scene = scene;
-	m_blenderlight_count = count;
-	m_blenderlight_pool.resize(m_blenderlight_count);
+	m_blenderlight_count = point_count + spot_count + sun_count + hemi_count + area_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;
+	init_subpool(scene, &m_blenderlight_points, point_count, LA_LOCAL);
+	init_subpool(scene, &m_blenderlight_spots, spot_count, LA_SPOT);
+	init_subpool(scene, &m_blenderlight_suns, sun_count, LA_SUN);
+	init_subpool(scene, &m_blenderlight_hemis, hemi_count, LA_HEMI);
+	init_subpool(scene, &m_blenderlight_areas, area_count, LA_AREA);
 
-		la->energy = 0;
-	}
-
 	GPU_materials_free();
 }
 
+std::vector<Object*>* get_subpool(short type)
+{
+	if (type == RAS_LightObject::LIGHT_NORMAL)
+		return &m_blenderlight_points;
+	if (type == RAS_LightObject::LIGHT_SPOT)
+		return &m_blenderlight_spots;
+	if (type == RAS_LightObject::LIGHT_SUN)
+		return &m_blenderlight_suns;

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list