cache customdata checks to avoid looking up on each call to mesh_loops_to_mface_corners()
authorCampbell Barton <ideasman42@gmail.com>
Wed, 28 Dec 2011 22:37:09 +0000 (22:37 +0000)
committerCampbell Barton <ideasman42@gmail.com>
Wed, 28 Dec 2011 22:37:09 +0000 (22:37 +0000)
source/blender/blenkernel/BKE_mesh.h
source/blender/blenkernel/intern/mesh.c
source/blender/blenloader/intern/readfile.c
source/blender/modifiers/intern/MOD_ngoninterp.c

index 9b5e38dfea7aba497d13158eb46f7ab5022b4beb..8f03f29706f9b947586622604fc210c82673b605 100644 (file)
@@ -213,8 +213,9 @@ void BKE_mesh_ensure_navmesh(struct Mesh *me);
 
 /*convert a triangle of loop facedata to mface facedata*/
 void mesh_loops_to_mface_corners(struct CustomData *fdata, struct CustomData *ldata,
-                          struct CustomData *pdata, int lindex[4], int findex,
-                          const int polyindex, const int mf_len);
+                                 struct CustomData *pdata, int lindex[4], int findex,
+                                 const int polyindex, const int mf_len,
+                                 const int numTex, const int numCol, const int hasWCol);
 
 #ifdef __cplusplus
 }
index 5ff5c89eb816da71da456dcef8235fab7246cbd2..0c006b856743f671b000e845243fb8dc1f5db59f 100644 (file)
@@ -2139,19 +2139,22 @@ void create_vert_edge_map(ListBase **map, IndexNode **mem, const MEdge *medge, c
 }
 
 void mesh_loops_to_mface_corners(CustomData *fdata, CustomData *ldata,
-                          CustomData *pdata, int lindex[4], int findex,
-                          const int polyindex,
-                          const int mf_len /* 3 or 4 */
-                          )
+                                 CustomData *pdata, int lindex[4], int findex,
+                                 const int polyindex,
+                                 const int mf_len, /* 3 or 4 */
+
+                                 /* cache values to avoid lookups every time */
+                                 const int numTex, /* CustomData_number_of_layers(pdata, CD_MTEXPOLY) */
+                                 const int numCol, /* CustomData_number_of_layers(ldata, CD_MLOOPCOL) */
+                                 const int hasWCol /* CustomData_has_layer(ldata, CD_WEIGHT_MLOOPCOL) */
+                                 )
 {
        MTFace *texface;
        MTexPoly *texpoly;
        MCol *mcol;
        MLoopCol *mloopcol;
        MLoopUV *mloopuv;
-       int i, j, hasWCol = CustomData_has_layer(ldata, CD_WEIGHT_MLOOPCOL);
-       int numTex = CustomData_number_of_layers(pdata, CD_MTEXPOLY);
-       int numCol = CustomData_number_of_layers(ldata, CD_MLOOPCOL);
+       int i, j;
        
        for(i=0; i < numTex; i++){
                texface = CustomData_get_n(fdata, CD_MTFACE, findex, i);
@@ -2224,14 +2227,14 @@ int mesh_recalcTesselation(CustomData *fdata,
        int lindex[4]; /* only ever use 3 in this case */
        int *polyorigIndex;
        int i, j, k;
-       int numTex, numCol;
+
+       const int numTex = CustomData_number_of_layers(pdata, CD_MTEXPOLY);
+       const int numCol = CustomData_number_of_layers(ldata, CD_MLOOPCOL);
+       const int hasWCol = CustomData_has_layer(ldata, CD_WEIGHT_MLOOPCOL);
 
        mpoly = CustomData_get_layer(pdata, CD_MPOLY);
        mloop = CustomData_get_layer(ldata, CD_MLOOP);
 
-       numTex = CustomData_number_of_layers(ldata, CD_MLOOPUV);
-       numCol = CustomData_number_of_layers(ldata, CD_MLOOPCOL);
-       
        k = 0;
        mp = mpoly;
        polyorigIndex = CustomData_get_layer(pdata, CD_ORIGINDEX);
@@ -2365,7 +2368,8 @@ int mesh_recalcTesselation(CustomData *fdata,
                mf->v3 = mloop[mf->v3].v;
 
                mesh_loops_to_mface_corners(fdata, ldata, pdata,
-                                           lindex, i, polyIndex[i], 3);
+                                           lindex, i, polyIndex[i], 3,
+                                           numTex, numCol, hasWCol);
        }
 
        return totface;
@@ -2394,6 +2398,10 @@ int mesh_mpoly_to_mface(struct CustomData *fdata, struct CustomData *ldata,
        MFace *mface = NULL, *mf;
        BLI_array_declare(mface);
 
+       const int numTex = CustomData_number_of_layers(pdata, CD_MTEXPOLY);
+       const int numCol = CustomData_number_of_layers(ldata, CD_MLOOPCOL);
+       const int hasWCol = CustomData_has_layer(ldata, CD_WEIGHT_MLOOPCOL);
+
        mpoly = CustomData_get_layer(pdata, CD_MPOLY);
        mloop = CustomData_get_layer(ldata, CD_MLOOP);
 
@@ -2449,7 +2457,8 @@ int mesh_mpoly_to_mface(struct CustomData *fdata, struct CustomData *ldata,
                                mf->v3 = mloop[mf->v3].v;
 
                                mesh_loops_to_mface_corners(fdata, ldata, pdata,
-                                                           lindex, k, i, 3);
+                                                           lindex, k, i, 3,
+                                                           numTex, numCol, hasWCol);
                                test_index_face(mf, fdata, totface, 3);
                        }
                        else {
@@ -2468,7 +2477,8 @@ int mesh_mpoly_to_mface(struct CustomData *fdata, struct CustomData *ldata,
                                mf->v4 = mloop[mf->v4].v;
 
                                mesh_loops_to_mface_corners(fdata, ldata, pdata,
-                                                           lindex, k, i, 4);
+                                                           lindex, k, i, 4,
+                                                           numTex, numCol, hasWCol);
                                test_index_face(mf, fdata, totface, 4);
                        }
 
index 779e4da69c512ea9b0a9d160acd2ed28f24e82fc..8a1240102164a4b816f24ccf18c7fd8b507936e9 100644 (file)
@@ -3834,7 +3834,7 @@ static void direct_link_mesh(FileData *fd, Mesh *mesh)
                memset(&mesh->ldata, 0, sizeof(CustomData));
                mesh->totloop = 0;
 
-               mesh_update_customdata_pointers(mesh, TRUE);
+               mesh_update_customdata_pointers(mesh);
        }
 
 #endif
index 54e46fc095657e3bdd916abf821879b145a71175..7577f706f0517f6631cf50f5793209997236ac6a 100644 (file)
@@ -91,7 +91,11 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *UNUSED(ob),
        BLI_array_declare(origf);
        DerivedMesh *copy = NULL;
        int i;
-       
+
+       int numTex;
+       int numCol;
+       int hasWCol;
+
        if (nmd->resolution <= 0)
                return dm;
        
@@ -112,7 +116,12 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *UNUSED(ob),
 
        /*create a dummy mesh to compute interpolated loops on*/
        dummy = CDDM_from_template(dm, 0, 0, 0, 3, 0);
-       
+
+       /* CustomData we check must match what is passed to mesh_loops_to_mface_corners() */
+       numTex = CustomData_number_of_layers(&dm->polyData, CD_MTEXPOLY);
+       numCol = CustomData_number_of_layers(&dummy->loopData, CD_MLOOPCOL);
+       hasWCol = CustomData_has_layer(&dummy->loopData, CD_WEIGHT_MLOOPCOL);
+
        /*copy original verts here, so indices stay correct*/
        omvert = dm->getVertArray(dm);
        ov = dm->getVertDataArray(dm, CD_ORIGINDEX);
@@ -262,7 +271,9 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *UNUSED(ob),
                interp_weights_poly_v3(w, cos, mp->totloop, co);
                CustomData_interp(&dm->loopData, &dummy->loopData, loops, w, NULL, mp->totloop, 2);
                
-               mesh_loops_to_mface_corners(&cddm->faceData, &dummy->loopData, &dm->polyData, lindex, i, origf[i], 3);
+               mesh_loops_to_mface_corners(&cddm->faceData, &dummy->loopData, &dm->polyData,
+                                           lindex, i, origf[i], 3,
+                                           numTex, numCol, hasWCol);
        }
        
        CustomData_copy_data(&dm->vertData, &cddm->vertData, 0, 0, dm->numVertData);