From c71da4537a88f41d0f35239a493e33368afc3189 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Fri, 20 Jan 2012 00:26:25 +0000 Subject: improvements to build modifier - dont make a copy of the source mesh before using it - dont recalculate tessface's and normals --- source/blender/modifiers/intern/MOD_build.c | 105 +++++++++++++--------------- 1 file changed, 48 insertions(+), 57 deletions(-) (limited to 'source/blender/modifiers/intern/MOD_build.c') diff --git a/source/blender/modifiers/intern/MOD_build.c b/source/blender/modifiers/intern/MOD_build.c index 16b19e82e97..e882620ca4e 100644 --- a/source/blender/modifiers/intern/MOD_build.c +++ b/source/blender/modifiers/intern/MOD_build.c @@ -84,11 +84,11 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *UNUSED(ob), DerivedMesh *result; BuildModifierData *bmd = (BuildModifierData*) md; int i, j, k; - int numFaces, numEdges, numLoops = 0; + int numFaces_dst, numEdges_dst, numLoops_dst = 0; int *vertMap, *edgeMap, *faceMap; float frac; - MPoly *mpolys, *mpolyd; - MLoop *mld, *mloops, *mls, *mloopd; + MPoly *mpoly_dst; + MLoop *ml_dst, *ml_src, *mloop_dst; GHashIterator *hashIter; /* maps vert indices in old mesh to indices in new mesh */ GHash *vertHash = BLI_ghash_new(BLI_ghashutil_inthash, @@ -99,44 +99,44 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *UNUSED(ob), GHash *edgeHash2 = BLI_ghash_new(BLI_ghashutil_inthash, BLI_ghashutil_intcmp, "build ed apply gh"); - const int maxVerts= dm->getNumVerts(dm); - const int maxEdges= dm->getNumEdges(dm); - const int maxFaces= dm->getNumPolys(dm); - - if (!CDDM_Check(dm)) { - result = CDDM_copy(dm, 0); - dm = result; - } - - vertMap = MEM_callocN(sizeof(*vertMap) * maxVerts, "build modifier vertMap"); - for(i = 0; i < maxVerts; ++i) vertMap[i] = i; - edgeMap = MEM_callocN(sizeof(*edgeMap) * maxEdges, "build modifier edgeMap"); - for(i = 0; i < maxEdges; ++i) edgeMap[i] = i; - faceMap = MEM_callocN(sizeof(*faceMap) * maxFaces, "build modifier faceMap"); - for(i = 0; i < maxFaces; ++i) faceMap[i] = i; + const int numVert_src = dm->getNumVerts(dm); + const int numEdge_src = dm->getNumEdges(dm); + const int numPoly_src = dm->getNumPolys(dm); + MPoly *mpoly_src = dm->getPolyArray(dm); + MLoop *mloop_src = dm->getLoopArray(dm); + MEdge *medge_src = dm->getEdgeArray(dm); + 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; frac = (BKE_curframe(md->scene) - bmd->start) / bmd->length; CLAMP(frac, 0.0f, 1.0f); - numFaces = dm->getNumPolys(dm) * frac; - numEdges = dm->getNumEdges(dm) * frac; + numFaces_dst = numPoly_src * frac; + numEdges_dst = numEdge_src * frac; /* if there's at least one face, build based on faces */ - if(numFaces) { + if(numFaces_dst) { MPoly *mpoly, *mp; MLoop *ml, *mloop; MEdge *medge; if(bmd->randomize) BLI_array_randomize(faceMap, sizeof(*faceMap), - maxFaces, bmd->seed); + numPoly_src, bmd->seed); /* get the set of all vert indices that will be in the final mesh, * mapped to the new indices */ - mpoly = CDDM_get_polys(dm); - mloop = CDDM_get_loops(dm); - for(i = 0; i < numFaces; ++i) { + mpoly = mpoly_src; + mloop = mloop_src; + for(i = 0; i < numFaces_dst; ++i) { mp = mpoly + faceMap[i]; ml = mloop + mp->loopstart; @@ -146,14 +146,14 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *UNUSED(ob), SET_INT_IN_POINTER(BLI_ghash_size(vertHash))); } - numLoops += mp->totloop; + numLoops_dst += mp->totloop; } /* get the set of edges that will be in the new mesh (i.e. all edges * that have both verts in the new mesh) */ - medge = CDDM_get_edges(dm); - for(i = 0; i < maxEdges; ++i) { + medge = medge_src; + for(i = 0; i < numEdge_src; ++i) { MEdge *me = medge + i; if(BLI_ghash_haskey(vertHash, SET_INT_IN_POINTER(me->v1)) @@ -165,18 +165,18 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *UNUSED(ob), BLI_ghash_insert(edgeHash2, SET_INT_IN_POINTER(i), SET_INT_IN_POINTER(j)); } } - } else if(numEdges) { + } else if(numEdges_dst) { MEdge *medge, *me; if(bmd->randomize) BLI_array_randomize(edgeMap, sizeof(*edgeMap), - maxEdges, bmd->seed); + numEdge_src, bmd->seed); /* get the set of all vert indices that will be in the final mesh, * mapped to the new indices */ - medge = CDDM_get_edges(dm); - for(i = 0; i < numEdges; ++i) { + medge = medge_src; + for(i = 0; i < numEdges_dst; ++i) { me = medge + edgeMap[i]; if(!BLI_ghash_haskey(vertHash, SET_INT_IN_POINTER(me->v1))) @@ -189,7 +189,7 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *UNUSED(ob), /* get the set of edges that will be in the new mesh */ - for(i = 0; i < numEdges; ++i) { + for(i = 0; i < numEdges_dst; ++i) { j = BLI_ghash_size(edgeHash); BLI_ghash_insert(edgeHash, SET_INT_IN_POINTER(j), @@ -198,11 +198,11 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *UNUSED(ob), SET_INT_IN_POINTER(j)); } } else { - int numVerts = dm->getNumVerts(dm) * frac; + int numVerts = numVert_src * frac; if(bmd->randomize) BLI_array_randomize(vertMap, sizeof(*vertMap), - maxVerts, bmd->seed); + numVert_src, bmd->seed); /* get the set of all vert indices that will be in the final mesh, * mapped to the new indices @@ -215,7 +215,7 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *UNUSED(ob), * the mesh */ result = CDDM_from_template(dm, BLI_ghash_size(vertHash), - BLI_ghash_size(edgeHash), 0, numLoops, numFaces); + BLI_ghash_size(edgeHash), 0, numLoops_dst, numFaces_dst); /* copy the vertices across */ for( hashIter = BLI_ghashIterator_new(vertHash); @@ -227,7 +227,7 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *UNUSED(ob), int oldIndex = GET_INT_FROM_POINTER(BLI_ghashIterator_getKey(hashIter)); int newIndex = GET_INT_FROM_POINTER(BLI_ghashIterator_getValue(hashIter)); - dm->getVert(dm, oldIndex, &source); + source = mvert_src [oldIndex]; dest = CDDM_get_vert(result, newIndex); DM_copy_vert_data(dm, result, oldIndex, newIndex, 1); @@ -241,7 +241,7 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *UNUSED(ob), MEdge *dest; int oldIndex = GET_INT_FROM_POINTER(BLI_ghash_lookup(edgeHash, SET_INT_IN_POINTER(i))); - dm->getEdge(dm, oldIndex, &source); + source = medge_src[oldIndex]; dest = CDDM_get_edge(result, i); source.v1 = GET_INT_FROM_POINTER(BLI_ghash_lookup(vertHash, SET_INT_IN_POINTER(source.v1))); @@ -251,19 +251,17 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *UNUSED(ob), *dest = source; } - mpolys = CDDM_get_polys(dm); - mpolyd = CDDM_get_polys(result); - mloops = CDDM_get_loops(dm); - mloopd = mld = CDDM_get_loops(result); + mpoly_dst = CDDM_get_polys(result); + mloop_dst = ml_dst = CDDM_get_loops(result); /* copy the faces across, remapping indices */ k = 0; - for(i = 0; i < numFaces; ++i) { + for(i = 0; i < numFaces_dst; ++i) { MPoly *source; MPoly *dest; - source = mpolys + faceMap[i]; - dest = mpolyd + i; + source = mpoly_src + faceMap[i]; + dest = mpoly_dst + i; DM_copy_poly_data(dm, result, faceMap[i], i, 1); *dest = *source; @@ -271,14 +269,12 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *UNUSED(ob), DM_copy_loop_data(dm, result, source->loopstart, dest->loopstart, dest->totloop); - mls = mloops + source->loopstart; - for (j=0; jtotloop; j++, k++, mls++, mld++) { - mld->v = GET_INT_FROM_POINTER(BLI_ghash_lookup(vertHash, SET_INT_IN_POINTER(mls->v))); - mld->e = GET_INT_FROM_POINTER(BLI_ghash_lookup(edgeHash2, SET_INT_IN_POINTER(mls->e))); + ml_src = mloop_src + source->loopstart; + for (j=0; jtotloop; j++, k++, ml_src++, ml_dst++) { + ml_dst->v = GET_INT_FROM_POINTER(BLI_ghash_lookup(vertHash, SET_INT_IN_POINTER(ml_src->v))); + ml_dst->e = GET_INT_FROM_POINTER(BLI_ghash_lookup(edgeHash2, SET_INT_IN_POINTER(ml_src->e))); } } - - CDDM_calc_normals_mapping(result); BLI_ghash_free(vertHash, NULL, NULL); BLI_ghash_free(edgeHash, NULL, NULL); @@ -287,12 +283,7 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *UNUSED(ob), MEM_freeN(vertMap); MEM_freeN(edgeMap); MEM_freeN(faceMap); - - if (dm != derivedData) { - dm->needsFree = 1; - dm->release(dm); - } - + return result; } -- cgit v1.2.3