[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