Revision: 44302
          
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=44302
Author:   nazgul
Date:     2012-02-21 17:23:32 +0000 (Tue, 21 Feb 2012)
Log Message:
-----------
Improved displacement flipping algorithm to work properly in cases when target 
grid isn't orthogonal.

Subdivision of face now works pretty smooth, only producing minor unwanted 
displacement on the along edges.

Modified Paths:
--------------
    trunk/blender/source/blender/bmesh/intern/bmesh_interp.c
    trunk/blender/source/blender/bmesh/intern/bmesh_mods.c

Modified: trunk/blender/source/blender/bmesh/intern/bmesh_interp.c
===================================================================
--- trunk/blender/source/blender/bmesh/intern/bmesh_interp.c    2012-02-21 
17:23:03 UTC (rev 44301)
+++ trunk/blender/source/blender/bmesh/intern/bmesh_interp.c    2012-02-21 
17:23:32 UTC (rev 44302)
@@ -551,26 +551,45 @@
        return 1;
 }
 
+static float bmesh_loop_flip_equotion(float mat[2][2], float b[2], float 
target_axis_x[3], float target_axis_y[3],
+                                      float coord[3], int i, int j)
+{
+       mat[0][0] = target_axis_x[i];
+       mat[0][1] = target_axis_y[i];
+       mat[1][0] = target_axis_x[j];
+       mat[1][1] = target_axis_y[j];
+       b[0] = coord[i];
+       b[1] = coord[j];
+
+       return mat[0][0]*mat[1][1] - mat[0][1]*mat[1][0];
+}
+
 static void bmesh_loop_flip_disp(float source_axis_x[3], float 
source_axis_y[3],
                                  float target_axis_x[3], float 
target_axis_y[3], float disp[3])
 {
        float vx[3], vy[3], coord[3];
+       float n[3], vec[3];
+       float b[2], mat[2][2], d;
 
        mul_v3_v3fl(vx, source_axis_x, disp[0]);
        mul_v3_v3fl(vy, source_axis_y, disp[1]);
        add_v3_v3v3(coord, vx, vy);
 
-       project_v3_v3v3(vx, coord, target_axis_x);
-       project_v3_v3v3(vy, coord, target_axis_y);
+       /* project displacement from source grid plane onto target grid plane */
+       cross_v3_v3v3(n, target_axis_x, target_axis_y);
+       project_v3_v3v3(vec, coord, n);
+       sub_v3_v3v3(coord, coord, vec);
 
-       disp[0] = len_v3(vx);
-       disp[1] = len_v3(vy);
+       d = bmesh_loop_flip_equotion(mat, b, target_axis_x, target_axis_y, 
coord, 0, 1);
 
-       if(dot_v3v3(vx, target_axis_x) < 0)
-               disp[0] = -disp[0];
+       if (fabsf(d) < 1e-4) {
+               d = bmesh_loop_flip_equotion(mat, b, target_axis_x, 
target_axis_y, coord, 0, 2);
+               if (fabsf(d) < 1e-4)
+                       d = bmesh_loop_flip_equotion(mat, b, target_axis_x, 
target_axis_y, coord, 1, 2);
+       }
 
-       if(dot_v3v3(vy, target_axis_y) < 0)
-               disp[1] = -disp[1];
+       disp[0] = (b[0]*mat[1][1] - mat[0][1]*b[1]) / d;
+       disp[1] = (mat[0][0]*b[1] - b[0]*mat[1][0]) / d;
 }
 
 static void bmesh_loop_interp_mdisps(BMesh *bm, BMLoop *target, BMFace *source)

Modified: trunk/blender/source/blender/bmesh/intern/bmesh_mods.c
===================================================================
--- trunk/blender/source/blender/bmesh/intern/bmesh_mods.c      2012-02-21 
17:23:03 UTC (rev 44301)
+++ trunk/blender/source/blender/bmesh/intern/bmesh_mods.c      2012-02-21 
17:23:32 UTC (rev 44302)
@@ -377,8 +377,11 @@
 
                        BM_face_kill(bm, of);
 
+#if 0
+                       /* BM_face_multires_bounds_smooth doesn't flip 
displacement correct */
                        BM_face_multires_bounds_smooth(bm, f);
                        BM_face_multires_bounds_smooth(bm, nf);
+#endif
                }
        }
 

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to