[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