Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Dunbar <daniel@zuster.org>2005-08-07 06:30:29 +0400
committerDaniel Dunbar <daniel@zuster.org>2005-08-07 06:30:29 +0400
commit8da5df8887a315a9c92168c8dd81f11b6ee0b29b (patch)
tree2215d2dc26fe4fa4e006f414be78663099c4b59f /source/blender/blenkernel
parentf17a9a1d3dec63bbf7da592616736212315a057a (diff)
- 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
Diffstat (limited to 'source/blender/blenkernel')
-rw-r--r--source/blender/blenkernel/BKE_DerivedMesh.h10
-rw-r--r--source/blender/blenkernel/BKE_displist.h1
-rw-r--r--source/blender/blenkernel/intern/DerivedMesh.c27
-rw-r--r--source/blender/blenkernel/intern/displist.c10
-rw-r--r--source/blender/blenkernel/intern/effect.c2
-rw-r--r--source/blender/blenkernel/intern/exotic.c2
-rw-r--r--source/blender/blenkernel/intern/modifier.c26
-rw-r--r--source/blender/blenkernel/intern/subsurf_ccg.c2
8 files changed, 48 insertions, 32 deletions
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; i<numVerts; i++) {
- VECCOPY(dlm->mvert[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; i<ndlm->totface; 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);