[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [37776] branches/soc-2011-cucumber/source: Distance, att1, att2, spot size, and spot blending are now all dynamic.

Daniel Stokes kupomail at gmail.com
Fri Jun 24 01:18:50 CEST 2011


Revision: 37776
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=37776
Author:   kupoman
Date:     2011-06-23 23:18:49 +0000 (Thu, 23 Jun 2011)
Log Message:
-----------
Distance, att1, att2, spot size, and spot blending are now all dynamic.

Modified Paths:
--------------
    branches/soc-2011-cucumber/source/blender/gpu/GPU_material.h
    branches/soc-2011-cucumber/source/blender/gpu/intern/gpu_material.c
    branches/soc-2011-cucumber/source/gameengine/Ketsji/KX_Light.cpp

Modified: branches/soc-2011-cucumber/source/blender/gpu/GPU_material.h
===================================================================
--- branches/soc-2011-cucumber/source/blender/gpu/GPU_material.h	2011-06-23 22:44:24 UTC (rev 37775)
+++ branches/soc-2011-cucumber/source/blender/gpu/GPU_material.h	2011-06-23 23:18:49 UTC (rev 37776)
@@ -164,6 +164,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: branches/soc-2011-cucumber/source/blender/gpu/intern/gpu_material.c
===================================================================
--- branches/soc-2011-cucumber/source/blender/gpu/intern/gpu_material.c	2011-06-23 22:44:24 UTC (rev 37775)
+++ branches/soc-2011-cucumber/source/blender/gpu/intern/gpu_material.c	2011-06-23 23:18:49 UTC (rev 37776)
@@ -74,7 +74,7 @@
 	DYN_LAMP_CO = 1,
 	DYN_LAMP_VEC = 2,
 	DYN_LAMP_IMAT = 4,
-	DYN_LAMP_PERSMAT = 8,
+	DYN_LAMP_PERSMAT = 8
 } DynMatProperty;
 
 struct GPUMaterial {
@@ -119,6 +119,7 @@
 	float dynimat[4][4];
 
 	float spotsi, spotbl, k;
+	float dyndist, dynatt1, dynatt2;
 	float dist, att1, att2;
 
 	float bias, d, clipend;
@@ -401,13 +402,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), *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), *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_uniform(&lamp->att1), GPU_dynamic_uniform(&lamp->att2), *dist, &visifac);
 				break;
 			case LA_FALLOFF_CURVE:
 				{
@@ -415,13 +416,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_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), *dist, visifac, &visifac);
 
 		if(lamp->type == LA_SPOT) {
 			if(lamp->mode & LA_SQUARE) {
@@ -433,7 +434,7 @@
 				GPU_link(mat, "lamp_visibility_spot_circle", GPU_dynamic_uniform(lamp->dynvec), *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_uniform(&lamp->spotbl), inpr, visifac, &visifac);
 		}
 
 		GPU_link(mat, "lamp_visibility_clamp", visifac, &visifac);
@@ -1465,6 +1466,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: branches/soc-2011-cucumber/source/gameengine/Ketsji/KX_Light.cpp
===================================================================
--- branches/soc-2011-cucumber/source/gameengine/Ketsji/KX_Light.cpp	2011-06-23 22:44:24 UTC (rev 37775)
+++ branches/soc-2011-cucumber/source/gameengine/Ketsji/KX_Light.cpp	2011-06-23 23:18:49 UTC (rev 37776)
@@ -231,6 +231,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);
 	}
 }
 
@@ -346,7 +348,7 @@
 
 	m_blenderlight_count = 0;
 
-	//GPU_materials_free();
+	GPU_materials_free();
 }
 
 #ifdef WITH_PYTHON




More information about the Bf-blender-cvs mailing list