From 8da5df8887a315a9c92168c8dd81f11b6ee0b29b Mon Sep 17 00:00:00 2001 From: Daniel Dunbar Date: Sun, 7 Aug 2005 02:30:29 +0000 Subject: - add allowShared argument to DerivedMesh.convertToDispListMesh to allow returned DLM to share data from DerivedMesh (reduces some copying/memory allocation) - added displistmesh_copyShared function to copy a DLM but not duplicate any internal data - changed crease drawing to use DerivedMesh functions... this means varying edge width style of creases had to go, I replaced by using varying color to show crease weight instead. Don't think this is a big loss since the subsurf result gives you a much better indication of the crease weight anyway. - bug fix in mirror modifier, didn't copy edge creases from editmesh correctly --- source/blender/blenkernel/BKE_DerivedMesh.h | 10 ++++++++-- source/blender/blenkernel/BKE_displist.h | 1 + source/blender/blenkernel/intern/DerivedMesh.c | 27 ++++++++++++++++++++------ source/blender/blenkernel/intern/displist.c | 10 +++++++++- source/blender/blenkernel/intern/effect.c | 2 +- source/blender/blenkernel/intern/exotic.c | 2 +- source/blender/blenkernel/intern/modifier.c | 26 ++++++------------------- source/blender/blenkernel/intern/subsurf_ccg.c | 2 +- 8 files changed, 48 insertions(+), 32 deletions(-) (limited to 'source/blender/blenkernel') diff --git a/source/blender/blenkernel/BKE_DerivedMesh.h b/source/blender/blenkernel/BKE_DerivedMesh.h index 7a44f9de9f9..6350332fd66 100644 --- a/source/blender/blenkernel/BKE_DerivedMesh.h +++ b/source/blender/blenkernel/BKE_DerivedMesh.h @@ -65,8 +65,14 @@ struct DerivedMesh { void (*getMappedVertCoEM)(DerivedMesh *dm, void *vert, float co_r[3]); - /* Convert to new DispListMesh, should be free'd by caller */ - struct DispListMesh* (*convertToDispListMesh)(DerivedMesh *dm); + /* Convert to new DispListMesh, should be free'd by caller. + * + * If allowShared is true then the caller is committing to not free'ng + * the DerivedMesh before free'ng the DispListMesh, which means that + * certain fields of the returned DispListMesh can safely be share with + * the DerivedMesh's internal data. + */ + struct DispListMesh* (*convertToDispListMesh)(DerivedMesh *dm, int allowShared); /* Iterate over all vertex points, calling DO_MINMAX with given args. * diff --git a/source/blender/blenkernel/BKE_displist.h b/source/blender/blenkernel/BKE_displist.h index 463b7b22e1d..1102603b6a4 100644 --- a/source/blender/blenkernel/BKE_displist.h +++ b/source/blender/blenkernel/BKE_displist.h @@ -103,6 +103,7 @@ void displistmesh_free(DispListMesh *dlm); void displistmesh_to_mesh(DispListMesh *dlm, struct Mesh *me); DispListMesh *displistmesh_copy(DispListMesh *odlm); +DispListMesh *displistmesh_copyShared(DispListMesh *odlm); /* * All the different DispList.type's use the diff --git a/source/blender/blenkernel/intern/DerivedMesh.c b/source/blender/blenkernel/intern/DerivedMesh.c index 15f6b9fce9b..b26d40f60fe 100644 --- a/source/blender/blenkernel/intern/DerivedMesh.c +++ b/source/blender/blenkernel/intern/DerivedMesh.c @@ -78,7 +78,7 @@ typedef struct { int freeNors, freeVerts; } MeshDerivedMesh; -static DispListMesh *meshDM_convertToDispListMesh(DerivedMesh *dm) +static DispListMesh *meshDM_convertToDispListMesh(DerivedMesh *dm, int allowShared) { MeshDerivedMesh *mdm = (MeshDerivedMesh*) dm; Mesh *me = mdm->me; @@ -95,6 +95,17 @@ static DispListMesh *meshDM_convertToDispListMesh(DerivedMesh *dm) dlm->nors = mdm->nors; dlm->dontFreeVerts = dlm->dontFreeOther = dlm->dontFreeNors = 1; + if (!allowShared) { + dlm->mvert = MEM_dupallocN(dlm->mvert); + if (dlm->medge) dlm->medge = MEM_dupallocN(dlm->medge); + dlm->mface = MEM_dupallocN(dlm->mface); + if (dlm->tface) dlm->tface = MEM_dupallocN(dlm->tface); + if (dlm->mcol) dlm->mcol = MEM_dupallocN(dlm->mcol); + if (dlm->nors) dlm->nors = MEM_dupallocN(dlm->nors); + + dlm->dontFreeVerts = dlm->dontFreeOther = dlm->dontFreeNors = 0; + } + return dlm; } @@ -479,7 +490,7 @@ static DerivedMesh *getMeshDerivedMesh(Mesh *me, Object *ob, float (*vertCos)[3] // XXX this is kinda hacky because we shouldn't really be editing // the mesh here, however, we can't just call mesh_build_faceNormals(ob) // because in the case when a key is applied to a mesh the vertex normals - // would never be correctly computed (and renderer makes this assumption). + // would never be correctly computed. mesh_calc_normals(mdm->verts, me->totvert, me->mface, me->totface, &mdm->nors); mdm->freeNors = 1; } @@ -1229,11 +1240,15 @@ static int ssDM_getNumFaces(DerivedMesh *dm) return ssdm->dlm->totface; } -static DispListMesh *ssDM_convertToDispListMesh(DerivedMesh *dm) +static DispListMesh *ssDM_convertToDispListMesh(DerivedMesh *dm, int allowShared) { SSDerivedMesh *ssdm = (SSDerivedMesh*) dm; - return displistmesh_copy(ssdm->dlm); + if (allowShared) { + return displistmesh_copyShared(ssdm->dlm); + } else { + return displistmesh_copy(ssdm->dlm); + } } static void ssDM_release(DerivedMesh *dm) @@ -1401,7 +1416,7 @@ static void mesh_calc_modifiers(Object *ob, float (*inputVertexCos)[3], DerivedM * one. */ if (dm && deformedVerts) { - DispListMesh *dlm = dm->convertToDispListMesh(dm); // XXX what if verts or nors were shared + DispListMesh *dlm = dm->convertToDispListMesh(dm, 0); int i; /* XXX, would like to avoid the conversion to a DLM here if possible. @@ -1526,7 +1541,7 @@ static void editmesh_calc_modifiers(DerivedMesh **cage_r, DerivedMesh **final_r) * one. */ if (dm && deformedVerts) { - DispListMesh *dlm = dm->convertToDispListMesh(dm); // XXX what if verts or nors were shared + DispListMesh *dlm = dm->convertToDispListMesh(dm, 0); int i; /* XXX, would like to avoid the conversion to a DLM here if possible. diff --git a/source/blender/blenkernel/intern/displist.c b/source/blender/blenkernel/intern/displist.c index fa1d61bbf02..13a832e2e3d 100644 --- a/source/blender/blenkernel/intern/displist.c +++ b/source/blender/blenkernel/intern/displist.c @@ -137,6 +137,14 @@ DispListMesh *displistmesh_copy(DispListMesh *odlm) return ndlm; } +DispListMesh *displistmesh_copyShared(DispListMesh *odlm) +{ + DispListMesh *ndlm= MEM_dupallocN(odlm); + ndlm->dontFreeNors = ndlm->dontFreeOther = ndlm->dontFreeVerts = 1; + + return ndlm; +} + void displistmesh_to_mesh(DispListMesh *dlm, Mesh *me) { if (dlm->totvert>MESH_MAX_VERTS) { @@ -718,7 +726,7 @@ void mesh_create_shadedColors(Object *ob, int onlyForMesh, unsigned int **col1_r } else { dm = mesh_get_derived_final(ob, &dmNeedsFree); } - dlm= dm->convertToDispListMesh(dm); + dlm= dm->convertToDispListMesh(dm, 1); col1 = MEM_mallocN(sizeof(*col1)*dlm->totface*4, "col1"); if (col2_r && (me->flag & ME_TWOSIDED)) { diff --git a/source/blender/blenkernel/intern/effect.c b/source/blender/blenkernel/intern/effect.c index 690be225f6a..3f26957c1c1 100644 --- a/source/blender/blenkernel/intern/effect.c +++ b/source/blender/blenkernel/intern/effect.c @@ -1231,7 +1231,7 @@ void build_particle_system(Object *ob) /* init */ - dlm = dm->convertToDispListMesh(dm); + dlm = dm->convertToDispListMesh(dm, 1); totvert = dlm->totvert; give_mesh_mvert(me, dlm, totpart, co, no, paf->seed); diff --git a/source/blender/blenkernel/intern/exotic.c b/source/blender/blenkernel/intern/exotic.c index 0de307a98fb..6dff7284724 100644 --- a/source/blender/blenkernel/intern/exotic.c +++ b/source/blender/blenkernel/intern/exotic.c @@ -2511,7 +2511,7 @@ static int write_object_stl(FILE *fpSTL, Object *ob, Mesh *me) int numfacets = 0; int dmNeedsFree; DerivedMesh *dm = mesh_get_derived_final(ob, &dmNeedsFree); - DispListMesh *dlm = dm->convertToDispListMesh(dm); + DispListMesh *dlm = dm->convertToDispListMesh(dm, 1); numfacets += write_displistmesh_stl(fpSTL, ob, dlm); diff --git a/source/blender/blenkernel/intern/modifier.c b/source/blender/blenkernel/intern/modifier.c index 7aa26393443..a1786ed8898 100644 --- a/source/blender/blenkernel/intern/modifier.c +++ b/source/blender/blenkernel/intern/modifier.c @@ -163,7 +163,7 @@ static void *subsurfModifier_applyModifier(ModifierData *md, Object *ob, void *d Mesh *me = ob->data; if (dm) { - DispListMesh *dlm = dm->convertToDispListMesh(dm); // XXX what if verts were shared + DispListMesh *dlm = dm->convertToDispListMesh(dm, 0); int i; if (vertexCos) { @@ -189,21 +189,7 @@ static void *subsurfModifier_applyModifierEM(ModifierData *md, Object *ob, void SubsurfModifierData *smd = (SubsurfModifierData*) md; if (dm) { - DispListMesh *dlm = dm->convertToDispListMesh(dm); // XXX what if verts were shared - int i; - - if (vertexCos) { - int numVerts = dm->getNumVerts(dm); - - for (i=0; imvert[i].co, vertexCos[i]); - } - } - - // XXX, should I worry about reuse of mCache in editmode? - dm = subsurf_make_derived_from_mesh(NULL, dlm, smd, 0, NULL, 1); - - return dm; + return subsurfModifier_applyModifier(md, ob, dm, vertexCos, 0, 1); } else { return subsurf_make_derived_from_editmesh(em, smd, vertexCos); } @@ -250,7 +236,7 @@ static void *buildModifier_applyModifier(ModifierData *md, Object *ob, void *der float frac; if (dm) { - dlm = dm->convertToDispListMesh(dm); + dlm = dm->convertToDispListMesh(dm, 1); mvert = dlm->mvert; medge = dlm->medge; mface = dlm->mface; @@ -600,7 +586,7 @@ static void *mirrorModifier_applyModifier(ModifierData *md, Object *ob, void *de MCol *mcol; if (dm) { - dlm = dm->convertToDispListMesh(dm); + dlm = dm->convertToDispListMesh(dm, 1); mvert = dlm->mvert; medge = dlm->medge; @@ -685,7 +671,7 @@ static void *mirrorModifier_applyModifierEM(ModifierData *md, Object *ob, void * med->v1 = (int) eed->v1->prev; med->v2 = (int) eed->v2->prev; - med->crease = eed->crease; + med->crease = (unsigned char) (eed->crease*255.0f); } for (i=0,efa=em->faces.first; itotface; i++,efa=efa->next) { MFace *mf = &ndlm->mface[i]; @@ -732,7 +718,7 @@ static void *decimateModifier_applyModifier(ModifierData *md, Object *ob, void * int a, numTris; if (dm) { - dlm = dm->convertToDispListMesh(dm); + dlm = dm->convertToDispListMesh(dm, 1); mvert = dlm->mvert; mface = dlm->mface; totvert = dlm->totvert; diff --git a/source/blender/blenkernel/intern/subsurf_ccg.c b/source/blender/blenkernel/intern/subsurf_ccg.c index 5e10bfcf7b1..316b7425988 100644 --- a/source/blender/blenkernel/intern/subsurf_ccg.c +++ b/source/blender/blenkernel/intern/subsurf_ccg.c @@ -702,7 +702,7 @@ static void ccgDM_getMappedVertCoEM(DerivedMesh *dm, void *vert, float co_r[3]) co_r[1] = co[1]; co_r[2] = co[2]; } -static DispListMesh *ccgDM_convertToDispListMesh(DerivedMesh *dm) { +static DispListMesh *ccgDM_convertToDispListMesh(DerivedMesh *dm, int allowShared) { CCGDerivedMesh *ccgdm = (CCGDerivedMesh*) dm; return ss_to_displistmesh(ccgdm->ss, ccgdm->fromEditmesh, ccgdm->me, ccgdm->dlm); -- cgit v1.2.3