use openmp sections for felling origindex arrays
authorCampbell Barton <ideasman42@gmail.com>
Fri, 18 Jan 2013 06:26:06 +0000 (06:26 +0000)
committerCampbell Barton <ideasman42@gmail.com>
Fri, 18 Jan 2013 06:26:06 +0000 (06:26 +0000)
source/blender/blenkernel/BKE_DerivedMesh.h
source/blender/blenkernel/intern/DerivedMesh.c
source/blender/modifiers/intern/MOD_build.c
source/blender/modifiers/intern/MOD_laplaciansmooth.c
source/blender/modifiers/intern/MOD_screw.c

index f06547fe2e3745c12975bc80edb42522d08d5a4c..64fb49c4d66508bad29459ffbce28ef5225cda01 100644 (file)
@@ -95,6 +95,8 @@ struct BMEditMesh;
 struct ListBase;
 struct PBVH;
 
+#define DM_OMP_LIMIT 0  /* setting zero so we can catch bugs in OpenMP/BMesh */
+
 /* number of sub-elements each mesh element has (for interpolation) */
 #define SUB_ELEMS_VERT 0
 #define SUB_ELEMS_EDGE 2
index dde1d5870ca897275131198deb91ec1e2f43f0e5..b3d95629143a1d83580e14d719a5f7c579edb892 100644 (file)
@@ -1584,9 +1584,15 @@ static void mesh_calc_modifiers(Scene *scene, Object *ob, float (*inputVertexCos
                                        DM_add_edge_layer(dm, CD_ORIGINDEX, CD_CALLOC, NULL);
                                        DM_add_poly_layer(dm, CD_ORIGINDEX, CD_CALLOC, NULL);
 
-                                       range_vn_i(DM_get_vert_data_layer(dm, CD_ORIGINDEX), dm->numVertData, 0);
-                                       range_vn_i(DM_get_edge_data_layer(dm, CD_ORIGINDEX), dm->numEdgeData, 0);
-                                       range_vn_i(DM_get_poly_data_layer(dm, CD_ORIGINDEX), dm->numPolyData, 0);
+#pragma omp parallel sections if (dm->numVertData + dm->numEdgeData + dm->numPolyData >= DM_OMP_LIMIT)
+                                       {
+#pragma omp section
+                                               { range_vn_i(DM_get_vert_data_layer(dm, CD_ORIGINDEX), dm->numVertData, 0); }
+#pragma omp section
+                                               { range_vn_i(DM_get_edge_data_layer(dm, CD_ORIGINDEX), dm->numEdgeData, 0); }
+#pragma omp section
+                                               { range_vn_i(DM_get_poly_data_layer(dm, CD_ORIGINDEX), dm->numPolyData, 0); }
+                                       }
                                }
                        }
 
index 2105a6efd21cbcde25d4d874eb2a7f3f7fa64e1e..c5a756733f5bc92ab505c91d9a52d5687af2fe0c 100644 (file)
@@ -37,6 +37,7 @@
 
 #include "BLI_utildefines.h"
 #include "BLI_rand.h"
+#include "BLI_math_vector.h"
 #include "BLI_ghash.h"
 
 #include "DNA_scene_types.h"
@@ -104,12 +105,19 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *UNUSED(ob),
        MVert *mvert_src = dm->getVertArray(dm);
 
 
-       vertMap = MEM_callocN(sizeof(*vertMap) * numVert_src, "build modifier vertMap");
-       for (i = 0; i < numVert_src; i++) vertMap[i] = i;
-       edgeMap = MEM_callocN(sizeof(*edgeMap) * numEdge_src, "build modifier edgeMap");
-       for (i = 0; i < numEdge_src; i++) edgeMap[i] = i;
-       faceMap = MEM_callocN(sizeof(*faceMap) * numPoly_src, "build modifier faceMap");
-       for (i = 0; i < numPoly_src; i++) faceMap[i] = i;
+       vertMap = MEM_mallocN(sizeof(*vertMap) * numVert_src, "build modifier vertMap");
+       edgeMap = MEM_mallocN(sizeof(*edgeMap) * numEdge_src, "build modifier edgeMap");
+       faceMap = MEM_mallocN(sizeof(*faceMap) * numPoly_src, "build modifier faceMap");
+
+#pragma omp parallel sections if (numVert_src + numEdge_src + numPoly_src >= DM_OMP_LIMIT)
+       {
+#pragma omp section
+               { range_vn_i(vertMap, numVert_src, 0); }
+#pragma omp section
+               { range_vn_i(edgeMap, numEdge_src, 0); }
+#pragma omp section
+               { range_vn_i(faceMap, numPoly_src, 0); }
+       }
 
        frac = (BKE_scene_frame_get(md->scene) - bmd->start) / bmd->length;
        CLAMP(frac, 0.0f, 1.0f);
index 2739365e6198a8ecd30bab77fd5615eb4be0177b..62900af078e59b717be938d3d117881e1c5e0bb8 100644 (file)
@@ -521,11 +521,10 @@ static void fill_laplacian_matrix(LaplacianSystem *sys)
 
 static void validate_solution(LaplacianSystem * sys, short flag, float lambda, float lambda_border)
 {
-       int i, idv1, idv2;
+       int i;
        float lam;
-       float leni, lene;
        float vini, vend;
-       float *vi1, *vi2, ve1[3], ve2[3];
+
        if (flag & MOD_LAPLACIANSMOOTH_PRESERVE_VOLUME) {
                vini = compute_volume(sys->vertexCos, sys->mfaces, sys->numFaces);
        }
index 1021620e04f0bb7e3ee3a10823ccfda4a21b5c65..e7d62452590904f17e50230954134607ffdd9181 100644 (file)
@@ -314,11 +314,7 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob,
                CustomData_add_layer(&result->polyData, CD_ORIGINDEX, CD_CALLOC, NULL, maxPolys);
        }
 
-#if 0 // trunk
-       origindex = result->getPolyDataArray(result, CD_ORIGINDEX);
-#else // bmesh
        origindex = CustomData_get_layer(&result->polyData, CD_ORIGINDEX);
-#endif
 
        DM_copy_vert_data(dm, result, 0, 0, totvert); /* copy first otherwise this overwrites our own vertex normals */