Merging r58475 through r58700 from trunk into soc-2013-depsgraph_mt
[blender.git] / source / blender / blenkernel / intern / cdderivedmesh.c
index d692e8e0cf77e74e32427bfb03cdcf0bb7b8e5ca..ffb33dbf3c7b20e95ddca4de752c30f1702d6e2e 100644 (file)
@@ -40,7 +40,6 @@
 #include "BLI_blenlib.h"
 #include "BLI_edgehash.h"
 #include "BLI_math.h"
-#include "BLI_array.h"
 #include "BLI_smallhash.h"
 #include "BLI_utildefines.h"
 #include "BLI_scanfill.h"
@@ -1548,19 +1547,26 @@ static void cdDM_drawMappedEdges(DerivedMesh *dm, DMSetDrawOptions setDrawOption
 static void cdDM_foreachMappedVert(
         DerivedMesh *dm,
         void (*func)(void *userData, int index, const float co[3], const float no_f[3], const short no_s[3]),
-        void *userData)
+        void *userData,
+        DMForeachFlag flag)
 {
        MVert *mv = CDDM_get_verts(dm);
-       int i, orig, *index = DM_get_vert_data_layer(dm, CD_ORIGINDEX);
+       int *index = DM_get_vert_data_layer(dm, CD_ORIGINDEX);
+       int i;
 
-       for (i = 0; i < dm->numVertData; i++, mv++) {
-               if (index) {
-                       orig = *index++;
+       if (index) {
+               for (i = 0; i < dm->numVertData; i++, mv++) {
+                       const short *no = (flag & DM_FOREACH_USE_NORMAL) ? mv->no : NULL;
+                       const int orig = *index++;
                        if (orig == ORIGINDEX_NONE) continue;
-                       func(userData, orig, mv->co, NULL, mv->no);
+                       func(userData, orig, mv->co, NULL, no);
+               }
+       }
+       else {
+               for (i = 0; i < dm->numVertData; i++, mv++) {
+                       const short *no = (flag & DM_FOREACH_USE_NORMAL) ? mv->no : NULL;
+                       func(userData, i, mv->co, NULL, no);
                }
-               else
-                       func(userData, i, mv->co, NULL, mv->no);
        }
 }
 
@@ -1588,47 +1594,37 @@ static void cdDM_foreachMappedEdge(
 static void cdDM_foreachMappedFaceCenter(
         DerivedMesh *dm,
         void (*func)(void *userData, int index, const float cent[3], const float no[3]),
-        void *userData)
+        void *userData,
+        DMForeachFlag flag)
 {
        CDDerivedMesh *cddm = (CDDerivedMesh *)dm;
        MVert *mvert = cddm->mvert;
        MPoly *mp;
        MLoop *ml;
-       int i, j, orig, *index;
+       int i, orig, *index;
 
        index = CustomData_get_layer(&dm->polyData, CD_ORIGINDEX);
        mp = cddm->mpoly;
        for (i = 0; i < dm->numPolyData; i++, mp++) {
                float cent[3];
-               float no[3];
+               float *no, _no[3];
 
                if (index) {
                        orig = *index++;
                        if (orig == ORIGINDEX_NONE) continue;
                }
-               else
+               else {
                        orig = i;
+               }
                
                ml = &cddm->mloop[mp->loopstart];
-               cent[0] = cent[1] = cent[2] = 0.0f;
-               for (j = 0; j < mp->totloop; j++, ml++) {
-                       add_v3_v3v3(cent, cent, mvert[ml->v].co);
-               }
-               mul_v3_fl(cent, 1.0f / (float)j);
+               BKE_mesh_calc_poly_center(mp, ml, mvert, cent);
 
-               ml = &cddm->mloop[mp->loopstart];
-               if (j > 3) {
-                       normal_quad_v3(no,
-                                      mvert[(ml + 0)->v].co,
-                                      mvert[(ml + 1)->v].co,
-                                      mvert[(ml + 2)->v].co,
-                                      mvert[(ml + 3)->v].co);
+               if (flag & DM_FOREACH_USE_NORMAL) {
+                       BKE_mesh_calc_poly_normal(mp, ml, mvert, (no = _no));
                }
                else {
-                       normal_tri_v3(no,
-                                     mvert[(ml + 0)->v].co,
-                                     mvert[(ml + 1)->v].co,
-                                     mvert[(ml + 2)->v].co);
+                       no = NULL;
                }
 
                func(userData, orig, cent, no);