[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [15493] branches/apricot: Apricot Branch: GLSL

Brecht Van Lommel brechtvanlommel at pandora.be
Wed Jul 9 00:30:57 CEST 2008


Revision: 15493
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=15493
Author:   blendix
Date:     2008-07-09 00:30:54 +0200 (Wed, 09 Jul 2008)

Log Message:
-----------
Apricot Branch: GLSL
====================

* Some optimizations in the glsl shader code to avoid some
  matrix multiplications, and other floating point ops.
* Optimized game engine mesh deforming code a bit, and
  removed a bunch of unneeded/duplicated code.
* Fix for bugs #17289 and #17295, glsl compile errors.

Modified Paths:
--------------
    branches/apricot/intern/moto/include/GEN_Map.h
    branches/apricot/source/blender/gpu/GPU_material.h
    branches/apricot/source/blender/gpu/intern/gpu_material.c
    branches/apricot/source/blender/gpu/intern/gpu_shader_material.glsl
    branches/apricot/source/blender/gpu/intern/gpu_shader_material.glsl.c
    branches/apricot/source/blender/src/drawobject.c
    branches/apricot/source/gameengine/Converter/BL_BlenderDataConversion.cpp
    branches/apricot/source/gameengine/Converter/BL_MeshDeformer.cpp
    branches/apricot/source/gameengine/Converter/BL_MeshDeformer.h
    branches/apricot/source/gameengine/Converter/BL_SkinDeformer.cpp
    branches/apricot/source/gameengine/Converter/BL_SkinMeshObject.cpp
    branches/apricot/source/gameengine/Converter/BL_SkinMeshObject.h
    branches/apricot/source/gameengine/Ketsji/BL_BlenderShader.cpp
    branches/apricot/source/gameengine/Ketsji/BL_BlenderShader.h
    branches/apricot/source/gameengine/Ketsji/KX_BlenderMaterial.cpp
    branches/apricot/source/gameengine/Rasterizer/RAS_MeshObject.cpp
    branches/apricot/source/gameengine/Rasterizer/RAS_MeshObject.h
    branches/apricot/source/gameengine/Rasterizer/RAS_TexVert.cpp
    branches/apricot/source/gameengine/Rasterizer/RAS_TexVert.h
    branches/apricot/source/kernel/gen_system/GEN_HashedPtr.h
    branches/apricot/source/kernel/gen_system/GEN_Map.h

Modified: branches/apricot/intern/moto/include/GEN_Map.h
===================================================================
--- branches/apricot/intern/moto/include/GEN_Map.h	2008-07-08 19:34:20 UTC (rev 15492)
+++ branches/apricot/intern/moto/include/GEN_Map.h	2008-07-08 22:30:54 UTC (rev 15493)
@@ -82,6 +82,24 @@
         }
         return 0;
     }
+
+    Key* getKey(int index) {
+        int count=0;
+        for (int i=0;i<m_num_buckets;i++)
+        {
+            Entry* bucket = m_buckets[i];
+            while(bucket)
+            {
+                if (count==index)
+                {
+                    return &bucket->m_key;
+                }
+                bucket = bucket->m_next;
+                count++;
+            }
+        }
+        return 0;
+    }
     
     void clear() {
         for (int i = 0; i < m_num_buckets; ++i) {

Modified: branches/apricot/source/blender/gpu/GPU_material.h
===================================================================
--- branches/apricot/source/blender/gpu/GPU_material.h	2008-07-08 19:34:20 UTC (rev 15492)
+++ branches/apricot/source/blender/gpu/GPU_material.h	2008-07-08 22:30:54 UTC (rev 15493)
@@ -112,7 +112,7 @@
 void GPU_material_free(GPUMaterial *material);
 
 void GPU_material_bind(GPUMaterial *material, int lay);
-void GPU_material_bind_uniforms(GPUMaterial *material, float obmat[][4], float viewmat[][4]);
+void GPU_material_bind_uniforms(GPUMaterial *material, float obmat[][4], float viewmat[][4], float viewinv[][4]);
 void GPU_material_unbind(GPUMaterial *material);
 
 void GPU_material_vertex_attributes(GPUMaterial *material,

Modified: branches/apricot/source/blender/gpu/intern/gpu_material.c
===================================================================
--- branches/apricot/source/blender/gpu/intern/gpu_material.c	2008-07-08 19:34:20 UTC (rev 15492)
+++ branches/apricot/source/blender/gpu/intern/gpu_material.c	2008-07-08 22:30:54 UTC (rev 15493)
@@ -88,10 +88,11 @@
 	float dynenergy, dyncol[3];
 	float energy, col[3];
 
-	float co[3];
-	float vec[3];
+	float co[3], vec[3];
+	float dynco[3], dynvec[3];
 	float obmat[4][4];
 	float imat[4][4];
+	float dynimat[4][4];
 
 	float spotsi, spotbl, k;
 	float dist, att1, att2;
@@ -105,6 +106,7 @@
 	float winmat[4][4];
 	float viewmat[4][4];
 	float persmat[4][4];
+	float dynpersmat[4][4];
 
 	GPUFrameBuffer *fb;
 	GPUTexture *tex;
@@ -220,10 +222,12 @@
 	}
 }
 
-void GPU_material_bind_uniforms(GPUMaterial *material, float obmat[][4], float viewmat[][4])
+void GPU_material_bind_uniforms(GPUMaterial *material, float obmat[][4], float viewmat[][4], float viewinv[][4])
 {
 	if(material->pass) {
 		GPUShader *shader = GPU_pass_shader(material->pass);
+		LinkNode *nlink;
+		GPULamp *lamp;
 		float invmat[4][4];
 
 		/* handle builtins */
@@ -231,8 +235,7 @@
 			GPU_shader_uniform_vector(shader, GPU_builtin_name(GPU_VIEW_MATRIX), 16, 1, (float*)viewmat);
 		}
 		if(material->builtins & GPU_INVERSE_VIEW_MATRIX) {
-			Mat4Invert(invmat, viewmat);
-			GPU_shader_uniform_vector(shader, GPU_builtin_name(GPU_INVERSE_VIEW_MATRIX), 16, 1, (float*)invmat);
+			GPU_shader_uniform_vector(shader, GPU_builtin_name(GPU_INVERSE_VIEW_MATRIX), 16, 1, (float*)viewinv);
 		}
 		if(material->builtins & GPU_OBJECT_MATRIX) {
 			GPU_shader_uniform_vector(shader, GPU_builtin_name(GPU_OBJECT_MATRIX), 16, 1, (float*)obmat);
@@ -241,6 +244,22 @@
 			Mat4Invert(invmat, obmat);
 			GPU_shader_uniform_vector(shader, GPU_builtin_name(GPU_INVERSE_OBJECT_MATRIX), 16, 1, (float*)invmat);
 		}
+
+		/* update lamps */
+		for(nlink=material->lamps; nlink; nlink=nlink->next) {
+			lamp= nlink->link;
+
+			VECCOPY(lamp->dynvec, lamp->vec);
+			Normalize(lamp->dynvec);
+			VecMulf(lamp->dynvec, -1.0f);
+			Mat4Mul3Vecfl(viewmat, lamp->dynvec);
+
+			VECCOPY(lamp->dynco, lamp->co);
+			Mat4MulVecfl(viewmat, lamp->dynco);
+
+			Mat4MulMat4(lamp->dynimat, viewinv, lamp->imat);
+			Mat4MulMat4(lamp->dynpersmat, viewinv, lamp->persmat);
+		}
 	}
 }
 
@@ -283,11 +302,11 @@
 
 	/* from get_lamp_visibility */
 	if(lamp->type==LA_SUN || lamp->type==LA_HEMI) {
-		GPU_link(mat, "lamp_visibility_sun_hemi", GPU_builtin(GPU_VIEW_MATRIX), GPU_dynamic_uniform(lamp->vec), lv, dist, &visifac);
+		GPU_link(mat, "lamp_visibility_sun_hemi", GPU_dynamic_uniform(lamp->dynvec), lv, dist, &visifac);
 		return visifac;
 	}
 	else {
-		GPU_link(mat, "lamp_visibility_other", GPU_builtin(GPU_VIEW_MATRIX), GPU_builtin(GPU_VIEW_POSITION), GPU_dynamic_uniform(lamp->co), lv, dist, &visifac);
+		GPU_link(mat, "lamp_visibility_other", GPU_builtin(GPU_VIEW_POSITION), GPU_dynamic_uniform(lamp->dynco), lv, dist, &visifac);
 
 		if(lamp->type==LA_AREA)
 			return visifac;
@@ -321,9 +340,9 @@
 
 		if(lamp->type == LA_SPOT) {
 			if(lamp->mode & LA_SQUARE)
-				GPU_link(mat, "lamp_visibility_spot_square", GPU_builtin(GPU_VIEW_MATRIX), GPU_builtin(GPU_INVERSE_VIEW_MATRIX), GPU_dynamic_uniform(lamp->vec), GPU_dynamic_uniform((float*)lamp->imat), *lv, &inpr);
+				GPU_link(mat, "lamp_visibility_spot_square", GPU_dynamic_uniform(lamp->dynvec), GPU_dynamic_uniform((float*)lamp->dynimat), *lv, &inpr);
 			else
-				GPU_link(mat, "lamp_visibility_spot_circle", GPU_builtin(GPU_VIEW_MATRIX), GPU_dynamic_uniform(lamp->vec), *lv, &inpr);
+				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);
 		}
@@ -528,7 +547,7 @@
 
 			memset(&area, 0, sizeof(area));
 			memset(&areasize, 0, sizeof(areasize));
-			GPU_link(mat, "shade_inp_area", GPU_builtin(GPU_VIEW_POSITION), GPU_dynamic_uniform(lamp->co), GPU_dynamic_uniform(lamp->vec), vn, GPU_uniform((float*)area),
+			GPU_link(mat, "shade_inp_area", GPU_builtin(GPU_VIEW_POSITION), GPU_dynamic_uniform(lamp->dynco), GPU_dynamic_uniform(lamp->dynvec), vn, GPU_uniform((float*)area),
 				GPU_uniform(&areasize), GPU_uniform(&lamp->k), &inp);
 		}
 
@@ -558,10 +577,10 @@
 	GPU_link(mat, "mtex_value_clamp_positive", i, &i);
 
 	if((ma->mode & MA_SHADOW) && GPU_lamp_has_shadow_buffer(lamp)) {
-		GPU_link(mat, "test_shadowbuf", GPU_builtin(GPU_INVERSE_VIEW_MATRIX),
+		GPU_link(mat, "test_shadowbuf",
 			GPU_builtin(GPU_VIEW_POSITION),
 			GPU_dynamic_texture(lamp->tex),
-			GPU_dynamic_uniform((float*)lamp->persmat),
+			GPU_dynamic_uniform((float*)lamp->dynpersmat),
 			GPU_uniform(&lamp->bias), inp, &shadfac);
 		
 		if(lamp->mode & LA_ONLYSHADOW) {
@@ -741,7 +760,7 @@
 	Tex *tex;
 	GPUNodeLink *texco, *tin, *trgb, *tnor, *tcol, *stencil = NULL;
 	GPUNodeLink *colfac, *newnor, *varfac, *orn;
-	float one = 1.0f;
+	float one = 1.0f, norfac;
 	int tex_nr, rgbnor, talpha;
 
 	GPU_link(mat, "texco_norm", GPU_builtin(GPU_VIEW_NORMAL), &orn);
@@ -780,7 +799,9 @@
 				continue;
 
 			GPU_link(mat, "mtex_2d_mapping", texco, &texco);
-			GPU_link(mat, "mtex_mapping", texco, GPU_uniform(mtex->size), GPU_uniform(mtex->ofs), &texco);
+			if(mtex->size[0] != 1.0f || mtex->size[1] != 1.0f || mtex->size[2] != 1.0f ||
+			   mtex->ofs[0] != 0.0f || mtex->ofs[1] != 0.0f || mtex->ofs[2] != 0.0f)
+				GPU_link(mat, "mtex_mapping", texco, GPU_uniform(mtex->size), GPU_uniform(mtex->ofs), &texco);
 
 			if(tex && tex->type == TEX_IMAGE && tex->ima) {
 #ifdef DEBUG_SHADOW
@@ -860,7 +881,11 @@
 					else
 						newnor = tnor;
 
-					GPU_link(mat, "mtex_blend_normal", GPU_uniform(&mtex->norfac), shi->vn, newnor, &shi->vn);
+					norfac = MIN2(mtex->norfac, 1.0);
+					if(norfac == 1.0f)
+						shi->vn = newnor;
+					else
+						GPU_link(mat, "mtex_blend_normal", GPU_uniform(&norfac), shi->vn, newnor, &shi->vn);
 				}
 
 				GPU_link(mat, "vec_math_negate", shi->vn, &orn);

Modified: branches/apricot/source/blender/gpu/intern/gpu_shader_material.glsl
===================================================================
--- branches/apricot/source/blender/gpu/intern/gpu_shader_material.glsl	2008-07-08 19:34:20 UTC (rev 15492)
+++ branches/apricot/source/blender/gpu/intern/gpu_shader_material.glsl	2008-07-08 22:30:54 UTC (rev 15493)
@@ -112,10 +112,9 @@
 
 void camera(vec3 co, out vec3 outview, out float outdepth, out float outdist)
 {
-	outview = co;
-	outdepth = abs(outview.z);
-	outdist = length(outview);
-	outview = normalize(outview);
+	outdepth = abs(co.z);
+	outdist = length(co);
+	outview = normalize(co);
 }
 
 void math_add(float val1, float val2, out float outval)
@@ -931,8 +930,7 @@
 
 void mtex_value_clamp_positive(float fac, out float outfac)
 {
-	if(fac < 0.0) outfac = 0.0;
-	else outfac = fac;
+	outfac = max(fac, 0.0);
 }
 
 void mtex_value_clamp(float fac, out float outfac)
@@ -1002,8 +1000,7 @@
 
 void mtex_2d_mapping(vec3 vec, out vec3 outvec)
 {
-	outvec.xy = (vec.xy + vec2(1.0, 1.0))*0.5;
-	outvec.z = vec.z;
+	outvec = vec3(vec.xy*0.5 + vec2(0.5, 0.5), vec.z);
 }
 
 void mtex_image(vec3 vec, sampler2D ima, out float value, out vec4 color, out vec3 normal)
@@ -1032,26 +1029,22 @@
 
 void mtex_blend_normal(float norfac, vec3 normal, vec3 newnormal, out vec3 outnormal)
 {
-	norfac = min(norfac, 1.0);
 	outnormal = (1.0 - norfac)*normal + norfac*newnormal;
 	outnormal = normalize(outnormal);
 }
 
 /******* MATERIAL *********/
 
-void lamp_visibility_sun_hemi(mat4 viewmat, vec3 lampvec, out vec3 lv, out float dist, out float visifac)
+void lamp_visibility_sun_hemi(vec3 lampvec, out vec3 lv, out float dist, out float visifac)
 {
-	lampvec = -normalize(lampvec);
-	lampvec = (viewmat*vec4(lampvec, 0.0)).xyz;
-
 	lv = lampvec;
 	dist = 1.0;
 	visifac = 1.0;
 }
 
-void lamp_visibility_other(mat4 viewmat, vec3 co, vec3 lampco, out vec3 lv, out float dist, out float visifac)
+void lamp_visibility_other(vec3 co, vec3 lampco, out vec3 lv, out float dist, out float visifac)
 {
-	lv = co - (viewmat*vec4(lampco, 1.0)).xyz;
+	lv = co - lampco;
 	dist = length(lv);
 	lv = normalize(lv);
 	visifac = 1.0;
@@ -1087,14 +1080,10 @@
 	outvisifac= visifac*max(t, 0.0)/lampdist;
 }
 
-void lamp_visibility_spot_square(mat4 viewmat, mat4 viewinvmat, vec3 lampvec, mat4 lampimat, vec3 lv, out float inpr)
+void lamp_visibility_spot_square(vec3 lampvec, mat4 lampimat, vec3 lv, out float inpr)
 {
-	lampvec = -normalize(lampvec);
-	lampvec = (viewmat*vec4(lampvec, 0.0)).xyz;
-
 	if(dot(lv, lampvec) > 0.0) {
-		vec3 lvrot = (viewinvmat*vec4(lv, 0.0)).xyz;
-		lvrot = (lampimat*vec4(lvrot, 0.0)).xyz;
+		vec3 lvrot = (lampimat*vec4(lv, 0.0)).xyz;
 		float x = max(abs(lvrot.x/lvrot.z), abs(lvrot.y/lvrot.z));
 
 		inpr = 1.0/sqrt(1.0 + x*x);

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list