[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [49923] branches/ge_harmony/source: Adding support for sun and hemi lights in the light map shader.

Daniel Stokes kupomail at gmail.com
Wed Aug 15 23:58:21 CEST 2012


Revision: 49923
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=49923
Author:   kupoman
Date:     2012-08-15 21:58:20 +0000 (Wed, 15 Aug 2012)
Log Message:
-----------
Adding support for sun and hemi lights in the light map 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/Ketsji/KX_KetsjiEngine.cpp
    branches/ge_harmony/source/gameengine/Ketsji/KX_Light.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 18:14:34 UTC (rev 49922)
+++ branches/ge_harmony/source/blender/gpu/shaders/gpu_shader_light_frag.glsl	2012-08-15 21:58:20 UTC (rev 49923)
@@ -1,8 +1,15 @@
+#define SPOT	0
+#define SUN		1
+#define HEMI	2
+#define NORMAL	3
+
 struct Light {
+	int type;
 	float energy;
 	vec3 color;
 	float dist;
 	vec3 position;
+	vec3 vector;
 };
 
 uniform Light light;
@@ -12,15 +19,27 @@
 
 void main()
 {
+
+	vec3 L;
+	float attenuation = 1.0;
+
 	vec3 N = texture2D(prepass1, gl_TexCoord[0].st).rgb;
 	vec3 V = texture2D(prepass2, gl_TexCoord[0].st).rgb;
-	vec3 L = light.position - V;
-	float dist = length(L);
-	L = normalize(L);
 	
-	float attenuation = light.dist/(light.dist + dist*dist);
+	if (light.type == SUN || light.type == HEMI)
+		L = normalize(light.vector);
+	else {
+		L = light.position - V;
+		float dist = length(L);
+		L = normalize(L);
+		
+		attenuation = light.dist/(light.dist + dist*dist);
+	}
 	
 	float lambert = max(dot(N, L), 0.0);
+	if (light.type == HEMI)
+		lambert = 0.5*lambert + 0.5;
+		
 	vec3 diff = light.color * light.energy * lambert * attenuation;
 
 	gl_FragData[0] = vec4(diff, 1);

Modified: branches/ge_harmony/source/gameengine/Converter/BL_BlenderDataConversion.cpp
===================================================================
--- branches/ge_harmony/source/gameengine/Converter/BL_BlenderDataConversion.cpp	2012-08-15 18:14:34 UTC (rev 49922)
+++ branches/ge_harmony/source/gameengine/Converter/BL_BlenderDataConversion.cpp	2012-08-15 21:58:20 UTC (rev 49923)
@@ -1901,6 +1901,8 @@
 		lightobj.m_type = RAS_LightObject::LIGHT_SUN;
 	} else if (la->type==LA_SPOT) {
 		lightobj.m_type = RAS_LightObject::LIGHT_SPOT;
+	} else if (la->type==LA_HEMI) {
+		lightobj.m_type = RAS_LightObject::LIGHT_HEMI;
 	} else {
 		lightobj.m_type = RAS_LightObject::LIGHT_NORMAL;
 	}

Modified: branches/ge_harmony/source/gameengine/Ketsji/KX_KetsjiEngine.cpp
===================================================================
--- branches/ge_harmony/source/gameengine/Ketsji/KX_KetsjiEngine.cpp	2012-08-15 18:14:34 UTC (rev 49922)
+++ branches/ge_harmony/source/gameengine/Ketsji/KX_KetsjiEngine.cpp	2012-08-15 21:58:20 UTC (rev 49923)
@@ -877,9 +877,6 @@
 		RenderFrame(scene, cam);
 		m_rasterizer->EndPrePass();
 
-		// shadow buffers
-		RenderShadowBuffers(scene);
-
 		// light pass
 		m_rasterizer->BeginLightPass();
 		CListValue *lightlist = scene->GetLightList();
@@ -887,6 +884,9 @@
 			m_rasterizer->RenderLight(((KX_LightObject*)lightlist->GetValue(i))->GetLightData());
 		m_rasterizer->EndLightPass();
 
+		// shadow buffers
+		RenderShadowBuffers(scene);
+
 		// Avoid drawing the scene with the active camera twice when it's viewport is enabled
 		if (cam && !cam->GetViewport())
 		{

Modified: branches/ge_harmony/source/gameengine/Ketsji/KX_Light.cpp
===================================================================
--- branches/ge_harmony/source/gameengine/Ketsji/KX_Light.cpp	2012-08-15 18:14:34 UTC (rev 49922)
+++ branches/ge_harmony/source/gameengine/Ketsji/KX_Light.cpp	2012-08-15 21:58:20 UTC (rev 49923)
@@ -209,6 +209,7 @@
 				obmat[i][j] = (float)*dobmat;
 
 		memcpy(m_lightobj.m_position, &obmat[3], sizeof(float)*4);
+		memcpy(m_lightobj.m_vector, &obmat[2], sizeof(float)*3);
 
 		GPU_lamp_update(lamp, m_lightobj.m_layer, 0, obmat);
 		GPU_lamp_update_colors(lamp, m_lightobj.m_red, m_lightobj.m_green, 

Modified: branches/ge_harmony/source/gameengine/Rasterizer/RAS_LightObject.h
===================================================================
--- branches/ge_harmony/source/gameengine/Rasterizer/RAS_LightObject.h	2012-08-15 18:14:34 UTC (rev 49922)
+++ branches/ge_harmony/source/gameengine/Rasterizer/RAS_LightObject.h	2012-08-15 21:58:20 UTC (rev 49923)
@@ -39,6 +39,7 @@
 	enum LightType {
 		LIGHT_SPOT,
 		LIGHT_SUN,
+		LIGHT_HEMI,
 		LIGHT_NORMAL
 	};
 	bool	m_modified;
@@ -64,6 +65,7 @@
 	bool	m_nospecular;
 
 	float	m_position[4];
+	float	m_vector[3];
 };
 
 #endif //__RAS_LIGHTOBJECT_H__

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 18:14:34 UTC (rev 49922)
+++ branches/ge_harmony/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp	2012-08-15 21:58:20 UTC (rev 49923)
@@ -1463,6 +1463,9 @@
 void RAS_OpenGLRasterizer::RenderLight(RAS_LightObject *light)
 {
 	int bind;
+	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.energy");
 	GPU_shader_uniform_vector(m_light_shader, bind, 1, 1, &light->m_energy);
 
@@ -1481,6 +1484,14 @@
 	bind = GPU_shader_get_uniform(m_light_shader, "light.position");
 	GPU_shader_uniform_vector(m_light_shader, bind, 3, 1, fpos);
 
+	MT_Vector4 vec = MT_Vector4(light->m_vector[0], light->m_vector[1], light->m_vector[2], 0.0);
+	vec = m_viewmatrix * vec;
+	float fvec[4];
+	vec.getValue(fvec);
+
+	bind = GPU_shader_get_uniform(m_light_shader, "light.vector");
+	GPU_shader_uniform_vector(m_light_shader, bind, 3, 1, fvec);
+
 	glBegin(GL_QUADS);
 		glColor4f(1.f, 1.f, 1.f, 1.f);
 		glTexCoord2f(1.0, 1.0); glVertex2f(1,1);




More information about the Bf-blender-cvs mailing list