Revision: 16382
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=16382
Author:   blendix
Date:     2008-09-05 16:33:36 +0200 (Fri, 05 Sep 2008)

Log Message:
-----------

* GLSL lamps now respect 3d viewport layers.
* Fix undo crash related to sound. Sounds still stop working in
  the game engine after undo, but seems to be a different issue.

Modified Paths:
--------------
    trunk/blender/source/blender/gpu/GPU_material.h
    trunk/blender/source/blender/gpu/intern/gpu_draw.c
    trunk/blender/source/blender/gpu/intern/gpu_material.c
    trunk/blender/source/blender/src/drawview.c
    trunk/blender/source/blender/src/editsound.c
    trunk/blender/source/gameengine/Ketsji/BL_BlenderShader.cpp
    trunk/blender/source/gameengine/Ketsji/KX_Light.cpp

Modified: trunk/blender/source/blender/gpu/GPU_material.h
===================================================================
--- trunk/blender/source/blender/gpu/GPU_material.h     2008-09-05 13:08:50 UTC 
(rev 16381)
+++ trunk/blender/source/blender/gpu/GPU_material.h     2008-09-05 14:33:36 UTC 
(rev 16382)
@@ -124,7 +124,7 @@
 
 void GPU_materials_free();
 
-void GPU_material_bind(GPUMaterial *material, int lay, double time);
+void GPU_material_bind(GPUMaterial *material, int oblay, int viewlay, double 
time);
 void GPU_material_bind_uniforms(GPUMaterial *material, float obmat[][4], float 
viewmat[][4], float viewinv[][4], float obcol[4]);
 void GPU_material_unbind(GPUMaterial *material);
 int GPU_material_bound(GPUMaterial *material);
@@ -158,7 +158,7 @@
 void GPU_lamp_shadow_buffer_bind(GPULamp *lamp, float viewmat[][4], int 
*winsize, float winmat[][4]);
 void GPU_lamp_shadow_buffer_unbind(GPULamp *lamp);
 
-void GPU_lamp_update(GPULamp *lamp, float obmat[][4]);
+void GPU_lamp_update(GPULamp *lamp, int lay, float obmat[][4]);
 int GPU_lamp_shadow_layer(GPULamp *lamp);
 
 #ifdef __cplusplus

Modified: trunk/blender/source/blender/gpu/intern/gpu_draw.c
===================================================================
--- trunk/blender/source/blender/gpu/intern/gpu_draw.c  2008-09-05 13:08:50 UTC 
(rev 16381)
+++ trunk/blender/source/blender/gpu/intern/gpu_draw.c  2008-09-05 14:33:36 UTC 
(rev 16382)
@@ -900,7 +900,7 @@
 
                        gpumat = GPU_material_from_blender(GMS.gscene, mat);
                        GPU_material_vertex_attributes(gpumat, gattribs);
-                       GPU_material_bind(gpumat, GMS.gob->lay, 1.0);
+                       GPU_material_bind(gpumat, GMS.gob->lay, G.vd->lay, 1.0);
                        GPU_material_bind_uniforms(gpumat, GMS.gob->obmat, 
G.vd->viewmat, G.vd->viewinv, GMS.gob->col);
                        GMS.gboundmat= mat;
 

Modified: trunk/blender/source/blender/gpu/intern/gpu_material.c
===================================================================
--- trunk/blender/source/blender/gpu/intern/gpu_material.c      2008-09-05 
13:08:50 UTC (rev 16381)
+++ trunk/blender/source/blender/gpu/intern/gpu_material.c      2008-09-05 
14:33:36 UTC (rev 16382)
@@ -56,7 +56,6 @@
 
 #include "BLI_arithb.h"
 #include "BLI_blenlib.h"
-#include "BLI_linklist.h"
 
 #include "GPU_extensions.h"
 #include "GPU_material.h"
@@ -95,7 +94,7 @@
        int obmatloc, invobmatloc;
        int obcolloc;
 
-       LinkNode *lamps;
+       ListBase lamps;
 };
 
 struct GPULamp {
@@ -132,7 +131,7 @@
        GPUFrameBuffer *fb;
        GPUTexture *tex;
 
-       LinkNode *materials;
+       ListBase materials;
 };
 
 /* Functions */
@@ -221,6 +220,7 @@
 void GPU_material_free(Material *ma)
 {
        LinkData *link;
+       LinkData *nlink, *mlink, *next;
 
        for(link=ma->gpumaterial.first; link; link=link->next) {
                GPUMaterial *material = link->data;
@@ -228,25 +228,35 @@
                if(material->pass)
                        GPU_pass_free(material->pass);
 
-               BLI_linklist_free(material->lamps, NULL);
+               for(nlink=material->lamps.first; nlink; nlink=nlink->next) {
+                       GPULamp *lamp = nlink->data;
 
+                       for(mlink=lamp->materials.first; mlink; mlink=next) {
+                               next = mlink->next;
+                               if(mlink->data == ma)
+                                       BLI_freelinkN(&lamp->materials, mlink);
+                       }
+               }
+
+               BLI_freelistN(&material->lamps);
+
                MEM_freeN(material);
        }
 
        BLI_freelistN(&ma->gpumaterial);
 }
 
-void GPU_material_bind(GPUMaterial *material, int lay, double time)
+void GPU_material_bind(GPUMaterial *material, int oblay, int viewlay, double 
time)
 {
        if(material->pass) {
-               LinkNode *nlink;
+               LinkData *nlink;
                GPULamp *lamp;
 
                /* handle layer lamps */
-               for(nlink=material->lamps; nlink; nlink=nlink->next) {
-                       lamp= nlink->link;
+               for(nlink=material->lamps.first; nlink; nlink=nlink->next) {
+                       lamp= nlink->data;
 
-                       if(!(lamp->mode & LA_LAYER) || (lamp->lay & lay)) {
+                       if((lamp->lay & viewlay) && (!(lamp->mode & LA_LAYER) 
|| (lamp->lay & oblay))) {
                                lamp->dynenergy = lamp->energy;
                                VECCOPY(lamp->dyncol, lamp->col);
                        }
@@ -265,7 +275,7 @@
 {
        if(material->pass) {
                GPUShader *shader = GPU_pass_shader(material->pass);
-               LinkNode *nlink;
+               LinkData *nlink;
                GPULamp *lamp;
                float invmat[4][4], col[4];
 
@@ -290,8 +300,8 @@
                }
 
                /* update lamps */
-               for(nlink=material->lamps; nlink; nlink=nlink->next) {
-                       lamp= nlink->link;
+               for(nlink=material->lamps.first; nlink; nlink=nlink->next) {
+                       lamp= nlink->data;
 
                        if(material->dynproperty & DYN_LAMP_VEC) {
                                VECCOPY(lamp->dynvec, lamp->vec);
@@ -587,6 +597,13 @@
        }
 }
 
+void add_user_list(ListBase *list, void *data)
+{
+       LinkData *link = MEM_callocN(sizeof(LinkData), "GPULinkData");
+       link->data = data;
+       BLI_addtail(list, link);
+}
+
 static void shade_one_light(GPUShadeInput *shi, GPUShadeResult *shr, GPULamp 
*lamp)
 {
        Material *ma= shi->mat;
@@ -668,8 +685,8 @@
                                        GPU_dynamic_uniform(&lamp->dynenergy), 
shi->rgb, shi->specrgb,
                                        shr->diff, shr->spec, &shr->diff, 
&shr->spec);
                                
-                               BLI_linklist_append(&mat->lamps, lamp);
-                               BLI_linklist_append(&lamp->materials, ma);
+                               add_user_list(&mat->lamps, lamp);
+                               add_user_list(&lamp->materials, ma);
                                return;
                        }
                        
@@ -677,8 +694,8 @@
                }
        }
        else if((G.fileflags & G_FILE_GLSL_NO_SHADOWS) && (lamp->mode & 
LA_ONLYSHADOW)) {
-               BLI_linklist_append(&mat->lamps, lamp);
-               BLI_linklist_append(&lamp->materials, ma);
+               add_user_list(&mat->lamps, lamp);
+               add_user_list(&lamp->materials, ma);
                return;
        }
        else
@@ -730,8 +747,8 @@
                }
        }
 
-       BLI_linklist_append(&mat->lamps, lamp);
-       BLI_linklist_append(&lamp->materials, ma);
+       add_user_list(&mat->lamps, lamp);
+       add_user_list(&lamp->materials, ma);
 }
 
 static void material_lights(GPUShadeInput *shi, GPUShadeResult *shr)
@@ -1258,10 +1275,12 @@
 
 /* Lamps and shadow buffers */
 
-void GPU_lamp_update(GPULamp *lamp, float obmat[][4])
+void GPU_lamp_update(GPULamp *lamp, int lay, float obmat[][4])
 {
        float mat[4][4];
 
+       lamp->lay = lay;
+
        Mat4CpyMat4(mat, obmat);
        Mat4Ortho(mat);
 
@@ -1279,7 +1298,6 @@
        lamp->ob = ob;
        lamp->par = par;
        lamp->la = la;
-       lamp->lay = ob->lay;
 
        /* add_render_lamp */
        lamp->mode = la->mode;
@@ -1292,7 +1310,7 @@
        lamp->col[1]= la->g*lamp->energy;
        lamp->col[2]= la->b*lamp->energy;
 
-       GPU_lamp_update(lamp, ob->obmat);
+       GPU_lamp_update(lamp, ob->lay, ob->obmat);
 
        lamp->spotsi= la->spotsize;
        if(lamp->mode & LA_HALO)
@@ -1340,10 +1358,12 @@
        GPULamp *lamp;
        LinkData *link;
 
-       for(link=ob->gpulamp.first; link; link=link->next)
-               if(((GPULamp*)link->data)->par == par &&
-                  ((GPULamp*)link->data)->scene == scene)
+       for(link=ob->gpulamp.first; link; link=link->next) {
+               lamp = (GPULamp*)link->data;
+
+               if(lamp->par == par && lamp->scene == scene)
                        return link->data;
+       }
 
        lamp = MEM_callocN(sizeof(GPULamp), "GPULamp");
 
@@ -1383,18 +1403,20 @@
 {
        GPULamp *lamp;
        LinkData *link;
-       LinkNode *nlink;
+       LinkData *nlink;
        Material *ma;
 
        for(link=ob->gpulamp.first; link; link=link->next) {
                lamp = link->data;
 
-               for(nlink=lamp->materials; nlink; nlink=nlink->next) {
-                       ma= nlink->link;
+               while(lamp->materials.first) {
+                       nlink = lamp->materials.first;
+                       ma = nlink->data;
+                       BLI_freelinkN(&lamp->materials, nlink);
+
                        if(ma->gpumaterial.first)
                                GPU_material_free(ma);
                }
-               BLI_linklist_free(lamp->materials, NULL);
 
                gpu_lamp_shadow_free(lamp);
 

Modified: trunk/blender/source/blender/src/drawview.c
===================================================================
--- trunk/blender/source/blender/src/drawview.c 2008-09-05 13:08:50 UTC (rev 
16381)
+++ trunk/blender/source/blender/src/drawview.c 2008-09-05 14:33:36 UTC (rev 
16382)
@@ -2941,9 +2941,9 @@
        lamp = GPU_lamp_from_blender(G.scene, ob, par);
 
        if(lamp) {
-               GPU_lamp_update(lamp, obmat);
-
-               if(GPU_lamp_has_shadow_buffer(lamp)) {
+               GPU_lamp_update(lamp, ob->lay, obmat);
+               
+               if((ob->lay & v3d->lay) && GPU_lamp_has_shadow_buffer(lamp)) {
                        shadow= MEM_callocN(sizeof(View3DShadow), 
"View3DShadow");
                        shadow->lamp = lamp;
                        BLI_addtail(shadows, shadow);

Modified: trunk/blender/source/blender/src/editsound.c
===================================================================
--- trunk/blender/source/blender/src/editsound.c        2008-09-05 13:08:50 UTC 
(rev 16381)
+++ trunk/blender/source/blender/src/editsound.c        2008-09-05 14:33:36 UTC 
(rev 16382)
@@ -275,6 +275,12 @@
        bSound *sound;
 
        if(ghSoundScene) {
+               for(sound=G.main->sound.first; sound; sound=sound->id.next) {
+                       if(sound->snd_sound) {
+                               SND_RemoveSound(ghSoundScene, sound->snd_sound);
+                               sound->snd_sound = NULL;
+                       }
+               }
 
                /* clear the soundscene */
                SND_RemoveAllSounds(ghSoundScene);
@@ -908,7 +914,16 @@
 void sound_end_all_sounds(void)
 {
 #if GAMEBLENDER == 1
+       bSound *sound;
+
        if(ghSoundScene) {
+               for(sound=G.main->sound.first; sound; sound=sound->id.next) {
+                       if(sound->snd_sound) {
+                               SND_RemoveSound(ghSoundScene, sound->snd_sound);
+                               sound->snd_sound = NULL;
+                       }
+               }
+
                sound_stop_all_sounds();
                SND_RemoveAllSounds(ghSoundScene);
        }

Modified: trunk/blender/source/gameengine/Ketsji/BL_BlenderShader.cpp
===================================================================
--- trunk/blender/source/gameengine/Ketsji/BL_BlenderShader.cpp 2008-09-05 
13:08:50 UTC (rev 16381)
+++ trunk/blender/source/gameengine/Ketsji/BL_BlenderShader.cpp 2008-09-05 
14:33:36 UTC (rev 16382)
@@ -22,7 +22,7 @@
        mMat(ma),
        mLightLayer(lightlayer)
 {
-       mBlenderScene = scene->GetBlenderScene(); 
//GetSceneForName(scene->GetName());
+       mBlenderScene = scene->GetBlenderScene();
        mBlendMode = GPU_BLEND_SOLID;
 
        if(mMat)
@@ -52,7 +52,7 @@
 {
        if(VerifyShader()) {
                if(enable)
-                       
GPU_material_bind(GPU_material_from_blender(mBlenderScene, mMat), mLightLayer, 
time);
+                       
GPU_material_bind(GPU_material_from_blender(mBlenderScene, mMat), mLightLayer, 
~0, time);
                else
                        
GPU_material_unbind(GPU_material_from_blender(mBlenderScene, mMat));
        }

Modified: trunk/blender/source/gameengine/Ketsji/KX_Light.cpp
===================================================================
--- trunk/blender/source/gameengine/Ketsji/KX_Light.cpp 2008-09-05 13:08:50 UTC 
(rev 16381)
+++ trunk/blender/source/gameengine/Ketsji/KX_Light.cpp 2008-09-05 14:33:36 UTC 
(rev 16382)
@@ -105,7 +105,7 @@
                        for(int j=0; j<4; j++, dobmat++)
                                obmat[i][j] = (float)*dobmat;
 
-               GPU_lamp_update(lamp, obmat);
+               GPU_lamp_update(lamp, m_lightobj.m_layer, obmat);
        }
 }
 


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

Reply via email to