Revision: 49154
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=49154
Author: moguri
Date: 2012-07-23 20:24:35 +0000 (Mon, 23 Jul 2012)
Log Message:
-----------
BGE: Bringing over the dynamic lamp properties fixes from Cucumber (thanks to
Daniel Stokes). This means the following KX_LightObject properties now have
support when using GLSL materials (in addition to those already supported):
* distance
* lin_attenuation
* quad_attenuation
* spotsize
* spotblend
Modified Paths:
--------------
trunk/blender/source/blender/gpu/GPU_material.h
trunk/blender/source/blender/gpu/intern/gpu_material.c
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 2012-07-23 20:13:24 UTC
(rev 49153)
+++ trunk/blender/source/blender/gpu/GPU_material.h 2012-07-23 20:24:35 UTC
(rev 49154)
@@ -173,6 +173,11 @@
GPU_DYNAMIC_SAMPLER_2DBUFFER = 12,
GPU_DYNAMIC_SAMPLER_2DIMAGE = 13,
GPU_DYNAMIC_SAMPLER_2DSHADOW = 14,
+ GPU_DYNAMIC_LAMP_DISTANCE = 15,
+ GPU_DYNAMIC_LAMP_ATT1 = 16,
+ GPU_DYNAMIC_LAMP_ATT2 = 17,
+ GPU_DYNAMIC_LAMP_SPOTSIZE = 18,
+ GPU_DYNAMIC_LAMP_SPOTBLEND = 19,
} GPUDynamicType;
typedef enum GPUDataType {
@@ -231,6 +236,8 @@
void GPU_lamp_update(GPULamp *lamp, int lay, int hide, float obmat[][4]);
void GPU_lamp_update_colors(GPULamp *lamp, float r, float g, float b, float
energy);
+void GPU_lamp_update_distance(GPULamp *lamp, float distance, float att1, float
att2);
+void GPU_lamp_update_spot(GPULamp *lamp, float spotsize, float spotblend);
int GPU_lamp_shadow_layer(GPULamp *lamp);
#ifdef __cplusplus
Modified: trunk/blender/source/blender/gpu/intern/gpu_material.c
===================================================================
--- trunk/blender/source/blender/gpu/intern/gpu_material.c 2012-07-23
20:13:24 UTC (rev 49153)
+++ trunk/blender/source/blender/gpu/intern/gpu_material.c 2012-07-23
20:24:35 UTC (rev 49154)
@@ -117,6 +117,7 @@
float dynimat[4][4];
float spotsi, spotbl, k;
+ float dyndist, dynatt1, dynatt2;
float dist, att1, att2;
float shadow_color[3];
@@ -413,13 +414,13 @@
case LA_FALLOFF_CONSTANT:
break;
case LA_FALLOFF_INVLINEAR:
- GPU_link(mat, "lamp_falloff_invlinear",
GPU_uniform(&lamp->dist), *dist, &visifac);
+ GPU_link(mat, "lamp_falloff_invlinear",
GPU_dynamic_uniform(&lamp->dist, GPU_DYNAMIC_LAMP_DISTANCE, lamp->ob), *dist,
&visifac);
break;
case LA_FALLOFF_INVSQUARE:
- GPU_link(mat, "lamp_falloff_invsquare",
GPU_uniform(&lamp->dist), *dist, &visifac);
+ GPU_link(mat, "lamp_falloff_invsquare",
GPU_dynamic_uniform(&lamp->dist, GPU_DYNAMIC_LAMP_DISTANCE, lamp->ob), *dist,
&visifac);
break;
case LA_FALLOFF_SLIDERS:
- GPU_link(mat, "lamp_falloff_sliders",
GPU_uniform(&lamp->dist), GPU_uniform(&lamp->att1), GPU_uniform(&lamp->att2),
*dist, &visifac);
+ GPU_link(mat, "lamp_falloff_sliders",
GPU_dynamic_uniform(&lamp->dist, GPU_DYNAMIC_LAMP_DISTANCE, lamp->ob),
GPU_dynamic_uniform(&lamp->att1, GPU_DYNAMIC_LAMP_ATT1, lamp->ob),
GPU_dynamic_uniform(&lamp->att2, GPU_DYNAMIC_LAMP_ATT2, lamp->ob), *dist,
&visifac);
break;
case LA_FALLOFF_CURVE:
{
@@ -427,13 +428,13 @@
int size;
curvemapping_table_RGBA(lamp->curfalloff, &array, &size);
- GPU_link(mat, "lamp_falloff_curve",
GPU_uniform(&lamp->dist), GPU_texture(size, array), *dist, &visifac);
+ GPU_link(mat, "lamp_falloff_curve",
GPU_dynamic_uniform(&lamp->dist, GPU_DYNAMIC_LAMP_DISTANCE, lamp->ob),
GPU_texture(size, array), *dist, &visifac);
}
break;
}
if (lamp->mode & LA_SPHERE)
- GPU_link(mat, "lamp_visibility_sphere",
GPU_uniform(&lamp->dist), *dist, visifac, &visifac);
+ GPU_link(mat, "lamp_visibility_sphere",
GPU_dynamic_uniform(&lamp->dist, GPU_DYNAMIC_LAMP_DISTANCE, lamp->ob), *dist,
visifac, &visifac);
if (lamp->type == LA_SPOT) {
if (lamp->mode & LA_SQUARE) {
@@ -445,7 +446,7 @@
GPU_link(mat, "lamp_visibility_spot_circle",
GPU_dynamic_uniform(lamp->dynvec, GPU_DYNAMIC_LAMP_DYNVEC, lamp->ob), *lv,
&inpr);
}
- GPU_link(mat, "lamp_visibility_spot",
GPU_uniform(&lamp->spotsi), GPU_uniform(&lamp->spotbl), inpr, visifac,
&visifac);
+ GPU_link(mat, "lamp_visibility_spot",
GPU_dynamic_uniform(&lamp->spotsi, GPU_DYNAMIC_LAMP_SPOTSIZE, lamp->ob),
GPU_dynamic_uniform(&lamp->spotbl, GPU_DYNAMIC_LAMP_SPOTSIZE, lamp->ob), inpr,
visifac, &visifac);
}
GPU_link(mat, "lamp_visibility_clamp", visifac, &visifac);
@@ -1570,6 +1571,19 @@
lamp->col[2]= b* lamp->energy;
}
+void GPU_lamp_update_distance(GPULamp *lamp, float distance, float att1, float
att2)
+{
+ lamp->dist = distance;
+ lamp->att1 = att1;
+ lamp->att2 = att2;
+}
+
+void GPU_lamp_update_spot(GPULamp *lamp, float spotsize, float spotblend)
+{
+ lamp->spotsi= cos(M_PI*spotsize/360.0);
+ lamp->spotbl= (1.0f - lamp->spotsi)*spotblend;
+}
+
static void gpu_lamp_from_blender(Scene *scene, Object *ob, Object *par, Lamp
*la, GPULamp *lamp)
{
float temp, angle, pixsize, wsize;
Modified: trunk/blender/source/gameengine/Ketsji/KX_Light.cpp
===================================================================
--- trunk/blender/source/gameengine/Ketsji/KX_Light.cpp 2012-07-23 20:13:24 UTC
(rev 49153)
+++ trunk/blender/source/gameengine/Ketsji/KX_Light.cpp 2012-07-23 20:24:35 UTC
(rev 49154)
@@ -67,10 +67,13 @@
KX_LightObject::~KX_LightObject()
{
GPULamp *lamp;
+ Lamp *la = (Lamp*)GetBlenderObject()->data;
if ((lamp = GetGPULamp())) {
float obmat[4][4] = {{0}};
GPU_lamp_update(lamp, 0, 0, obmat);
+ GPU_lamp_update_distance(lamp, la->dist, la->att1, la->att2);
+ GPU_lamp_update_spot(lamp, la->spotsize, la->spotblend);
}
m_rendertools->RemoveLight(&m_lightobj);
@@ -206,6 +209,8 @@
GPU_lamp_update(lamp, m_lightobj.m_layer, 0, obmat);
GPU_lamp_update_colors(lamp, m_lightobj.m_red,
m_lightobj.m_green,
m_lightobj.m_blue, m_lightobj.m_energy);
+ GPU_lamp_update_distance(lamp, m_lightobj.m_distance,
m_lightobj.m_att1, m_lightobj.m_att2);
+ GPU_lamp_update_spot(lamp, m_lightobj.m_spotsize,
m_lightobj.m_spotblend);
}
}
_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs