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

Brecht Van Lommel brechtvanlommel at pandora.be
Thu Jul 24 20:00:48 CEST 2008


Revision: 15737
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=15737
Author:   blendix
Date:     2008-07-24 20:00:46 +0200 (Thu, 24 Jul 2008)

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

* Added ObColor support, though it works different than for TexFaces.
  It used a new ObColor option in the materials, which will modulate
  the final color/alpha with the object color and alpha, also works
  in the render engine.
* Made GLSL check the ZTransp flag. A material is now only drawn
  transparent if this flag is enabled, a bit more consistent with the
  render engine.
* Fix for bug #17359: crash related subsurf + editmode GLSL.

Modified Paths:
--------------
    branches/apricot/source/blender/blenkernel/intern/object.c
    branches/apricot/source/blender/blenkernel/intern/subsurf_ccg.c
    branches/apricot/source/blender/gpu/GPU_material.h
    branches/apricot/source/blender/gpu/intern/gpu_codegen.c
    branches/apricot/source/blender/gpu/intern/gpu_draw.c
    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/makesdna/DNA_material_types.h
    branches/apricot/source/blender/render/intern/source/shadeoutput.c
    branches/apricot/source/blender/src/buttons_shading.c
    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/Ketsji/KX_BlenderMaterial.h

Modified: branches/apricot/source/blender/blenkernel/intern/object.c
===================================================================
--- branches/apricot/source/blender/blenkernel/intern/object.c	2008-07-24 16:58:39 UTC (rev 15736)
+++ branches/apricot/source/blender/blenkernel/intern/object.c	2008-07-24 18:00:46 UTC (rev 15737)
@@ -921,7 +921,7 @@
 	QuatOne(ob->dquat);
 #endif 
 
-	ob->col[0]= ob->col[1]= ob->col[2]= 0.0;
+	ob->col[0]= ob->col[1]= ob->col[2]= 1.0;
 	ob->col[3]= 1.0;
 
 	ob->loc[0]= ob->loc[1]= ob->loc[2]= 0.0;

Modified: branches/apricot/source/blender/blenkernel/intern/subsurf_ccg.c
===================================================================
--- branches/apricot/source/blender/blenkernel/intern/subsurf_ccg.c	2008-07-24 16:58:39 UTC (rev 15736)
+++ branches/apricot/source/blender/blenkernel/intern/subsurf_ccg.c	2008-07-24 18:00:46 UTC (rev 15737)
@@ -1720,6 +1720,7 @@
 		CCGFace *f = ccgdm->faceMap[i].face;
 		int S, x, y, drawSmooth;
 		int index = GET_INT_FROM_POINTER(ccgSubSurf_getFaceFaceHandle(ss, f));
+		int origIndex = ccgDM_getFaceMapIndex(ccgdm, ss, f);
 		
 		numVerts = ccgSubSurf_getFaceNumVerts(ss, f);
 
@@ -1738,7 +1739,7 @@
 				DM_vertex_attributes_from_gpu(dm, &gattribs, &attribs);
 		}
 
-		if(!doDraw || (setDrawOptions && !setDrawOptions(userData, index))) {
+		if(!doDraw || (setDrawOptions && !setDrawOptions(userData, origIndex))) {
 			a += gridFaces*gridFaces*numVerts;
 			continue;
 		}

Modified: branches/apricot/source/blender/gpu/GPU_material.h
===================================================================
--- branches/apricot/source/blender/gpu/GPU_material.h	2008-07-24 16:58:39 UTC (rev 15736)
+++ branches/apricot/source/blender/gpu/GPU_material.h	2008-07-24 18:00:46 UTC (rev 15737)
@@ -80,7 +80,8 @@
 	GPU_INVERSE_VIEW_MATRIX = 4,
 	GPU_INVERSE_OBJECT_MATRIX = 8,
 	GPU_VIEW_POSITION = 16,
-	GPU_VIEW_NORMAL = 32
+	GPU_VIEW_NORMAL = 32,
+	GPU_OBCOLOR = 64
 } GPUBuiltin;
 
 typedef enum GPUBlendMode {
@@ -114,7 +115,7 @@
 
 void GPU_material_output_link(GPUMaterial *material, GPUNodeLink *link);
 void GPU_material_enable_alpha(GPUMaterial *material);
-GPUBlendMode GPU_material_blend_mode(GPUMaterial *material);
+GPUBlendMode GPU_material_blend_mode(GPUMaterial *material, float obcol[4]);
 
 /* High level functions to create and use GPU materials */
 
@@ -124,7 +125,7 @@
 void GPU_materials_free();
 
 void GPU_material_bind(GPUMaterial *material, int lay);
-void GPU_material_bind_uniforms(GPUMaterial *material, float obmat[][4], float viewmat[][4], float viewinv[][4]);
+void GPU_material_bind_uniforms(GPUMaterial *material, float obmat[][4], float viewmat[][4], float viewinv[][4], float obcol[4]);
 void GPU_material_unbind(GPUMaterial *material);
 
 void GPU_material_vertex_attributes(GPUMaterial *material,

Modified: branches/apricot/source/blender/gpu/intern/gpu_codegen.c
===================================================================
--- branches/apricot/source/blender/gpu/intern/gpu_codegen.c	2008-07-24 16:58:39 UTC (rev 15736)
+++ branches/apricot/source/blender/gpu/intern/gpu_codegen.c	2008-07-24 18:00:46 UTC (rev 15737)
@@ -464,6 +464,8 @@
 		return "varposition";
 	else if(builtin == GPU_VIEW_NORMAL)
 		return "varnormal";
+	else if(builtin == GPU_OBCOLOR)
+		return "unfobcolor";
 	else
 		return "";
 }

Modified: branches/apricot/source/blender/gpu/intern/gpu_draw.c
===================================================================
--- branches/apricot/source/blender/gpu/intern/gpu_draw.c	2008-07-24 16:58:39 UTC (rev 15736)
+++ branches/apricot/source/blender/gpu/intern/gpu_draw.c	2008-07-24 18:00:46 UTC (rev 15737)
@@ -834,7 +834,7 @@
 		if(glsl && ma->gpumaterial) {
 			/* do glsl only if creating it succeed, else fallback */
 			GMS.gmatbuf[a]= ma;
-			blendmode = GPU_material_blend_mode(ma->gpumaterial);
+			blendmode = GPU_material_blend_mode(ma->gpumaterial, ob->col);
 		}
 		else {
 			/* fixed function opengl materials */
@@ -891,6 +891,7 @@
 
 	/* unbind glsl material */
 	if(GMS.gboundmat) {
+		if(GMS.alphapass) glDepthMask(0);
 		GPU_material_unbind(GMS.gboundmat->gpumaterial);
 		GMS.gboundmat= NULL;
 	}
@@ -908,8 +909,10 @@
 
 			GPU_material_vertex_attributes(mat->gpumaterial, gattribs);
 			GPU_material_bind(mat->gpumaterial, GMS.gob->lay);
-			GPU_material_bind_uniforms(mat->gpumaterial, GMS.gob->obmat, G.vd->viewmat, G.vd->viewinv);
+			GPU_material_bind_uniforms(mat->gpumaterial, GMS.gob->obmat, G.vd->viewmat, G.vd->viewinv, GMS.gob->col);
 			GMS.gboundmat= mat;
+
+			if(GMS.alphapass) glDepthMask(1);
 		}
 		else {
 			/* or do fixed function opengl material */
@@ -945,6 +948,7 @@
 	GMS.lastretval= 1;
 
 	if(GMS.gboundmat) {
+		if(GMS.alphapass) glDepthMask(0);
 		GPU_material_unbind(GMS.gboundmat->gpumaterial);
 		GMS.gboundmat= NULL;
 	}

Modified: branches/apricot/source/blender/gpu/intern/gpu_material.c
===================================================================
--- branches/apricot/source/blender/gpu/intern/gpu_material.c	2008-07-24 16:58:39 UTC (rev 15736)
+++ branches/apricot/source/blender/gpu/intern/gpu_material.c	2008-07-24 18:00:46 UTC (rev 15737)
@@ -78,7 +78,7 @@
 	GPUPass *pass;
 	GPUVertexAttribs attribs;
 	int builtins;
-	int alpha;
+	int alpha, obcolalpha;
 
 	LinkNode *lamps;
 };
@@ -221,13 +221,13 @@
 	}
 }
 
-void GPU_material_bind_uniforms(GPUMaterial *material, float obmat[][4], float viewmat[][4], float viewinv[][4])
+void GPU_material_bind_uniforms(GPUMaterial *material, float obmat[][4], float viewmat[][4], float viewinv[][4], float obcol[4])
 {
 	if(material->pass) {
 		GPUShader *shader = GPU_pass_shader(material->pass);
 		LinkNode *nlink;
 		GPULamp *lamp;
-		float invmat[4][4];
+		float invmat[4][4], col[4];
 
 		/* handle builtins */
 		if(material->builtins & GPU_VIEW_MATRIX) {
@@ -243,6 +243,11 @@
 			Mat4Invert(invmat, obmat);
 			GPU_shader_uniform_vector(shader, GPU_builtin_name(GPU_INVERSE_OBJECT_MATRIX), 16, 1, (float*)invmat);
 		}
+		if(material->builtins & GPU_OBCOLOR) {
+			QUATCOPY(col, obcol);
+			CLAMP(col[3], 0.0f, 1.0f);
+			GPU_shader_uniform_vector(shader, GPU_builtin_name(GPU_OBCOLOR), 4, 1, col);
+		}
 
 		/* update lamps */
 		for(nlink=material->lamps; nlink; nlink=nlink->next) {
@@ -286,9 +291,9 @@
 	material->alpha= 1;
 }
 
-GPUBlendMode GPU_material_blend_mode(GPUMaterial *material)
+GPUBlendMode GPU_material_blend_mode(GPUMaterial *material, float obcol[3])
 {
-	if(material->alpha)
+	if(material->alpha || (material->obcolalpha && obcol[3] < 1.0f))
 		return GPU_BLEND_ALPHA;
 	else
 		return GPU_BLEND_SOLID;
@@ -1014,7 +1019,7 @@
 
 	do_material_tex(shi);
 
-	if(ma->alpha < 1.0f)
+	if(ma->mode & MA_ZTRA)
 		GPU_material_enable_alpha(mat);
 
 	if((G.fileflags & G_FILE_GLSL_NO_LIGHTS) || (ma->mode & MA_SHLESS)) {
@@ -1082,6 +1087,11 @@
 	}
 
 	GPU_link(mat, "mtex_alpha_to_col", shr->combined, shr->alpha, &shr->combined);
+
+	if(ma->shade_flag & MA_OBCOLOR) {
+		mat->obcolalpha = 1;
+		GPU_link(mat, "shade_obcolor", shr->combined, GPU_builtin(GPU_OBCOLOR), &shr->combined);
+	}
 }
 
 GPUNodeLink *GPU_blender_material(GPUMaterial *mat, Material *ma)

Modified: branches/apricot/source/blender/gpu/intern/gpu_shader_material.glsl
===================================================================
--- branches/apricot/source/blender/gpu/intern/gpu_shader_material.glsl	2008-07-24 16:58:39 UTC (rev 15736)
+++ branches/apricot/source/blender/gpu/intern/gpu_shader_material.glsl	2008-07-24 18:00:46 UTC (rev 15737)
@@ -1473,6 +1473,11 @@
 	outcol = col*fac;
 }
 
+void shade_obcolor(vec4 col, vec4 obcol, out vec4 outcol)
+{
+	outcol = col*obcol;
+}
+
 void ramp_rgbtobw(vec3 color, out float outval)
 {
 	outval = color.r*0.3 + color.g*0.58 + color.b*0.12;

Modified: branches/apricot/source/blender/gpu/intern/gpu_shader_material.glsl.c
===================================================================
--- branches/apricot/source/blender/gpu/intern/gpu_shader_material.glsl.c	2008-07-24 16:58:39 UTC (rev 15736)
+++ branches/apricot/source/blender/gpu/intern/gpu_shader_material.glsl.c	2008-07-24 18:00:46 UTC (rev 15737)
@@ -1,976 +1,978 @@
 /* DataToC output of file <gpu_shader_material_glsl> */
 
-int datatoc_gpu_shader_material_glsl_size= 32168;
+int datatoc_gpu_shader_material_glsl_size= 32252;
 char datatoc_gpu_shader_material_glsl[]= {
- 10,102,108,111, 97,116, 32,101,
-120,112, 95, 98,108,101,110,100,101,114, 40,102,108,111, 97,116, 32,102, 41, 10,123, 10,  9,114,101,116,117,114,110, 32,112,111,
-119, 40, 50, 46, 55, 49, 56, 50, 56, 49, 56, 50, 56, 52, 54, 44, 32,102, 41, 59, 10,125, 10, 10,118,111,105,100, 32,114,103, 98,
- 95,116,111, 95,104,115,118, 40,118,101, 99, 52, 32,114,103, 98, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,
-108, 41, 10,123, 10,  9,102,108,111, 97,116, 32, 99,109, 97,120, 44, 32, 99,109,105,110, 44, 32,104, 44, 32,115, 44, 32,118, 44,
- 32, 99,100,101,108,116, 97, 59, 10,  9,118,101, 99, 51, 32, 99, 59, 10, 10,  9, 99,109, 97,120, 32, 61, 32,109, 97,120, 40,114,
-103, 98, 91, 48, 93, 44, 32,109, 97,120, 40,114,103, 98, 91, 49, 93, 44, 32,114,103, 98, 91, 50, 93, 41, 41, 59, 10,  9, 99,109,
-105,110, 32, 61, 32,109,105,110, 40,114,103, 98, 91, 48, 93, 44, 32,109,105,110, 40,114,103, 98, 91, 49, 93, 44, 32,114,103, 98,
- 91, 50, 93, 41, 41, 59, 10,  9, 99,100,101,108,116, 97, 32, 61, 32, 99,109, 97,120, 45, 99,109,105,110, 59, 10, 10,  9,118, 32,
- 61, 32, 99,109, 97,120, 59, 10,  9,105,102, 32, 40, 99,109, 97,120, 33, 61, 48, 46, 48, 41, 10,  9,  9,115, 32, 61, 32, 99,100,
-101,108,116, 97, 47, 99,109, 97,120, 59, 10,  9,101,108,115,101, 32,123, 10,  9,  9,115, 32, 61, 32, 48, 46, 48, 59, 10,  9,  9,
-104, 32, 61, 32, 48, 46, 48, 59, 10,  9,125, 10, 10,  9,105,102, 32, 40,115, 32, 61, 61, 32, 48, 46, 48, 41, 32,123, 10,  9,  9,
-104, 32, 61, 32, 48, 46, 48, 59, 10,  9,125, 10,  9,101,108,115,101, 32,123, 10,  9,  9, 99, 32, 61, 32, 40,118,101, 99, 51, 40,
- 99,109, 97,120, 44, 32, 99,109, 97,120, 44, 32, 99,109, 97,120, 41, 32, 45, 32,114,103, 98, 46,120,121,122, 41, 47, 99,100,101,
-108,116, 97, 59, 10, 10,  9,  9,105,102, 32, 40,114,103, 98, 46,120, 61, 61, 99,109, 97,120, 41, 32,104, 32, 61, 32, 99, 91, 50,
- 93, 32, 45, 32, 99, 91, 49, 93, 59, 10,  9,  9,101,108,115,101, 32,105,102, 32, 40,114,103, 98, 46,121, 61, 61, 99,109, 97,120,
- 41, 32,104, 32, 61, 32, 50, 46, 48, 32, 43, 32, 99, 91, 48, 93, 32, 45, 32, 32, 99, 91, 50, 93, 59, 10,  9,  9,101,108,115,101,

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list