[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