improvements to build modifier
- dont make a copy of the source mesh before using it - dont recalculate tessface's and normals
This commit is contained in:
@@ -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; j<source->totloop; 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; j<source->totloop; 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;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user