[Bf-committers] [Bf-blender-cvs] SVN commit: /data/svn/bf-blender [42543] trunk/blender/source: fixes scale on derivative maps

Campbell Barton ideasman42 at gmail.com
Sat Dec 10 01:29:52 CET 2011


Was this reviewed for inclusion?

Having wrong aspect on bumpmap isn't great but think this isn't
priority for release.

Some notes on the patch.

- This seems unnecessary to calculate for all objects in GLSL view,
even when they dont use a bumpmap,
  for example, on animation playback any deforming modifiers -
shapekey's or bones will run DM_calc_auto_bump_scale on every update.

- first time I tested this it crashed. ob->derivedFinal is assumed
valid but can be NULL, ofcourse can be fixed but not reassuring to
have code with missing checks committed so close to release.

Think this should wait until next release.


On Sat, Dec 10, 2011 at 10:26 AM, Morten Mikkelsen <mikkelsen7 at gmail.com> wrote:
> 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
> Bf-blender-cvs at blender.org
> http://lists.blender.org/mailman/listinfo/bf-blender-cvs



-- 
- Campbell


More information about the Bf-committers mailing list