Revision: 42498
          
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=42498
Author:   campbellbarton
Date:     2011-12-07 20:13:15 +0000 (Wed, 07 Dec 2011)
Log Message:
-----------
BMESH TODO - BM_editselection_plane now returns a useful orientation from a 
tri/quad.

Modified Paths:
--------------
    branches/bmesh/blender/source/blender/bmesh/bmesh_iterators.h
    branches/bmesh/blender/source/blender/bmesh/intern/bmesh_iterators.c
    branches/bmesh/blender/source/blender/bmesh/intern/bmesh_marking.c

Modified: branches/bmesh/blender/source/blender/bmesh/bmesh_iterators.h
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/bmesh_iterators.h       
2011-12-07 18:51:43 UTC (rev 42497)
+++ branches/bmesh/blender/source/blender/bmesh/bmesh_iterators.h       
2011-12-07 20:13:15 UTC (rev 42498)
@@ -76,6 +76,7 @@
 }BMIter;
 
 void *BMIter_AtIndex(struct BMesh *bm, const char htype, void *data, int 
index);
+int   BMIter_AsArray(struct BMesh *bm, const char htype, void *data, void 
**array, const int len);
 
 /* private for bmesh_iterators_inline.c */
 void  bmiter__vert_of_mesh_begin(struct BMIter *iter);

Modified: branches/bmesh/blender/source/blender/bmesh/intern/bmesh_iterators.c
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/intern/bmesh_iterators.c        
2011-12-07 18:51:43 UTC (rev 42497)
+++ branches/bmesh/blender/source/blender/bmesh/intern/bmesh_iterators.c        
2011-12-07 20:13:15 UTC (rev 42498)
@@ -56,7 +56,38 @@
        return val;
 }
 
+
 /*
+ * ITERATOR AS ARRAY
+ *
+ * Sometimes its convenient to get the iterator as an array
+ * to avoid multiple calls to BMIter_AtIndex.
+ */
+
+int BMIter_AsArray(struct BMesh *bm, const char htype, void *data, void 
**array, const int len)
+{
+       int i= 0;
+
+       /*sanity check*/
+       if (len > 0) {
+
+               BMIter iter;
+               void *val;
+
+               BM_ITER(val, &iter, bm, htype, data) {
+                       array[i]= val;
+                       i++;
+                       if (i == len) {
+                               return len;
+                       }
+               }
+       }
+
+       return i;
+}
+
+
+/*
  * INIT ITERATOR
  *
  * Clears the internal state of an iterator

Modified: branches/bmesh/blender/source/blender/bmesh/intern/bmesh_marking.c
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/intern/bmesh_marking.c  
2011-12-07 18:51:43 UTC (rev 42497)
+++ branches/bmesh/blender/source/blender/bmesh/intern/bmesh_marking.c  
2011-12-07 20:13:15 UTC (rev 42498)
@@ -483,6 +483,8 @@
        }
 }
 
+/* ref - editmesh_lib.cL:EM_editselection_plane() */
+
 /* Calculate a plane that is rightangles to the edge/vert/faces normal
 also make the plane run along an axis that is related to the geometry,
 because this is used for the manipulators Y axis.*/
@@ -530,39 +532,51 @@
                we cant make a crossvec from a vec thats the same as the vec
                unlikely but possible, so make sure if the normal is (0,0,1)
                that vec isnt the same or in the same direction even.*/
-               if (efa->no[0] < 0.5f)          vec[0]= 1.0f;
-               else if (efa->no[1] < 0.5f)     vec[1]= 1.0f;
-               else                                            vec[2]= 1.0f;
-               cross_v3_v3v3(plane, efa->no, vec);
-#if 0 //BMESH_TODO
+               if (efa->len < 3) {
+                       /* crappy fallback method */
+                       if      (efa->no[0] < 0.5f)     vec[0]= 1.0f;
+                       else if (efa->no[1] < 0.5f)     vec[1]= 1.0f;
+                       else                        vec[2]= 1.0f;
+                       cross_v3_v3v3(plane, efa->no, vec);
+               }
+               else {
+                       BMVert *verts[4]= {NULL};
 
-               if (efa->v4) { /*if its a quad- set the plane along the 2 
longest edges.*/
-                       float vecA[3], vecB[3];
-                       sub_v3_v3v3(vecA, efa->v4->co, efa->v3->co);
-                       sub_v3_v3v3(vecB, efa->v1->co, efa->v2->co);
-                       add_v3_v3v3(plane, vecA, vecB);
-                       
-                       sub_v3_v3v3(vecA, efa->v1->co, efa->v4->co);
-                       sub_v3_v3v3(vecB, efa->v2->co, efa->v3->co);
-                       add_v3_v3v3(vec, vecA, vecB);                           
                
-                       /*use the biggest edge length*/
-                       if 
(plane[0]*plane[0]+plane[1]*plane[1]+plane[2]*plane[2] < 
vec[0]*vec[0]+vec[1]*vec[1]+vec[2]*vec[2])
-                               copy_v3_v3(plane, vec);
-               } else {
-                       /*start with v1-2 */
-                       sub_v3_v3v3(plane, efa->v1->co, efa->v2->co);
-                       
-                       /*test the edge between v2-3, use if longer */
-                       sub_v3_v3v3(vec, efa->v2->co, efa->v3->co);
-                       if 
(plane[0]*plane[0]+plane[1]*plane[1]+plane[2]*plane[2] < 
vec[0]*vec[0]+vec[1]*vec[1]+vec[2]*vec[2])
-                               copy_v3_v3(plane, vec);
-                       
-                       /*test the edge between v1-3, use if longer */
-                       sub_v3_v3v3(vec, efa->v3->co, efa->v1->co);
-                       if 
(plane[0]*plane[0]+plane[1]*plane[1]+plane[2]*plane[2] < 
vec[0]*vec[0]+vec[1]*vec[1]+vec[2]*vec[2])
-                               copy_v3_v3(plane, vec);
+                       BMIter_AsArray(bm, BM_VERTS_OF_FACE, efa, (void 
**)verts, 4);
+
+                       if (efa->len == 4) {
+                               float vecA[3], vecB[3];
+                               sub_v3_v3v3(vecA, verts[3]->co, verts[2]->co);
+                               sub_v3_v3v3(vecB, verts[0]->co, verts[1]->co);
+                               add_v3_v3v3(plane, vecA, vecB);
+
+                               sub_v3_v3v3(vecA, verts[0]->co, verts[3]->co);
+                               sub_v3_v3v3(vecB, verts[1]->co, verts[2]->co);
+                               add_v3_v3v3(vec, vecA, vecB);
+                               /*use the biggest edge length*/
+                               if (dot_v3v3(plane, plane) < dot_v3v3(vec, 
vec)) {
+                                       copy_v3_v3(plane, vec);
+                               }
+                       }
+                       else {
+                               /* BMESH_TODO (not urgent, use longest ngon 
edge for alignment) */
+
+                               /*start with v1-2 */
+                               sub_v3_v3v3(plane, verts[0]->co, verts[1]->co);
+
+                               /*test the edge between v2-3, use if longer */
+                               sub_v3_v3v3(vec, verts[1]->co, verts[2]->co);
+                               if (dot_v3v3(plane, plane) < dot_v3v3(vec, vec))
+                                       copy_v3_v3(plane, vec);
+
+                               /*test the edge between v1-3, use if longer */
+                               sub_v3_v3v3(vec, verts[2]->co, verts[0]->co);
+                               if (dot_v3v3(plane, plane) < dot_v3v3(vec, 
vec)) {
+                                       copy_v3_v3(plane, vec);
+                               }
+                       }
+
                }
-#endif
        }
        normalize_v3(plane);
 }

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

Reply via email to