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;}
 

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to