[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [11786] branches/soc-2007-maike/source/ blender/src: Blocked tangent v calls, has code but does not work and isn' t called
Miguel Torres Lima
torreslima at gmail.com
Wed Aug 22 18:18:41 CEST 2007
Revision: 11786
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=11786
Author: maike
Date: 2007-08-22 18:18:41 +0200 (Wed, 22 Aug 2007)
Log Message:
-----------
Blocked tangent v calls, has code but does not work and isn't called
On materials reconstruction added entries for node materials code generation (just the calls, does not generate the code itself yet)
Modified Paths:
--------------
branches/soc-2007-maike/source/blender/src/glsl_drawobject.c
branches/soc-2007-maike/source/blender/src/glsl_uniforms.c
branches/soc-2007-maike/source/blender/src/glsl_util.c
Modified: branches/soc-2007-maike/source/blender/src/glsl_drawobject.c
===================================================================
--- branches/soc-2007-maike/source/blender/src/glsl_drawobject.c 2007-08-22 16:15:17 UTC (rev 11785)
+++ branches/soc-2007-maike/source/blender/src/glsl_drawobject.c 2007-08-22 16:18:41 UTC (rev 11786)
@@ -298,14 +298,14 @@
Lamp *lamp = light->blen_light;
Object *lamp_obj = light->obj;
- if(group && !(glsl_light_in_group(lamp_obj, group))){
+ if(lamp_obj->restrictflag & OB_RESTRICT_RENDER){
char *layer = glsl_string(3, 0, "lights[", GINT, i, 0, "].layer");
glUniform1f(glsl_uniform_location(program, layer), 0.0);
MEM_freeN(layer);
continue;
}
-
- if(lamp_obj->restrictflag & OB_RESTRICT_RENDER){
+
+ if(group && !(glsl_light_in_group(lamp_obj, group))){
char *layer = glsl_string(3, 0, "lights[", GINT, i, 0, "].layer");
glUniform1f(glsl_uniform_location(program, layer), 0.0);
MEM_freeN(layer);
@@ -337,13 +337,13 @@
void create_vertex(Object *obj, MVert *vert, int index, int flag, float *tangent, short tanflag, short tanindex)
{
if(flag & ME_SMOOTH){
- if(tanflag){
+ /*if(tanflag){
glNormal3fv(&tangent[tanindex]);
}
- else{
+ else{*/
short *no = vert[index].no;
glNormal3sv(no);
- }
+ /*}*/
}
glVertex3fv(vert[index].co);
@@ -416,19 +416,19 @@
glsl_light_uniforms(program->program, ob, (mat->mode & MA_GROUP_NOLAY)?1:0, mat->group);
oldmat = mat;
- if(mat){
+ if(mat && mat != &defmaterial){
glsl_update_colorband_tex_uniforms(program->program, mat, 0);
}
}
- if(mat->mode & MA_TANGENT_V){
+ /*if(mat->mode & MA_TANGENT_V){
if(face->flag & ME_SMOOTH){
float normals[12];
glsl_get_normals(face, vert, &normals[0]);
glsl_tangentspace(ob, (Mesh *) ob->data, face, tface, &normals[0], &tangent[0]);
}
- }
+ }*/
glBegin(face->v4?GL_QUADS:GL_TRIANGLES);
if(!(face->flag & ME_SMOOTH)){
@@ -452,40 +452,51 @@
else
tmpcol = NULL;
- if(program){
- set_vertex_color(mat, tmpcol, 1, program->program);
- send_texture_coords(mat, program->program, ob, vert, face->v1);
- }
- else if(mat->mode & MA_SHLESS)
- set_vertex_color(mat, tmpcol, 1, 0);
- create_vertex(ob, vert, face->v1, face->flag, &tangent[0], (mat->mode & MA_TANGENT_V)?1:0, 0);
- if(program){
- set_vertex_color(mat, tmpcol, 5, program->program);
- send_texture_coords(mat, program->program, ob, vert, face->v2);
+ if(mat == &defmaterial){
+ create_vertex(ob, vert, face->v1, face->flag, &tangent[0], (mat->mode & MA_TANGENT_V)?1:0, 0);
+ create_vertex(ob, vert, face->v2, face->flag, &tangent[0], (mat->mode & MA_TANGENT_V)?1:0, 1);
+ create_vertex(ob, vert, face->v3, face->flag, &tangent[0], (mat->mode & MA_TANGENT_V)?1:0, 2);
+ if(face->v4){
+ create_vertex(ob, vert, face->v4, face->flag, &tangent[0], (mat->mode & MA_TANGENT_V)?1:0, 3);
+ }
}
- else if(mat->mode & MA_SHLESS)
- set_vertex_color(mat, tmpcol, 5, 0);
- create_vertex(ob, vert, face->v2, face->flag, &tangent[0], (mat->mode & MA_TANGENT_V)?1:0, 1);
-
- if(program){
- set_vertex_color(mat, tmpcol, 9, program->program);
- send_texture_coords(mat, program->program, ob, vert, face->v3);
- }
- else if(mat->mode & MA_SHLESS)
- set_vertex_color(mat, tmpcol, 9, 0);
- create_vertex(ob, vert, face->v3, face->flag, &tangent[0], (mat->mode & MA_TANGENT_V)?1:0, 2);
-
- if(face->v4){
+ else{
if(program){
- set_vertex_color(mat, tmpcol, 13, program->program);
- send_texture_coords(mat, program->program, ob, vert, face->v4);
+ set_vertex_color(mat, tmpcol, 1, program->program);
+ send_texture_coords(mat, program->program, ob, vert, face->v1);
}
else if(mat->mode & MA_SHLESS)
- set_vertex_color(mat, tmpcol, 13, 0);
- create_vertex(ob, vert, face->v4, face->flag, &tangent[0], (mat->mode & MA_TANGENT_V)?1:0, 3);
+ set_vertex_color(mat, tmpcol, 1, 0);
+ create_vertex(ob, vert, face->v1, face->flag, &tangent[0], (mat->mode & MA_TANGENT_V)?1:0, 0);
+
+ if(program){
+ set_vertex_color(mat, tmpcol, 5, program->program);
+ send_texture_coords(mat, program->program, ob, vert, face->v2);
+ }
+ else if(mat->mode & MA_SHLESS)
+ set_vertex_color(mat, tmpcol, 5, 0);
+ create_vertex(ob, vert, face->v2, face->flag, &tangent[0], (mat->mode & MA_TANGENT_V)?1:0, 1);
+
+ if(program){
+ set_vertex_color(mat, tmpcol, 9, program->program);
+ send_texture_coords(mat, program->program, ob, vert, face->v3);
+ }
+ else if(mat->mode & MA_SHLESS)
+ set_vertex_color(mat, tmpcol, 9, 0);
+ create_vertex(ob, vert, face->v3, face->flag, &tangent[0], (mat->mode & MA_TANGENT_V)?1:0, 2);
+
+ if(face->v4){
+ if(program){
+ set_vertex_color(mat, tmpcol, 13, program->program);
+ send_texture_coords(mat, program->program, ob, vert, face->v4);
+ }
+ else if(mat->mode & MA_SHLESS)
+ set_vertex_color(mat, tmpcol, 13, 0);
+ create_vertex(ob, vert, face->v4, face->flag, &tangent[0], (mat->mode & MA_TANGENT_V)?1:0, 3);
+ }
}
-
+
glEnd();
if(nors) nors += 3;
@@ -648,7 +659,7 @@
glsl_light_uniforms(program->program, ob, (mat->mode & MA_GROUP_NOLAY)?1:0, mat->group);
- if(mat)
+ if(mat && mat != &defmaterial)
glsl_update_colorband_tex_uniforms(program->program, mat, 0);
}
}
Modified: branches/soc-2007-maike/source/blender/src/glsl_uniforms.c
===================================================================
--- branches/soc-2007-maike/source/blender/src/glsl_uniforms.c 2007-08-22 16:15:17 UTC (rev 11785)
+++ branches/soc-2007-maike/source/blender/src/glsl_uniforms.c 2007-08-22 16:18:41 UTC (rev 11786)
@@ -121,7 +121,7 @@
glUseProgram(program);
- if(mat->mode & MA_TANGENT_V){
+ /*if(mat->mode & MA_TANGENT_V){
char *tangent = glsl_string(3, 0, "u_mat_", GINT, index, 0, "_tanv");
glUniform1f(glsl_uniform_location(program, tangent), 1.0);
MEM_freeN(tangent);
@@ -130,7 +130,7 @@
char *tangent = glsl_string(3, 0, "u_mat_", GINT, index, 0, "_tanv");
glUniform1f(glsl_uniform_location(program, tangent), 0.0);
MEM_freeN(tangent);
- }
+ }*/
spec = glsl_string(3, 0, "u_mat_", GINT, index, 0, "_spec_color");
alpha = glsl_string(3, 0, "u_mat_", GINT, index, 0, "_alpha");
Modified: branches/soc-2007-maike/source/blender/src/glsl_util.c
===================================================================
--- branches/soc-2007-maike/source/blender/src/glsl_util.c 2007-08-22 16:15:17 UTC (rev 11785)
+++ branches/soc-2007-maike/source/blender/src/glsl_util.c 2007-08-22 16:18:41 UTC (rev 11786)
@@ -107,13 +107,19 @@
for(i = 0; i < totcol; i++){
if(mat[i]){
- glsl_create_materialtree(mat[i], GLSL_MAT);
+ if(mat[i]->use_nodes && mat[i]->nodetree)
+ glsl_create_materialtree(mat[i], GLSL_NODES);
+ else
+ glsl_create_materialtree(mat[i], GLSL_MAT);
}
}
for(i = 0; i < obj->totcol; i++){
if(obj->mat[i]){
- glsl_create_materialtree(obj->mat[i], GLSL_MAT);
+ if(mat[i]->use_nodes && mat[i]->nodetree)
+ glsl_create_materialtree(obj->mat[i], GLSL_NODES);
+ else
+ glsl_create_materialtree(mat[i], GLSL_MAT);
}
}
}
@@ -275,6 +281,9 @@
{
GLint loc = glGetUniformLocation(program, name);
+ if(loc == -1)
+ printf("\nGLSL error, uniform location not found: %s...\n", name);
+
return loc;
}
@@ -302,8 +311,6 @@
duv2[0] = uv3[0] - uv1[0];
duv2[1] = uv3[1] - uv1[1];
- //printf("\ndx: %f, %f, %f\n", duv1[0], duv1[1], duv1[2]);
-
r = 1.0 / (duv1[0] * duv2[1] - duv2[0] * duv1[1]);
VECMUL(duv1, r);
@@ -357,70 +364,81 @@
}
}
+
void glsl_tangentspace(Object *ob, Mesh *mesh, MFace *face, MTFace *tface, float *normal, float *tangent)
{
- float *tan1 = MEM_mallocN(sizeof(float) * (9 + face->v4 * 3), "GLSL Tangent");
- float *tan2 = MEM_mallocN(sizeof(float) * (9 + face->v4 * 3), "GLSL Tangent");
- int i;
- float uv[4][2];
+ float *tan1 = MEM_mallocN(sizeof(float) * 12, "GLSL Tangent");
+ float *tan2 = MEM_mallocN(sizeof(float) * 12, "GLSL Tangent");
float *orco = glsl_make_orco_mesh(ob, 0);
- for(i = 0; i < 9 + face->v4 * 3; i++){
- tan1[i] = 0.0;
- tan2[i] = 0.0;
- }
-
- spheremap(orco[face->v1], orco[face->v1 + 1], orco[face->v1 + 2], &uv[0][0], &uv[0][1]);
+ float tang[3], tangv[3], ct[3], e1[3], e2[3], *tav;
+ float *uv1, *uv2, *uv3, *uv4;
+ float s1, s2, t1, t2, det;
+ float uv[4][2];
+
+ /*spheremap(orco[face->v1], orco[face->v1 + 1], orco[face->v1 + 2], &uv[0][0], &uv[0][1]);
spheremap(orco[face->v2], orco[face->v2 + 1], orco[face->v2 + 2], &uv[1][0], &uv[1][1]);
spheremap(orco[face->v3], orco[face->v3 + 1], orco[face->v3 + 2], &uv[2][0], &uv[2][1]);
if(face->v4)
- spheremap(orco[face->v4], orco[face->v4 + 1], orco[face->v4 + 2], &uv[3][0], &uv[3][1]);
+ spheremap(orco[face->v4], orco[face->v4 + 1], orco[face->v4 + 2], &uv[3][0], &uv[3][0]);
+
+ s1= uv2[0] - uv1[0];
+ s2= uv3[0] - uv1[0];
+ t1= uv2[1] - uv1[1];
+ t2= uv3[1] - uv1[1];
+ det= 1.0f / (s1 * t2 - s2 * t1);
+
+ VecSubf(e1, face->v1.co, face->v2.co);
+ VecSubf(e2, face->v1.co, face->v3.co);
+ tang[0] = (t2*e1[0] - t1*e2[0])*det;
+ tang[1] = (t2*e1[1] - t1*e2[1])*det;
+ tang[2] = (t2*e1[2] - t1*e2[2])*det;
+ tangv[0] = (s1*e2[0] - s2*e1[0])*det;
+ tangv[1] = (s1*e2[1] - s2*e1[1])*det;
+ tangv[2] = (s1*e2[2] - s2*e1[2])*det;
+ Crossf(ct, tang, tangv);
+
+ if ((ct[0]*vlr->n[0] + ct[1]*vlr->n[1] + ct[2]*vlr->n[2]) < 0.f)
+ VecMulf(tang, -1.f);
- glsl_tritangent(mesh->mvert[face->v1].co, mesh->mvert[face->v2].co, mesh->mvert[face->v3].co,
- uv[0], uv[1], uv[2], face, tan1, tan2, 0);
+ tav= RE_vertren_get_tangent(re, v1, 1);
+ VECADD(tav, tav, tang);
+ tav= RE_vertren_get_tangent(re, v2, 1);
+ VECADD(tav, tav, tang);
+ tav= RE_vertren_get_tangent(re, v3, 1);
+ VECADD(tav, tav, tang);
- if(face->v4)
- glsl_tritangent(mesh->mvert[face->v1].co, mesh->mvert[face->v3].co, mesh->mvert[face->v4].co,
- uv[0], uv[2], uv[3], face, tan1, tan2, 1);
-
+ if(v4) {
+ s1= uv3[0] - uv1[0];
+ s2= uv4[0] - uv1[0];
+ t1= uv3[1] - uv1[1];
+ t2= uv4[1] - uv1[1];
+ det= 1.0f / (s1 * t2 - s2 * t1);
+
-
- for(i = 0; i < 9 + ((face->v4)?1:0 * 3); i = i + 3){
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list