[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [49926] branches/ge_harmony/source: Adding support for the falloff options (excluding custom curve) to the light shader.

Daniel Stokes kupomail at gmail.com
Thu Aug 16 00:55:38 CEST 2012


Revision: 49926
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=49926
Author:   kupoman
Date:     2012-08-15 22:55:37 +0000 (Wed, 15 Aug 2012)
Log Message:
-----------
Adding support for the falloff options (excluding custom curve) to the light shader.

Modified Paths:
--------------
    branches/ge_harmony/source/blender/gpu/shaders/gpu_shader_light_frag.glsl
    branches/ge_harmony/source/gameengine/Converter/BL_BlenderDataConversion.cpp
    branches/ge_harmony/source/gameengine/Rasterizer/RAS_LightObject.h
    branches/ge_harmony/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp

Modified: branches/ge_harmony/source/blender/gpu/shaders/gpu_shader_light_frag.glsl
===================================================================
--- branches/ge_harmony/source/blender/gpu/shaders/gpu_shader_light_frag.glsl	2012-08-15 22:15:37 UTC (rev 49925)
+++ branches/ge_harmony/source/blender/gpu/shaders/gpu_shader_light_frag.glsl	2012-08-15 22:55:37 UTC (rev 49926)
@@ -3,8 +3,16 @@
 #define HEMI	2
 #define NORMAL	3
 
+#define CONSTANT	0
+#define INVLINEAR	1
+#define INVSQUARE	2
+#define CURVE		3
+#define SLIDERS		4
+
 struct Light {
 	int type;
+	int falloff;
+	vec2 att;
 	float energy;
 	vec3 color;
 	float dist;
@@ -33,7 +41,15 @@
 		float dist = length(L);
 		L = normalize(L);
 		
-		attenuation = light.dist/(light.dist + dist*dist);
+		if (light.falloff == INVLINEAR)
+			attenuation = light.dist/(light.dist + dist);
+		else if (light.falloff == INVSQUARE)
+			attenuation = light.dist/(light.dist + dist*dist);
+		else if (light.falloff == SLIDERS) {
+			float distkw = light.dist * light.dist;
+			attenuation = light.dist/(light.dist + light.att[0]*dist);
+			attenuation *= distkw/(distkw + light.att[1]*dist*dist);
+		}
 	}
 	
 	float lambert = max(dot(N, L), 0.0);

Modified: branches/ge_harmony/source/gameengine/Converter/BL_BlenderDataConversion.cpp
===================================================================
--- branches/ge_harmony/source/gameengine/Converter/BL_BlenderDataConversion.cpp	2012-08-15 22:15:37 UTC (rev 49925)
+++ branches/ge_harmony/source/gameengine/Converter/BL_BlenderDataConversion.cpp	2012-08-15 22:55:37 UTC (rev 49926)
@@ -1872,7 +1872,7 @@
 	KX_LightObject *gamelight;
 	
 	lightobj.m_att1 = la->att1;
-	lightobj.m_att2 = (la->mode & LA_QUAD) ? la->att2 : 0.0f;
+	lightobj.m_att2 = la->att2;
 	lightobj.m_red = la->r;
 	lightobj.m_green = la->g;
 	lightobj.m_blue = la->b;
@@ -1907,6 +1907,18 @@
 		lightobj.m_type = RAS_LightObject::LIGHT_NORMAL;
 	}
 
+	if (la->falloff_type==LA_FALLOFF_INVLINEAR) {
+		lightobj.m_falloff = RAS_LightObject::FALLOFF_INVLINEAR;
+	} else if (la->falloff_type==LA_FALLOFF_INVSQUARE) {
+		lightobj.m_falloff = RAS_LightObject::FALLOFF_INVSQUARE;
+	} else if (la->falloff_type==LA_FALLOFF_CURVE) {
+		lightobj.m_falloff = RAS_LightObject::FALLOFF_CURVE;
+	} else if (la->falloff_type==LA_FALLOFF_SLIDERS) {
+		lightobj.m_falloff = RAS_LightObject::FALLOFF_SLIDERS;
+	} else {
+		lightobj.m_falloff = RAS_LightObject::FALLOFF_CONSTANT;
+	}
+
 	gamelight = new KX_LightObject(kxscene, KX_Scene::m_callbacks, rendertools,
 		lightobj, glslmat);
 	

Modified: branches/ge_harmony/source/gameengine/Rasterizer/RAS_LightObject.h
===================================================================
--- branches/ge_harmony/source/gameengine/Rasterizer/RAS_LightObject.h	2012-08-15 22:15:37 UTC (rev 49925)
+++ branches/ge_harmony/source/gameengine/Rasterizer/RAS_LightObject.h	2012-08-15 22:55:37 UTC (rev 49926)
@@ -42,6 +42,13 @@
 		LIGHT_HEMI,
 		LIGHT_NORMAL
 	};
+	enum FalloffType {
+		FALLOFF_CONSTANT,
+		FALLOFF_INVLINEAR,
+		FALLOFF_INVSQUARE,
+		FALLOFF_CURVE,
+		FALLOFF_SLIDERS
+	};
 	bool	m_modified;
 	int		m_layer;
 	void	*m_scene;
@@ -54,6 +61,7 @@
 	float	m_green;
 	float	m_blue;
 
+	FalloffType	m_falloff;
 	float	m_att1;
 	float	m_att2;
 	float	m_spotsize;

Modified: branches/ge_harmony/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp
===================================================================
--- branches/ge_harmony/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp	2012-08-15 22:15:37 UTC (rev 49925)
+++ branches/ge_harmony/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp	2012-08-15 22:55:37 UTC (rev 49926)
@@ -1466,6 +1466,13 @@
 	bind = GPU_shader_get_uniform(m_light_shader, "light.type");
 	GPU_shader_uniform_ivector(m_light_shader, bind, 1, 1, (int*)(&light->m_type));
 
+	bind = GPU_shader_get_uniform(m_light_shader, "light.falloff");
+	GPU_shader_uniform_ivector(m_light_shader, bind, 1, 1, (int*)(&light->m_falloff));
+
+	float att[2] = {light->m_att1, light->m_att2};
+	bind = GPU_shader_get_uniform(m_light_shader, "light.att");
+	GPU_shader_uniform_vector(m_light_shader, bind, 2, 1, att);
+
 	bind = GPU_shader_get_uniform(m_light_shader, "light.energy");
 	GPU_shader_uniform_vector(m_light_shader, bind, 1, 1, &light->m_energy);
 




More information about the Bf-blender-cvs mailing list