Revision: 42543
          
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=42543
Author:   mmikkelsen
Date:     2011-12-09 23:26:06 +0000 (Fri, 09 Dec 2011)
Log Message:
-----------
fixes scale on derivative maps

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/BKE_DerivedMesh.h
    trunk/blender/source/blender/blenkernel/intern/DerivedMesh.c
    trunk/blender/source/blender/gpu/GPU_material.h
    trunk/blender/source/blender/gpu/intern/gpu_codegen.c
    trunk/blender/source/blender/gpu/intern/gpu_draw.c
    trunk/blender/source/blender/gpu/intern/gpu_material.c
    trunk/blender/source/blender/python/intern/gpu.c
    trunk/blender/source/blender/render/intern/source/render_texture.c
    trunk/blender/source/gameengine/Ketsji/BL_BlenderShader.cpp

Modified: trunk/blender/source/blender/blenkernel/BKE_DerivedMesh.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_DerivedMesh.h   2011-12-09 
21:07:37 UTC (rev 42542)
+++ trunk/blender/source/blender/blenkernel/BKE_DerivedMesh.h   2011-12-09 
23:26:06 UTC (rev 42543)
@@ -94,6 +94,7 @@
        BVHCache bvhCache;
        struct GPUDrawObject *drawObject;
        DerivedMeshType type;
+       float auto_bump_scale;
 
        /* Misc. Queries */
 
@@ -578,6 +579,7 @@
        struct GPUVertexAttribs *gattribs, DMVertexAttribs *attribs);
 
 void DM_add_tangent_layer(DerivedMesh *dm);
+void DM_calc_auto_bump_scale(DerivedMesh *dm);
 
 /* Set object's bounding box based on DerivedMesh min/max data */
 void DM_set_object_boundbox(struct Object *ob, DerivedMesh *dm);

Modified: trunk/blender/source/blender/blenkernel/intern/DerivedMesh.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/DerivedMesh.c        
2011-12-09 21:07:37 UTC (rev 42542)
+++ trunk/blender/source/blender/blenkernel/intern/DerivedMesh.c        
2011-12-09 23:26:06 UTC (rev 42543)
@@ -184,6 +184,7 @@
        DM_init_funcs(dm);
        
        dm->needsFree = 1;
+       dm->auto_bump_scale = -1.0f;
 }
 
 void DM_from_template(DerivedMesh *dm, DerivedMesh *source, DerivedMeshType 
type,
@@ -1831,6 +1832,159 @@
        MEM_freeN(vtangents);
 }
 
+void DM_calc_auto_bump_scale(DerivedMesh *dm)
+{
+       int totvert= dm->getNumVerts(dm);
+       int totface= dm->getNumFaces(dm);
+
+       MVert * mvert = dm->getVertArray(dm);
+       MFace * mface = dm->getFaceArray(dm);
+       MTFace * mtface = dm->getFaceDataArray(dm, CD_MTFACE);
+
+       if(mtface)
+       {
+               double dsum = 0.0;
+               int nr_accumulated = 0;
+               int f;
+
+               for ( f=0; f<totface; f++ )
+               {
+                       {
+                               float * verts[4], * tex_coords[4];
+                               const int nr_verts = mface[f].v4!=0 ? 4 : 3;
+                               int i, is_degenerate;
+
+                               verts[0]=mvert[mface[f].v1].co; 
verts[1]=mvert[mface[f].v2].co; verts[2]=mvert[mface[f].v3].co;
+                               tex_coords[0]=mtface[f].uv[0]; 
tex_coords[1]=mtface[f].uv[1]; tex_coords[2]=mtface[f].uv[2];
+                               if(nr_verts==4)
+                               {
+                                       verts[3]=mvert[mface[f].v4].co;
+                                       tex_coords[3]=mtface[f].uv[3];
+                               }
+
+                               // discard degenerate faces
+                               is_degenerate = 0;
+                               if(     equals_v3v3(verts[0], verts[1]) || 
equals_v3v3(verts[0], verts[2]) || equals_v3v3(verts[1], verts[2]) ||
+                                       equals_v2v2(tex_coords[0], 
tex_coords[1]) || equals_v2v2(tex_coords[0], tex_coords[2]) || 
equals_v2v2(tex_coords[1], tex_coords[2]) )
+                               {
+                                       is_degenerate = 1;
+                               }
+
+                               // verify last vertex as well if this is a quad
+                               if ( is_degenerate==0 && nr_verts==4 )
+                               {
+                                       if(     equals_v3v3(verts[3], verts[0]) 
|| equals_v3v3(verts[3], verts[1]) || equals_v3v3(verts[3], verts[2]) ||
+                                               equals_v2v2(tex_coords[3], 
tex_coords[0]) || equals_v2v2(tex_coords[3], tex_coords[1]) || 
equals_v2v2(tex_coords[3], tex_coords[2]) )
+                                       {
+                                               is_degenerate = 1;
+                                       }
+
+                                       // verify the winding is consistent
+                                       if ( is_degenerate==0 )
+                                       {
+                                               float prev_edge[2];
+                                               int is_signed = 0;
+                                               sub_v2_v2v2(prev_edge, 
tex_coords[0], tex_coords[3]);
+
+                                               i = 0;
+                                               while ( is_degenerate==0 && i<4 
)
+                                               {
+                                                       float cur_edge[2], 
signed_area;
+                                                       sub_v2_v2v2(cur_edge, 
tex_coords[(i+1)&0x3], tex_coords[i]);
+                                                       signed_area = 
prev_edge[0]*cur_edge[1] - prev_edge[1]*cur_edge[0];
+                                                       if ( i==0 ) is_signed = 
signed_area<0.0f ? 1 : 0;
+                                                       else 
if((is_signed!=0)!=(signed_area<0.0f)) is_degenerate=1;
+
+                                                       if ( is_degenerate==0 )
+                                                       {
+                                                               
copy_v2_v2(prev_edge, cur_edge);
+                                                               ++i;
+                                                       }
+                                               }
+                                       }
+                               }
+
+                               // proceed if not a degenerate face
+                               if ( is_degenerate==0 )
+                               {
+                                       int nr_tris_to_pile=0;
+                                       // quads split at shortest diagonal
+                                       int offs = 0;           // initial 
triangulation is 0,1,2 and 0, 2, 3
+                                       if ( nr_verts==4 )
+                                       {
+                                               float pos_len_diag0, 
pos_len_diag1;
+                                               float vtmp[3];
+                                               sub_v3_v3v3(vtmp, verts[2], 
verts[0]);
+                                               pos_len_diag0 = dot_v3v3(vtmp, 
vtmp);
+                                               sub_v3_v3v3(vtmp, verts[3], 
verts[1]);
+                                               pos_len_diag1 = dot_v3v3(vtmp, 
vtmp);
+
+                                               if(pos_len_diag1<pos_len_diag0)
+                                                       offs=1;         // 
alter split
+                                               else 
if(pos_len_diag0==pos_len_diag1)           // do UV check instead
+                                               {
+                                                       float tex_len_diag0, 
tex_len_diag1;
+
+                                                       sub_v2_v2v2(vtmp, 
tex_coords[2], tex_coords[0]);
+                                                       tex_len_diag0 = 
dot_v2v2(vtmp, vtmp);
+                                                       sub_v2_v2v2(vtmp, 
tex_coords[3], tex_coords[1]);
+                                                       tex_len_diag1 = 
dot_v2v2(vtmp, vtmp);
+
+                                                       
if(tex_len_diag1<tex_len_diag0)
+                                                       {
+                                                               offs=1;         
// alter split
+                                                       }
+                                               }
+                                       }
+                                       nr_tris_to_pile = nr_verts-2 ;
+                                       if ( nr_tris_to_pile==1 || 
nr_tris_to_pile==2 )
+                                       {
+                                               const int indices[] = {offs+0, 
offs+1, offs+2, offs+0, offs+2, (offs+3)&0x3 };
+                                               int t;
+                                               for ( t=0; t<nr_tris_to_pile; 
t++ )
+                                               {
+                                                       float f2x_area_uv;
+                                                       float * p0 = 
verts[indices[t*3+0]];
+                                                       float * p1 = 
verts[indices[t*3+1]];
+                                                       float * p2 = 
verts[indices[t*3+2]];
+
+                                                       float edge_t0[2], 
edge_t1[2];
+                                                       sub_v2_v2v2(edge_t0, 
tex_coords[indices[t*3+1]], tex_coords[indices[t*3+0]]);
+                                                       sub_v2_v2v2(edge_t1, 
tex_coords[indices[t*3+2]], tex_coords[indices[t*3+0]]);
+
+                                                       f2x_area_uv = 
fabsf(edge_t0[0]*edge_t1[1] - edge_t0[1]*edge_t1[0]);
+                                                       if ( 
f2x_area_uv>FLT_EPSILON )
+                                                       {
+                                                               float norm[3], 
v0[3], v1[3], f2x_surf_area, fsurf_ratio;
+                                                               sub_v3_v3v3(v0, 
p1, p0);
+                                                               sub_v3_v3v3(v1, 
p2, p0);
+                                                               
cross_v3_v3v3(norm, v0, v1);
+
+                                                               f2x_surf_area = 
len_v3(norm);
+                                                               fsurf_ratio = 
f2x_surf_area/f2x_area_uv;        // tri area divided by texture area
+
+                                                               
++nr_accumulated;
+                                                               dsum += 
(double)(fsurf_ratio);
+                                                       }
+                                               }
+                                       }
+                               }
+                       }
+               }
+
+               // finalize
+               {
+                       const float avg_area_ratio = (nr_accumulated>0) ? 
((float)(dsum / nr_accumulated)) : 1.0f;
+                       const float use_as_render_bump_scale = 
sqrtf(avg_area_ratio);           // use width of average surface ratio as your 
bump scale
+                       dm->auto_bump_scale = use_as_render_bump_scale;
+               }
+       }
+       else
+       {
+               dm->auto_bump_scale = 1.0f;
+       }
+}
+
 void DM_vertex_attributes_from_gpu(DerivedMesh *dm, GPUVertexAttribs 
*gattribs, DMVertexAttribs *attribs)
 {
        CustomData *vdata, *fdata, *tfdata = NULL;
@@ -1851,6 +2005,10 @@
        else
                tfdata = fdata;
 
+       /* calc auto bump scale if necessary */
+       if(dm->auto_bump_scale<=0.0f)
+               DM_calc_auto_bump_scale(dm);
+
        /* add a tangent layer if necessary */
        for(b = 0; b < gattribs->totlayer; b++)
                if(gattribs->layer[b].type == CD_TANGENT)

Modified: trunk/blender/source/blender/gpu/GPU_material.h
===================================================================
--- trunk/blender/source/blender/gpu/GPU_material.h     2011-12-09 21:07:37 UTC 
(rev 42542)
+++ trunk/blender/source/blender/gpu/GPU_material.h     2011-12-09 23:26:06 UTC 
(rev 42543)
@@ -83,7 +83,8 @@
        GPU_INVERSE_OBJECT_MATRIX = 8,
        GPU_VIEW_POSITION = 16,
        GPU_VIEW_NORMAL = 32,
-       GPU_OBCOLOR = 64
+       GPU_OBCOLOR = 64,
+       GPU_AUTO_BUMPSCALE = 128
 } GPUBuiltin;
 
 typedef enum GPUBlendMode {
@@ -129,7 +130,7 @@
 void GPU_materials_free(void);
 
 void GPU_material_bind(GPUMaterial *material, int oblay, int viewlay, double 
time, int mipmap);
-void GPU_material_bind_uniforms(GPUMaterial *material, float obmat[][4], float 
viewmat[][4], float viewinv[][4], float obcol[4]);
+void GPU_material_bind_uniforms(GPUMaterial *material, float obmat[][4], float 
viewmat[][4], float viewinv[][4], float obcol[4], float autobumpscale);
 void GPU_material_unbind(GPUMaterial *material);
 int GPU_material_bound(GPUMaterial *material);
 
@@ -162,6 +163,7 @@
        GPU_DYNAMIC_OBJECT_VIEWIMAT = 3,
        GPU_DYNAMIC_OBJECT_IMAT = 4,
        GPU_DYNAMIC_OBJECT_COLOR = 5,
+       GPU_DYNAMIC_OBJECT_AUTOBUMPSCALE = 15,
        GPU_DYNAMIC_LAMP_FIRST = 6,
        GPU_DYNAMIC_LAMP_DYNVEC = 6,
        GPU_DYNAMIC_LAMP_DYNCO = 7,

Modified: trunk/blender/source/blender/gpu/intern/gpu_codegen.c
===================================================================
--- trunk/blender/source/blender/gpu/intern/gpu_codegen.c       2011-12-09 
21:07:37 UTC (rev 42542)
+++ trunk/blender/source/blender/gpu/intern/gpu_codegen.c       2011-12-09 
23:26:06 UTC (rev 42543)
@@ -344,6 +344,8 @@
                return "varnormal";
        else if(builtin == GPU_OBCOLOR)
                return "unfobcolor";
+       else if(builtin == GPU_AUTO_BUMPSCALE)
+               return "unfobautobumpscale";
        else
                return "";
 }

Modified: trunk/blender/source/blender/gpu/intern/gpu_draw.c
===================================================================
--- trunk/blender/source/blender/gpu/intern/gpu_draw.c  2011-12-09 21:07:37 UTC 
(rev 42542)
+++ trunk/blender/source/blender/gpu/intern/gpu_draw.c  2011-12-09 23:26:06 UTC 
(rev 42543)
@@ -60,6 +60,7 @@
 #include "BKE_node.h"
 #include "BKE_object.h"
 #include "BKE_scene.h"
+#include "BKE_DerivedMesh.h"
 
 #include "BLI_threads.h"
 #include "BLI_blenlib.h"
@@ -1159,7 +1160,7 @@
                        gpumat = GPU_material_from_blender(GMS.gscene, mat);
                        GPU_material_vertex_attributes(gpumat, gattribs);
                        GPU_material_bind(gpumat, GMS.gob->lay, GMS.glay, 1.0, 
!(GMS.gob->mode & OB_MODE_TEXTURE_PAINT));
-                       GPU_material_bind_uniforms(gpumat, GMS.gob->obmat, 
GMS.gviewmat, GMS.gviewinv, GMS.gob->col);
+                       GPU_material_bind_uniforms(gpumat, GMS.gob->obmat, 
GMS.gviewmat, GMS.gviewinv, GMS.gob->col, 
GMS.gob->derivedFinal->auto_bump_scale);
                        GMS.gboundmat= mat;
 
                        /* for glsl use alpha blend mode, unless it's set to 
solid and

Modified: trunk/blender/source/blender/gpu/intern/gpu_material.c
===================================================================
--- trunk/blender/source/blender/gpu/intern/gpu_material.c      2011-12-09 
21:07:37 UTC (rev 42542)
+++ trunk/blender/source/blender/gpu/intern/gpu_material.c      2011-12-09 
23:26:06 UTC (rev 42543)
@@ -94,7 +94,7 @@
        /* for passing uniforms */
        int viewmatloc, invviewmatloc;
        int obmatloc, invobmatloc;
-       int obcolloc;
+       int obcolloc, obautobumpscaleloc;
 
        ListBase lamps;
 };
@@ -212,7 +212,8 @@
                        material->invobmatloc = GPU_shader_get_uniform(shader, 
GPU_builtin_name(GPU_INVERSE_OBJECT_MATRIX));
                if(material->builtins & GPU_OBCOLOR)
                        material->obcolloc = GPU_shader_get_uniform(shader, 
GPU_builtin_name(GPU_OBCOLOR));
-
+               if(material->builtins & GPU_AUTO_BUMPSCALE)
+                       material->obautobumpscaleloc = 
GPU_shader_get_uniform(shader, GPU_builtin_name(GPU_AUTO_BUMPSCALE));
                return 1;
        }
 
@@ -273,7 +274,7 @@
        }
 }
 

@@ Diff output truncated at 10240 characters. @@
_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to