[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [16382] trunk/blender/source:

Brecht Van Lommel brechtvanlommel at pandora.be
Fri Sep 5 16:33:36 CEST 2008


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





More information about the Bf-blender-cvs mailing list