Revision: 40894
          
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=40894
Author:   kupoman
Date:     2011-10-10 04:18:54 +0000 (Mon, 10 Oct 2011)
Log Message:
-----------
Fixing up dynamic lights a bit to better match behavior in Trunk:
* Removed some arguments and return types for some methods
* Added a forfeit_blenderlight method to allow an inactive light to add it's 
light to the light pool
* Added a wrapper struct to facilitate forfeiting lights

Modified Paths:
--------------
    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/source/gameengine/Ketsji/KX_Light.cpp
===================================================================
--- branches/soc-2011-cucumber/source/gameengine/Ketsji/KX_Light.cpp    
2011-10-10 04:16:16 UTC (rev 40893)
+++ branches/soc-2011-cucumber/source/gameengine/Ketsji/KX_Light.cpp    
2011-10-10 04:18:54 UTC (rev 40894)
@@ -60,14 +60,19 @@
 #include "BLI_listbase.h"
 }
 
+typedef struct PoolLight {
+       Object* blenderlight;
+       bool lock;
+} PoolLight;
+
 static Scene* m_blenderlight_scene = NULL;
 static int m_blenderlight_count = 0;
 
-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*>();
+static std::vector<PoolLight*> m_blenderlight_points = vector<PoolLight*>();
+static std::vector<PoolLight*> m_blenderlight_spots = vector<PoolLight*>();
+static std::vector<PoolLight*> m_blenderlight_suns = vector<PoolLight*>();
+static std::vector<PoolLight*> m_blenderlight_hemis = vector<PoolLight*>();
+static std::vector<PoolLight*> m_blenderlight_areas = vector<PoolLight*>();
  
 KX_LightObject::KX_LightObject(void* sgReplicationInfo,SG_Callbacks callbacks,
                                                           class 
RAS_IRenderTools* rendertools,
@@ -81,6 +86,7 @@
        m_lightobj.m_light = this;
        m_rendertools->AddLight(&m_lightobj);
        m_glsl = glsl;
+       m_poollight = NULL;
        m_blenderscene = ((KX_Scene*)sgReplicationInfo)->GetBlenderScene();
        m_dynamic = false;
 };
@@ -98,9 +104,8 @@
 
        m_rendertools->RemoveLight(&m_lightobj);
 
-       obj=GetBlenderObject();
-       if (m_dynamic && obj)
-               checkin_blenderlight(obj);
+       if (m_dynamic && m_poollight)
+               checkin_blenderlight();
 }
 
 
@@ -122,7 +127,7 @@
 void KX_LightObject::MakeDynamic()
 {
        m_dynamic = true;
-       SetBlenderObject(checkout_blenderlight());
+       checkout_blenderlight();
 }
 
 bool KX_LightObject::ApplyLight(KX_Scene *kxscene, int oblayer, int slot)
@@ -231,6 +236,12 @@
        GPULamp *lamp;
 
        if((lamp = GetGPULamp()) != NULL && GetSGNode()) {
+               // If the light is inactive, we can reuse it's blender light 
for active lights
+               if (m_lightobj.m_layer != m_blenderscene->layact) {
+                       forfeit_blenderlight();
+                       return;
+               }
+
                float obmat[4][4];
                // lights don't get their openGL matrix updated, do it now
                if (GetSGNode()->IsDirty())
@@ -308,28 +319,26 @@
        GPU_lamp_shadow_buffer_unbind(lamp);
 }
 
-void init_subpool(Scene *scene, std::vector<Object*> *subpool, int count, 
short type)
+void init_subpool(Scene *scene, std::vector<PoolLight*> *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);
+               subpool->at(i) = new PoolLight();
+               subpool->at(i)->blenderlight = add_object(m_blenderlight_scene, 
OB_LAMP);
 
                //Give the lights a unique name so the converter can avoid them
-               strcpy(subpool->at(i)->id.name, "__pool__");
+               strcpy(subpool->at(i)->blenderlight->id.name, "__pool__");
 
-               la = (Lamp*)subpool->at(i)->data;
+               la = (Lamp*)subpool->at(i)->blenderlight->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,
        //we don't want libload trying to reinitialize the light pool
        if (m_blenderlight_count != 0)
@@ -353,7 +362,7 @@
        GPU_materials_free();
 }
 
-std::vector<Object*>* get_subpool(short type)
+std::vector<PoolLight*>* get_subpool(short type)
 {
        if (type == RAS_LightObject::LIGHT_NORMAL)
                return &m_blenderlight_points;
@@ -367,34 +376,56 @@
                return &m_blenderlight_areas;
 }
 
-Object* KX_LightObject::checkout_blenderlight()
+void KX_LightObject::checkout_blenderlight()
 {
-       std::vector<Object*> *subpool = get_subpool(m_lightobj.m_type);
+       std::vector<PoolLight*> *subpool = get_subpool(m_lightobj.m_type);
 
        if (subpool->size() == 0)
-               return NULL; //Sorry, out of lights :(
+       {
+               SetBlenderObject(NULL);
+               return; //Sorry, out of lights :(
+       }
 
-       Object* obj = subpool->back();
+       PoolLight* light = subpool->back();
        subpool->pop_back();
-       return obj;
+       m_poollight = light;
+       SetBlenderObject(light->blenderlight);
 }
 
-void KX_LightObject::checkin_blenderlight(Object* lamp)
+void KX_LightObject::checkin_blenderlight()
 {
-       std::vector<Object*> *subpool = get_subpool(m_lightobj.m_type);
-       subpool->push_back(lamp);
+       PoolLight* light = m_poollight;
+       std::vector<PoolLight*> *subpool = get_subpool(m_lightobj.m_type);
+       subpool->push_back(light);
+       m_poollight = NULL;
 }
 
+void KX_LightObject::forfeit_blenderlight()
+{
+       std::vector<PoolLight*> *subpool = get_subpool(m_lightobj.m_type);
+
+       Object *obj = GetBlenderObject();
+       PoolLight* light = new PoolLight();
+       light->blenderlight = obj;
+       light->lock = true;
+       
+       SetBlenderObject(NULL);
+
+       subpool->push_back(light);
+       m_blenderlight_count++;
+}
+
 void KX_LightObject::FreeBlenderLightPool()
 {
        Base *base;
-       std::vector<Object*> *subpool;
+       std::vector<PoolLight*> *subpool;
+       PoolLight *light;
        unsigned int i = 0;
        int total = m_blenderlight_points.size() + m_blenderlight_spots.size() 
+ m_blenderlight_suns.size() + m_blenderlight_hemis.size() + 
m_blenderlight_areas.size();
        if (total != m_blenderlight_count)
        {
                printf("Light pool still has lights checked out. Or extra 
lights have been checked in\n");
-               return;
+               m_blenderlight_count = total;
        }
 
        for (int i = 0; i < m_blenderlight_count; ++i)
@@ -410,7 +441,14 @@
                else if (m_blenderlight_areas.size() > 0)
                        subpool = &m_blenderlight_areas;
 
-               base = object_in_scene(subpool->back(), m_blenderlight_scene);
+               light = subpool->back();
+               if (light->lock)
+               {
+                       subpool->pop_back();
+                       continue;
+               }
+
+               base = object_in_scene(light->blenderlight, 
m_blenderlight_scene);
                BLI_remlink(&m_blenderlight_scene->base, base);
                GPU_lamp_free(base->object);
                free_libblock_us(&G.main->object, base->object);

Modified: branches/soc-2011-cucumber/source/gameengine/Ketsji/KX_Light.h
===================================================================
--- branches/soc-2011-cucumber/source/gameengine/Ketsji/KX_Light.h      
2011-10-10 04:16:16 UTC (rev 40893)
+++ branches/soc-2011-cucumber/source/gameengine/Ketsji/KX_Light.h      
2011-10-10 04:18:54 UTC (rev 40894)
@@ -40,6 +40,7 @@
 
 struct GPULamp;
 struct Scene;
+struct PoolLight;
 class KX_Camera;
 class RAS_IRasterizer;
 class RAS_IRenderTools;
@@ -50,13 +51,15 @@
        Py_Header;
 protected:
        RAS_LightObject         m_lightobj;
+       PoolLight*                      m_poollight;
        class RAS_IRenderTools* m_rendertools;  //needed for registering and 
replication of lightobj
        bool                            m_glsl;
        Scene*                          m_blenderscene;
 
        bool                            m_dynamic;
-       Object* checkout_blenderlight();
-       void checkin_blenderlight(Object* lamp);
+       void checkout_blenderlight();
+       void checkin_blenderlight();
+       void forfeit_blenderlight();
 
 public:
        KX_LightObject(void* sgReplicationInfo,SG_Callbacks callbacks,class 
RAS_IRenderTools* rendertools,const struct RAS_LightObject& lightobj, bool 
glsl);

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

Reply via email to