[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