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:
Diffstat (limited to 'source/blender/blenkernel/intern/DerivedMesh.c')
-rw-r--r--source/blender/blenkernel/intern/DerivedMesh.c122
1 files changed, 57 insertions, 65 deletions
diff --git a/source/blender/blenkernel/intern/DerivedMesh.c b/source/blender/blenkernel/intern/DerivedMesh.c
index 03171b1019c..099a121ed57 100644
--- a/source/blender/blenkernel/intern/DerivedMesh.c
+++ b/source/blender/blenkernel/intern/DerivedMesh.c
@@ -71,7 +71,7 @@ typedef struct {
MVert *verts;
float *nors;
- int freeNors;
+ int freeNors, freeVerts;
} MeshDerivedMesh;
static DispListMesh *meshDM_convertToDispListMesh(DerivedMesh *dm)
@@ -446,7 +446,7 @@ static void meshDM_release(DerivedMesh *dm)
MeshDerivedMesh *mdm = (MeshDerivedMesh*) dm;
if (mdm->freeNors) MEM_freeN(mdm->nors);
- if (mdm->verts!=((Mesh*) mdm->me)->mvert) MEM_freeN(mdm->verts);
+ if (mdm->freeVerts) MEM_freeN(mdm->verts);
MEM_freeN(mdm);
}
@@ -505,6 +505,7 @@ static DerivedMesh *getMeshDerivedMesh(Mesh *me, Object *ob, float (*vertCos)[3]
mdm->verts = me->mvert;
mdm->nors = NULL;
mdm->freeNors = 0;
+ mdm->freeVerts = 0;
if (vertCos) {
int i;
@@ -517,6 +518,7 @@ static DerivedMesh *getMeshDerivedMesh(Mesh *me, Object *ob, float (*vertCos)[3]
}
mesh_calc_normals(mdm->verts, me->totvert, me->mface, me->totface, &mdm->nors);
mdm->freeNors = 1;
+ mdm->freeVerts = 1;
} else {
mdm->nors = mesh_build_faceNormals(ob);
mdm->freeNors = 1;
@@ -1018,22 +1020,7 @@ static void mesh_calc_modifiers(Mesh *me, Object *ob, float (*inputVertexCos)[3]
*final_r = NULL;
if (useDeform && ob) {
- MVert *deformedMVerts;
-
- mesh_modifier(ob, &deformedMVerts);
- if (deformedMVerts) {
- int i;
-
- deformedVerts = MEM_mallocN(sizeof(*deformedVerts)*me->totvert, "deformedverts");
-
- for (i=0; i<me->totvert; i++) {
- VECCOPY(deformedVerts[i], deformedMVerts[i].co);
- }
-
- MEM_freeN(deformedMVerts);
- } else {
- deformedVerts = NULL;
- }
+ mesh_modifier(ob, &deformedVerts);
if (deform_r) *deform_r = getMeshDerivedMesh(me, ob, deformedVerts);
} else {
@@ -1053,22 +1040,70 @@ static void mesh_calc_modifiers(Mesh *me, Object *ob, float (*inputVertexCos)[3]
/***/
+static void clear_and_build_mesh_data(Object *ob, int mustBuildForMesh)
+{
+ float min[3], max[3];
+ Mesh *me= ob->data;
+
+ if(ob->flag&OB_FROMDUPLI) return; // XXX is this needed
+
+ /* also serves as signal to remake texspace */
+ if (me->bb) {
+ MEM_freeN(me->bb);
+ me->bb = NULL;
+ }
+
+ freedisplist(&ob->disp);
+
+ if (ob->derivedFinal) {
+ ob->derivedFinal->release(ob->derivedFinal);
+ ob->derivedFinal= NULL;
+ }
+ if (ob->derivedDeform) {
+ ob->derivedDeform->release(ob->derivedDeform);
+ ob->derivedDeform= NULL;
+ }
+
+ if (ob==G.obedit) {
+ G.editMesh->derived= subsurf_make_derived_from_editmesh(G.editMesh, me->subdiv, me->subsurftype, G.editMesh->derived);
+ }
+
+ if (ob!=G.obedit || mustBuildForMesh) {
+ mesh_calc_modifiers(ob->data, ob, NULL, &ob->derivedDeform, &ob->derivedFinal, 0, 1);
+
+ INIT_MINMAX(min, max);
+
+ ob->derivedFinal->getMinMax(ob->derivedFinal, min, max);
+
+ boundbox_set_from_min_max(mesh_get_bb(ob->data), min, max);
+
+ build_particle_system(ob);
+ }
+}
+
+void makeDispListMesh(Object *ob)
+{
+ clear_and_build_mesh_data(ob, 0);
+}
+
+/***/
+
DerivedMesh *mesh_get_derived_final(Object *ob, int *needsFree_r)
{
Mesh *me = ob->data;
- if (!me->derived) {
- makeDispListMesh(ob);
+ if (!ob->derivedFinal) {
+ clear_and_build_mesh_data(ob, 1);
}
*needsFree_r = 0;
- return me->derived;
+ return ob->derivedFinal;
}
DerivedMesh *mesh_get_derived_deform(Object *ob, int *needsFree_r)
{
if (!ob->derivedDeform) {
- makeDispListMesh(ob);
+ clear_and_build_mesh_data(ob, 1);
}
*needsFree_r = 0;
@@ -1141,46 +1176,3 @@ DerivedMesh *editmesh_get_derived_cage(int *needsFree_r)
return dm;
}
-
-/***/
-
-void makeDispListMesh(Object *ob)
-{
- MVert *deformedMVerts = NULL;
- float min[3], max[3];
- Mesh *me;
-
- if(ob->flag&OB_FROMDUPLI) return; // XXX is this needed
- me= ob->data;
-
- /* also serves as signal to remake texspace */
- if (me->bb) {
- MEM_freeN(me->bb);
- me->bb = NULL;
- }
-
- freedisplist(&ob->disp);
-
- if (me->derived) {
- me->derived->release(me->derived);
- me->derived= NULL;
- }
- if (ob->derivedDeform) {
- ob->derivedDeform->release(ob->derivedDeform);
- ob->derivedDeform= NULL;
- }
-
- if (ob==G.obedit) {
- G.editMesh->derived= subsurf_make_derived_from_editmesh(G.editMesh, me->subdiv, me->subsurftype, G.editMesh->derived);
- } else {
- mesh_calc_modifiers(ob->data, ob, NULL, &ob->derivedDeform, &me->derived, 0, 1);
-
- INIT_MINMAX(min, max);
-
- me->derived->getMinMax(me->derived, min, max);
-
- boundbox_set_from_min_max(mesh_get_bb(ob->data), min, max);
-
- build_particle_system(ob);
- }
-}