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-07-19 04:21:01 +0400
committerDaniel Dunbar <daniel@zuster.org>2005-07-19 04:21:01 +0400
commitb58f7d0c554e536d4e70e9ccf06fb2e5d38a34f4 (patch)
treee64e8b456b25cd9c3903389cadbae2ee32ade640
parentd1dfb246c788492168c666aca1a30a00aa73c206 (diff)
- change mesh_get_derived_render to mesh_create_derived_render (always
builds new DerivedMesh... caching can come later) - split DerivedMesh returning functions into editmesh and mesh groups - got rid of DL_NORS displist type (get built on fly for mesh when needed) - got rid of Mesh.disp (yay!) - started to punch DerivedMesh returning functions into shape to introduce modifier stack
-rw-r--r--source/blender/blenkernel/BKE_DerivedMesh.h21
-rw-r--r--source/blender/blenkernel/BKE_displist.h1
-rw-r--r--source/blender/blenkernel/BKE_subsurf.h2
-rw-r--r--source/blender/blenkernel/intern/DerivedMesh.c259
-rw-r--r--source/blender/blenkernel/intern/displist.c103
-rw-r--r--source/blender/blenkernel/intern/mesh.c17
-rw-r--r--source/blender/blenkernel/intern/subsurf_ccg.c20
-rw-r--r--source/blender/blenloader/intern/readfile.c1
-rw-r--r--source/blender/makesdna/DNA_mesh_types.h1
-rw-r--r--source/blender/python/api2_2x/NMesh.c1
-rw-r--r--source/blender/renderconverter/intern/convertBlenderScene.c20
-rw-r--r--source/blender/src/buttons_editing.c5
-rw-r--r--source/blender/src/drawobject.c18
-rw-r--r--source/blender/src/editmesh_mods.c2
-rw-r--r--source/blender/src/transform_manipulator.c2
15 files changed, 185 insertions, 288 deletions
diff --git a/source/blender/blenkernel/BKE_DerivedMesh.h b/source/blender/blenkernel/BKE_DerivedMesh.h
index 8b038ed8a5d..55bb92ce8a2 100644
--- a/source/blender/blenkernel/BKE_DerivedMesh.h
+++ b/source/blender/blenkernel/BKE_DerivedMesh.h
@@ -146,30 +146,19 @@ struct DerivedMesh {
void (*release)(DerivedMesh *dm);
};
- /* Internal functions, just temporarily exposed */
+ /* Internal function, just temporarily exposed */
DerivedMesh *derivedmesh_from_displistmesh(struct DispListMesh *dlm);
-DerivedMesh *derivedmesh_from_mesh(struct Object *ob, struct MVert *deformedVerts);
-DerivedMesh *mesh_get_derived(struct Object *ob);
DerivedMesh *mesh_get_derived_final(struct Object *ob, int *needsFree_r);
-DerivedMesh *mesh_get_derived_render(struct Object *ob, int *needsFree_r);
DerivedMesh *mesh_get_derived_deform(struct Object *ob, int *needsFree_r);
+DerivedMesh *mesh_create_derived_render(struct Object *ob);
DerivedMesh *mesh_create_derived_no_deform(struct Mesh *me, float (*vertCos)[3]);
DerivedMesh *mesh_create_derived_no_deform_render(struct Mesh *me, float (*vertCos)[3]);
- /* IMPORTANT: The functions below do not return "true" DerivedMesh
- * objects, rather they are just proxies for the mesh or editmesh
- * objects and are used to keep the drawing code consistent. They
- * should not be used as general purpose objects (access the Mesh
- * or EditMesh directly).
- */
-
- /* Utility function, just chooses appropriate DerivedMesh based
- * on mesh flags. Release result if *needsFree_r is true.
- */
-DerivedMesh *mesh_get_cage_derived(struct Object *ob, int *needsFree_r);
-DerivedMesh *mesh_get_base_derived(struct Object *ob);
+DerivedMesh *editmesh_get_derived(void);
+DerivedMesh *editmesh_get_derived_proxy(void);
+DerivedMesh *editmesh_get_derived_cage(int *needsFree_r);
#endif
diff --git a/source/blender/blenkernel/BKE_displist.h b/source/blender/blenkernel/BKE_displist.h
index 44584ec4053..eb66397fb37 100644
--- a/source/blender/blenkernel/BKE_displist.h
+++ b/source/blender/blenkernel/BKE_displist.h
@@ -42,7 +42,6 @@
#define DL_INDEX3 4
#define DL_INDEX4 5
#define DL_VERTCOL 6
-#define DL_NORS 8
/* dl->flag */
#define DL_CYCL_U 1
diff --git a/source/blender/blenkernel/BKE_subsurf.h b/source/blender/blenkernel/BKE_subsurf.h
index 4ec8c88bbf4..3ae15d346bb 100644
--- a/source/blender/blenkernel/BKE_subsurf.h
+++ b/source/blender/blenkernel/BKE_subsurf.h
@@ -37,7 +37,7 @@ struct DerivedMesh;
struct EditMesh;
struct DerivedMesh *subsurf_make_derived_from_editmesh(struct EditMesh *em, int subdivLevels, short type, struct DerivedMesh *oldDerived);
-struct DerivedMesh *subsurf_make_derived_from_mesh(struct Mesh *me, int subdivLevels, struct Object *deformedVertsOb, float (*vertCos)[3]);
+struct DerivedMesh *subsurf_make_derived_from_mesh(struct Mesh *me, int subdivLevels, float (*vertCos)[3]);
void subsurf_calculate_limit_positions(Mesh *me, float (*positions_r)[3]);
diff --git a/source/blender/blenkernel/intern/DerivedMesh.c b/source/blender/blenkernel/intern/DerivedMesh.c
index b72b0933813..03171b1019c 100644
--- a/source/blender/blenkernel/intern/DerivedMesh.c
+++ b/source/blender/blenkernel/intern/DerivedMesh.c
@@ -42,6 +42,7 @@
#include "DNA_object_types.h"
#include "DNA_object_force.h"
+#include "BLI_arithb.h"
#include "BLI_blenlib.h"
#include "BLI_editVert.h"
@@ -54,6 +55,7 @@
#include "BKE_mesh.h"
#include "BKE_object.h"
#include "BKE_subsurf.h"
+#include "BKE_deform.h"
#include "BIF_gl.h"
#include "BIF_glutil.h"
@@ -448,7 +450,31 @@ static void meshDM_release(DerivedMesh *dm)
MEM_freeN(mdm);
}
-static DerivedMesh *getMeshDerivedMesh(Mesh *me, Object *ob, MVert *deformedVerts, float *nors, float (*vertCos)[3])
+static float *mesh_build_faceNormals(Object *meshOb)
+{
+ Mesh *me = meshOb->data;
+ float *nors = MEM_mallocN(sizeof(float)*3*me->totface, "meshnormals");
+ float *n1 = nors;
+ int i;
+
+ for (i=0; i<me->totface; i++,n1+=3) {
+ MFace *mf = &me->mface[i];
+
+ if (mf->v3) {
+ MVert *ve1= &me->mvert[mf->v1];
+ MVert *ve2= &me->mvert[mf->v2];
+ MVert *ve3= &me->mvert[mf->v3];
+ MVert *ve4= &me->mvert[mf->v4];
+
+ if(mf->v4) CalcNormFloat4(ve1->co, ve2->co, ve3->co, ve4->co, n1);
+ else CalcNormFloat(ve1->co, ve2->co, ve3->co, n1);
+ }
+ }
+
+ return nors;
+}
+
+static DerivedMesh *getMeshDerivedMesh(Mesh *me, Object *ob, float (*vertCos)[3])
{
MeshDerivedMesh *mdm = MEM_callocN(sizeof(*mdm), "mdm");
@@ -476,26 +502,24 @@ static DerivedMesh *getMeshDerivedMesh(Mesh *me, Object *ob, MVert *deformedVert
mdm->ob = ob;
mdm->me = me;
- mdm->nors = nors;
+ mdm->verts = me->mvert;
+ mdm->nors = NULL;
mdm->freeNors = 0;
if (vertCos) {
int i;
- deformedVerts = MEM_mallocN(sizeof(*deformedVerts)*me->totvert, "deformedVerts");
+ mdm->verts = MEM_mallocN(sizeof(*mdm->verts)*me->totvert, "deformedVerts");
for (i=0; i<me->totvert; i++) {
- deformedVerts[i].co[0] = vertCos[i][0];
- deformedVerts[i].co[1] = vertCos[i][1];
- deformedVerts[i].co[2] = vertCos[i][2];
+ mdm->verts[i].co[0] = vertCos[i][0];
+ mdm->verts[i].co[1] = vertCos[i][1];
+ mdm->verts[i].co[2] = vertCos[i][2];
}
- }
-
- if (deformedVerts) {
- mdm->verts = deformedVerts;
mesh_calc_normals(mdm->verts, me->totvert, me->mface, me->totface, &mdm->nors);
mdm->freeNors = 1;
} else {
- mdm->verts = me->mvert;
+ mdm->nors = mesh_build_faceNormals(ob);
+ mdm->freeNors = 1;
}
return (DerivedMesh*) mdm;
@@ -984,160 +1008,179 @@ DerivedMesh *derivedmesh_from_displistmesh(DispListMesh *dlm)
return (DerivedMesh*) ssdm;
}
-///
+/***/
-static void build_mesh_data(Object *ob, int inEditMode)
+static void mesh_calc_modifiers(Mesh *me, Object *ob, float (*inputVertexCos)[3], DerivedMesh **deform_r, DerivedMesh **final_r, int useRenderParms, int useDeform)
{
- Mesh *me = ob->data;
+ float (*deformedVerts)[3];
- if ((me->flag&ME_SUBSURF) && me->subdiv) {
- if(inEditMode && !G.editMesh->derived) {
- makeDispListMesh(ob);
- } else if (!inEditMode && !me->derived) {
- makeDispListMesh(ob);
+ if (deform_r) *deform_r = NULL;
+ *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;
}
+
+ if (deform_r) *deform_r = getMeshDerivedMesh(me, ob, deformedVerts);
+ } else {
+ deformedVerts = inputVertexCos;
+ }
+
+ if ((me->flag&ME_SUBSURF) && me->subdiv) {
+ *final_r = subsurf_make_derived_from_mesh(me, useRenderParms?me->subdivr:me->subdiv, deformedVerts);
+ } else {
+ *final_r = getMeshDerivedMesh(me, ob, deformedVerts);
}
- if(!me->disp.first || !((DispList*) me->disp.first)->nors) {
- addnormalsDispList(ob, &me->disp);
+ if (deformedVerts && deformedVerts!=inputVertexCos) {
+ MEM_freeN(deformedVerts);
}
}
-DerivedMesh *mesh_get_derived(Object *ob)
+/***/
+
+DerivedMesh *mesh_get_derived_final(Object *ob, int *needsFree_r)
{
- Mesh *me= ob->data;
+ Mesh *me = ob->data;
- if ((me->flag&ME_SUBSURF) && me->subdiv) {
- build_mesh_data(ob, G.obedit && me==G.obedit->data);
+ if (!me->derived) {
+ makeDispListMesh(ob);
+ }
- if(G.obedit && me==G.obedit->data) {
- return G.editMesh->derived;
- } else {
- return me->derived;
- }
+ *needsFree_r = 0;
+ return me->derived;
+}
+
+DerivedMesh *mesh_get_derived_deform(Object *ob, int *needsFree_r)
+{
+ if (!ob->derivedDeform) {
+ makeDispListMesh(ob);
}
- return NULL;
+ *needsFree_r = 0;
+ return ob->derivedDeform;
}
-DerivedMesh *mesh_get_derived_final(Object *ob, int *needsFree_r)
+DerivedMesh *mesh_create_derived_render(Object *ob)
{
- Mesh *me= ob->data;
+ DerivedMesh *final;
- build_mesh_data(ob, G.obedit && me==G.obedit->data);
+ mesh_calc_modifiers(ob->data, ob, NULL, NULL, &final, 1, 1);
- if ((me->flag&ME_SUBSURF) && me->subdiv) {
- *needsFree_r = 0;
-
- if(G.obedit && me==G.obedit->data) {
- return G.editMesh->derived;
- } else {
- return me->derived;
- }
- } else {
- return mesh_get_derived_deform(ob, needsFree_r);
- }
+ return final;
}
-DerivedMesh *mesh_get_derived_deform(Object *ob, int *needsFree_r)
+DerivedMesh *mesh_create_derived_no_deform(Mesh *me, float (*vertCos)[3])
{
- if (ob->derivedDeform) {
- *needsFree_r = 0;
- return ob->derivedDeform;
- } else {
- Mesh *me = ob->data;
- DispList *meDL;
-
- build_mesh_data(ob, G.obedit && me==G.obedit->data);
+ DerivedMesh *final;
- *needsFree_r = 1;
- meDL = me->disp.first;
+ mesh_calc_modifiers(me, NULL, vertCos, NULL, &final, 0, 0);
- return getMeshDerivedMesh(ob->data, ob, NULL, meDL?meDL->nors:NULL, NULL);
- }
+ return final;
}
-DerivedMesh *mesh_get_derived_render(Object *ob, int *needsFree_r)
+DerivedMesh *mesh_create_derived_no_deform_render(Mesh *me, float (*vertCos)[3])
{
- Mesh *me= ob->data;
+ DerivedMesh *final;
- if ((me->flag&ME_SUBSURF) && me->subdivr) {
- if (me->subdiv==me->subdivr) {
- *needsFree_r = 0;
+ mesh_calc_modifiers(me, NULL, vertCos, NULL, &final, 1, 0);
- // Don't reuse cache in editmode, we need to guarantee
- // index order of result and the incremental syncing messes
- // with this (could be fixed). - zr
- if(!(G.obedit && me==G.obedit->data)) {
- return me->derived;
- }
- }
+ return final;
+}
- *needsFree_r = 1;
- if(G.obedit && me==G.obedit->data) {
- return subsurf_make_derived_from_editmesh(G.editMesh, me->subdivr, me->subsurftype, NULL);
- } else {
- return subsurf_make_derived_from_mesh(ob->data, me->subdivr, ob, NULL);
- }
- } else {
- return mesh_get_derived_deform(ob, needsFree_r);
- }
+/***/
+
+DerivedMesh *editmesh_get_derived_proxy(void)
+{
+ return getEditMeshDerivedMesh(G.editMesh);
}
-DerivedMesh *mesh_get_base_derived(Object *ob)
+DerivedMesh *editmesh_get_derived(void)
{
- Mesh *me= ob->data;
+ Mesh *me= G.obedit->data;
- build_mesh_data(ob, G.obedit && me==G.obedit->data);
+ if ((me->flag&ME_SUBSURF) && me->subdiv) {
+ if (!G.editMesh->derived) {
+ makeDispListMesh(G.obedit);
+ }
- if (G.obedit && me==G.obedit->data) {
- return getEditMeshDerivedMesh(G.editMesh);
- } else {
- DispList *meDL = me->disp.first;
+ return G.editMesh->derived;
+ }
- return getMeshDerivedMesh(ob->data, ob, NULL, meDL?meDL->nors:NULL, NULL);
- }
+ return NULL;
}
-DerivedMesh *mesh_get_cage_derived(struct Object *ob, int *needsFree_r)
+DerivedMesh *editmesh_get_derived_cage(int *needsFree_r)
{
- Mesh *me= ob->data;
+ Mesh *me= G.obedit->data;
DerivedMesh *dm = NULL;
*needsFree_r = 0;
if (me->flag&ME_OPT_EDGES) {
- dm = mesh_get_derived(ob);
+ dm = editmesh_get_derived();
}
if (!dm) {
*needsFree_r = 1;
- dm = mesh_get_base_derived(ob);
+ dm = editmesh_get_derived_proxy();
}
return dm;
}
-DerivedMesh *derivedmesh_from_mesh(Object *ob, MVert *deformedVerts)
+/***/
+
+void makeDispListMesh(Object *ob)
{
- Mesh *me = ob->data;
+ MVert *deformedMVerts = NULL;
+ float min[3], max[3];
+ Mesh *me;
- return getMeshDerivedMesh(ob->data, ob, deformedVerts, NULL, NULL);
-}
+ if(ob->flag&OB_FROMDUPLI) return; // XXX is this needed
+ me= ob->data;
-DerivedMesh *mesh_create_derived_no_deform(Mesh *me, float (*vertCos)[3])
-{
- if ((me->flag&ME_SUBSURF) && me->subdiv) {
- return subsurf_make_derived_from_mesh(me, me->subdiv, NULL, vertCos);
- } else {
- return getMeshDerivedMesh(me, NULL, NULL, NULL, vertCos);
+ /* also serves as signal to remake texspace */
+ if (me->bb) {
+ MEM_freeN(me->bb);
+ me->bb = NULL;
}
-}
-DerivedMesh *mesh_create_derived_no_deform_render(Mesh *me, float (*vertCos)[3])
-{
- if ((me->flag&ME_SUBSURF) && me->subdivr) {
- return subsurf_make_derived_from_mesh(me, me->subdivr, NULL, vertCos);
+ 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 {
- return getMeshDerivedMesh(me, NULL, NULL, NULL, vertCos);
+ 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);
}
}
diff --git a/source/blender/blenkernel/intern/displist.c b/source/blender/blenkernel/intern/displist.c
index 0c1de9e624d..8fbb10d46b9 100644
--- a/source/blender/blenkernel/intern/displist.c
+++ b/source/blender/blenkernel/intern/displist.c
@@ -610,62 +610,15 @@ static void fastshade(float *co, float *nor, float *orco, Material *ma, char *co
}
-static float *mesh_build_faceNormals(Object *meshOb)
-{
- Mesh *me = meshOb->data;
- float *nors = MEM_mallocN(sizeof(float)*3*me->totface, "meshnormals");
- float *n1 = nors;
- int i;
-
- for (i=0; i<me->totface; i++,n1+=3) {
- MFace *mf = &me->mface[i];
-
- if (mf->v3) {
- MVert *ve1= &me->mvert[mf->v1];
- MVert *ve2= &me->mvert[mf->v2];
- MVert *ve3= &me->mvert[mf->v3];
- MVert *ve4= &me->mvert[mf->v4];
-
- if(mf->v4) CalcNormFloat4(ve1->co, ve2->co, ve3->co, ve4->co, n1);
- else CalcNormFloat(ve1->co, ve2->co, ve3->co, n1);
- }
- }
-
- return nors;
-}
-
void addnormalsDispList(Object *ob, ListBase *lb)
{
DispList *dl = NULL;
- Mesh *me;
float *vdata, *ndata, nor[3];
float *v1, *v2, *v3, *v4;
float *n1, *n2, *n3, *n4;
int a, b, p1, p2, p3, p4;
- if(ob->type==OB_MESH) {
-
- me= get_mesh(ob);
-
- if(me->totface==0) return;
-
- if(me->disp.first==0) {
- dl= MEM_callocN(sizeof(DispList), "meshdisp");
- dl->type= DL_NORS;
- dl->parts= 1;
- dl->nr= me->totface;
- BLI_addtail(&me->disp, dl);
- }
- else return;
-
- if(dl->nors==0) {
- dl->nors= mesh_build_faceNormals(ob);
- }
-
- return;
- }
-
dl= lb->first;
while(dl) {
@@ -1408,62 +1361,6 @@ float calc_taper(Object *taperobj, int cur, int tot)
return 1.0;
}
-void makeDispListMesh(Object *ob)
-{
- MVert *deformedMVerts = NULL;
- float min[3], max[3];
- Mesh *me;
-
- if(!ob || (ob->flag&OB_FROMDUPLI) || ob->type!=OB_MESH) return;
- me= ob->data;
-
- /* also serves as signal to remake texspace */
- if (me->bb) {
- MEM_freeN(me->bb);
- me->bb = NULL;
- }
-
- freedisplist(&ob->disp);
- freedisplist(&me->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) {
- mesh_modifier(ob, &deformedMVerts);
-
- if (deformedMVerts) {
- ob->derivedDeform = derivedmesh_from_mesh(ob, deformedMVerts);
- }
- }
-
- if ((me->flag&ME_SUBSURF) && me->subdiv) {
- if (ob==G.obedit) {
- G.editMesh->derived= subsurf_make_derived_from_editmesh(G.editMesh, me->subdiv, me->subsurftype, G.editMesh->derived);
- } else {
- me->derived= subsurf_make_derived_from_mesh(ob->data, me->subdiv, ob, NULL);
- }
- }
-
- INIT_MINMAX(min, max);
- if (me->derived) {
- me->derived->getMinMax(me->derived, min, max);
-
- boundbox_set_from_min_max(mesh_get_bb(ob->data), min, max);
- } else if (ob->derivedDeform) {
- ob->derivedDeform->getMinMax(ob->derivedDeform, min, max);
-
- boundbox_set_from_min_max(mesh_get_bb(ob->data), min, max);
- }
-
- build_particle_system(ob);
-}
void makeDispListMBall(Object *ob)
{
if(!ob || (ob->flag&OB_FROMDUPLI) || ob->type!=OB_MBALL) return;
diff --git a/source/blender/blenkernel/intern/mesh.c b/source/blender/blenkernel/intern/mesh.c
index 7b0e1d98750..52791ae0e06 100644
--- a/source/blender/blenkernel/intern/mesh.c
+++ b/source/blender/blenkernel/intern/mesh.c
@@ -151,7 +151,6 @@ void free_mesh(Mesh *me)
if(me->mat) MEM_freeN(me->mat);
if(me->bb) MEM_freeN(me->bb);
- if(me->disp.first) freedisplist(&me->disp);
if(me->derived) me->derived->release(me->derived);
}
@@ -236,8 +235,6 @@ Mesh *copy_mesh(Mesh *me)
men->texcomesh= NULL;
men->bb= MEM_dupallocN(men->bb);
- men->disp.first= men->disp.last= NULL; // dont copy, editmode version has pointers in it
-
men->key= copy_key(me->key);
if(men->key) men->key->from= (ID *)men;
@@ -724,20 +721,6 @@ void flipnorm_mesh(Mesh *me)
}
mface++;
}
-
- if(me->disp.first) {
- dl= me->disp.first;
- fp= dl->nors;
- if(fp) {
- a= dl->nr;
- while(a--) {
- fp[0]= -fp[0];
- fp[1]= -fp[1];
- fp[2]= -fp[2];
- fp+= 3;
- }
- }
- }
}
Mesh *get_mesh(Object *ob)
diff --git a/source/blender/blenkernel/intern/subsurf_ccg.c b/source/blender/blenkernel/intern/subsurf_ccg.c
index f7e17f75ae3..b5222d21630 100644
--- a/source/blender/blenkernel/intern/subsurf_ccg.c
+++ b/source/blender/blenkernel/intern/subsurf_ccg.c
@@ -72,7 +72,6 @@ typedef struct _SubSurf {
/* used by mesh control type */
Mesh *me;
- Object *deformOb;
float (*vertCos)[3];
} SubSurf;
@@ -145,14 +144,13 @@ static SubSurf *subSurf_fromEditmesh(EditMesh *em, int subdivLevels, int useAgin
return ss;
}
-static SubSurf *subSurf_fromMesh(Mesh *me, int useFlatSubdiv, int subdivLevels, Object *deformOb, float (*vertCos)[3]) {
+static SubSurf *subSurf_fromMesh(Mesh *me, int useFlatSubdiv, int subdivLevels, float (*vertCos)[3]) {
SubSurf *ss = MEM_mallocN(sizeof(*ss), "ss_m");
ss->controlType = SUBSURF_CONTROLTYPE_MESH;
ss->useAging=0;
ss->subSurf = _getSubSurf(ss, subdivLevels, 1);
ss->me = me;
- ss->deformOb = deformOb;
ss->vertCos = vertCos;
ccgSubSurf_setAllowEdgeCreation(ss->subSurf, 1, useFlatSubdiv?subdivLevels:0.0f);
@@ -509,15 +507,7 @@ static void subSurf_sync(SubSurf *ss, int useFlatSubdiv) {
CCGVertHDL fVerts[4];
int i;
- if (ss->deformOb && ss->deformOb->derivedDeform) {
- DispListMesh *dlm = ss->deformOb->derivedDeform->convertToDispListMesh(ss->deformOb->derivedDeform);
-
- for (i=0; i<ss->me->totvert; i++) {
- ccgSubSurf_syncVert(ss->subSurf, (CCGVertHDL) i, dlm->mvert[i].co);
- }
-
- displistmesh_free(dlm);
- } else if (ss->vertCos) {
+ if (ss->vertCos) {
for (i=0; i<ss->me->totvert; i++) {
ccgSubSurf_syncVert(ss->subSurf, (CCGVertHDL) i, ss->vertCos[i]);
}
@@ -1021,9 +1011,9 @@ DerivedMesh *subsurf_make_derived_from_editmesh(EditMesh *em, int subdivLevels,
return (DerivedMesh*) ccgdm;
}
-DerivedMesh *subsurf_make_derived_from_mesh(Mesh *me, int subdivLevels, Object *deformedVertsOb, float (*vertCos)[3]) {
+DerivedMesh *subsurf_make_derived_from_mesh(Mesh *me, int subdivLevels, float (*vertCos)[3]) {
int useFlatSubdiv = me->subsurftype==ME_SIMPLE_SUBSURF;
- SubSurf *ss = subSurf_fromMesh(me, useFlatSubdiv, subdivLevels, deformedVertsOb, vertCos);
+ SubSurf *ss = subSurf_fromMesh(me, useFlatSubdiv, subdivLevels, vertCos);
DispListMesh *dlm;
subSurf_sync(ss, useFlatSubdiv);
@@ -1042,7 +1032,7 @@ void subsurf_calculate_limit_positions(Mesh *me, float (*positions_r)[3])
* calculated vert positions is incorrect for the verts
* on the boundary of the mesh.
*/
- SubSurf *ss = subSurf_fromMesh(me, 0, 1, NULL, NULL);
+ SubSurf *ss = subSurf_fromMesh(me, 0, 1, NULL);
float edge_sum[3], face_sum[3];
CCGVertIterator *vi;
diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c
index 10c58904c3e..0911ccc7312 100644
--- a/source/blender/blenloader/intern/readfile.c
+++ b/source/blender/blenloader/intern/readfile.c
@@ -2086,7 +2086,6 @@ static void direct_link_mesh(FileData *fd, Mesh *mesh)
mesh->dvert= newdataadr(fd, mesh->dvert);
direct_link_dverts(fd, mesh->totvert, mesh->dvert);
- mesh->disp.first= mesh->disp.last= NULL;
mesh->bb= NULL;
mesh->oc= 0;
mesh->dface= NULL;
diff --git a/source/blender/makesdna/DNA_mesh_types.h b/source/blender/makesdna/DNA_mesh_types.h
index 2c09f93c5f4..8ec820b578c 100644
--- a/source/blender/makesdna/DNA_mesh_types.h
+++ b/source/blender/makesdna/DNA_mesh_types.h
@@ -65,7 +65,6 @@ typedef struct Mesh {
struct BoundBox *bb;
ListBase effect;
- ListBase disp;
struct Ipo *ipo;
struct Key *key;
diff --git a/source/blender/python/api2_2x/NMesh.c b/source/blender/python/api2_2x/NMesh.c
index 57768be2464..dd8cdda52d4 100644
--- a/source/blender/python/api2_2x/NMesh.c
+++ b/source/blender/python/api2_2x/NMesh.c
@@ -2399,7 +2399,6 @@ static void EXPP_unlink_mesh( Mesh * me )
static int unlink_existingMeshData( Mesh * mesh )
{
- freedisplist( &mesh->disp );
EXPP_unlink_mesh( mesh );
if( mesh->mvert )
MEM_freeN( mesh->mvert );
diff --git a/source/blender/renderconverter/intern/convertBlenderScene.c b/source/blender/renderconverter/intern/convertBlenderScene.c
index 47443d24273..dd90f251be5 100644
--- a/source/blender/renderconverter/intern/convertBlenderScene.c
+++ b/source/blender/renderconverter/intern/convertBlenderScene.c
@@ -1318,7 +1318,8 @@ static void init_render_mesh(Object *ob)
int a, a1, ok, do_puno=0, need_orco=0, totvlako, totverto, vertofs;
int start, end, do_autosmooth=0, totvert = 0;
DispListMesh *dlm = NULL;
-
+ DerivedMesh *dm;
+
me= ob->data;
paf = give_parteff(ob);
@@ -1358,19 +1359,13 @@ static void init_render_mesh(Object *ob)
orco = get_mesh_orco(ob);
}
- {
- int needsFree;
- DerivedMesh *dm = mesh_get_derived_render(ob, &needsFree);
- dlm = dm->convertToDispListMesh(dm);
- if (needsFree) {
- dm->release(dm);
- }
+ dm = mesh_create_derived_render(ob);
+ dlm = dm->convertToDispListMesh(dm);
- mvert= dlm->mvert;
- totvert= dlm->totvert;
+ mvert= dlm->mvert;
+ totvert= dlm->totvert;
- ms = (totvert==me->totvert)?me->msticky:NULL;
- }
+ ms = (totvert==me->totvert)?me->msticky:NULL;
ma= give_render_material(ob, 1);
@@ -1600,6 +1595,7 @@ static void init_render_mesh(Object *ob)
}
if(dlm) displistmesh_free(dlm);
+ dm->release(dm);
}
/* ------------------------------------------------------------------------- */
diff --git a/source/blender/src/buttons_editing.c b/source/blender/src/buttons_editing.c
index d3a34072cfd..4a14fbbd21f 100644
--- a/source/blender/src/buttons_editing.c
+++ b/source/blender/src/buttons_editing.c
@@ -2054,7 +2054,10 @@ void do_meshbuts(unsigned short event)
if(G.obedit) {
flip_editnormals();
}
- else flipnorm_mesh( get_mesh(ob) );
+ else {
+ flipnorm_mesh( get_mesh(ob) );
+ DAG_object_flush_update(G.scene, ob, OB_RECALC_DATA);
+ }
allqueue(REDRAWVIEW3D, 0);
break;
diff --git a/source/blender/src/drawobject.c b/source/blender/src/drawobject.c
index 7521f4391b1..4c05139227c 100644
--- a/source/blender/src/drawobject.c
+++ b/source/blender/src/drawobject.c
@@ -1062,7 +1062,7 @@ static void calc_meshverts(DerivedMesh *dm)
void calc_meshverts_ext(void)
{
int dmNeedsFree;
- DerivedMesh *dm = mesh_get_cage_derived(G.obedit, &dmNeedsFree);
+ DerivedMesh *dm = editmesh_get_derived_cage(&dmNeedsFree);
areawinset(curarea->win);
persp(PERSP_VIEW);
@@ -1080,7 +1080,7 @@ void calc_meshverts_ext(void)
void calc_meshverts_ext_f2(void)
{
int dmNeedsFree;
- DerivedMesh *dm = mesh_get_cage_derived(G.obedit, &dmNeedsFree);
+ DerivedMesh *dm = editmesh_get_derived_cage(&dmNeedsFree);
float co[3], mat[4][4];
EditVert *eve;
@@ -1776,14 +1776,13 @@ static void draw_mesh_object_outline(Object *ob, DerivedMesh *dm)
}
}
-static void draw_mesh_fancy(Object *ob, DerivedMesh *baseDM, DerivedMesh *realDM, int dt)
+static void draw_mesh_fancy(Object *ob, DerivedMesh *baseDM, DerivedMesh *dm, int dt)
{
Mesh *me = ob->data;
Material *ma= give_current_material(ob, 1);
int hasHaloMat = (ma && (ma->mode&MA_HALO));
int draw_wire = ob->dtx&OB_DRAWWIRE;
DispList *dl;
- DerivedMesh *dm = realDM?realDM:baseDM;
glFrontFace((ob->transflag&OB_NEG_SCALE)?GL_CW:GL_CCW);
@@ -1919,8 +1918,8 @@ static void draw_mesh_object(Base *base, int dt)
int has_alpha= 0;
if(G.obedit && ob->data==G.obedit->data) {
- DerivedMesh *baseDM = mesh_get_base_derived(ob);
- DerivedMesh *realDM = mesh_get_derived(ob);
+ DerivedMesh *baseDM = editmesh_get_derived_proxy();
+ DerivedMesh *realDM = editmesh_get_derived();
if(dt>OB_WIRE) init_gl_materials(ob); // no transp in editmode, the fancy draw over goes bad then
draw_em_fancy(ob, G.editMesh, baseDM, realDM, dt);
@@ -1931,14 +1930,15 @@ static void draw_mesh_object(Base *base, int dt)
BoundBox *bb = mesh_get_bb(me);
if(me->totface<=4 || boundbox_clip(ob->obmat, bb)) {
- int baseDMneedsFree;
+ int baseDMneedsFree, realDMneedsFree;
DerivedMesh *baseDM = mesh_get_derived_deform(ob, &baseDMneedsFree);
- DerivedMesh *realDM = mesh_get_derived(ob);
+ DerivedMesh *realDM = mesh_get_derived_final(ob, &realDMneedsFree);
if(dt==OB_SOLID) has_alpha= init_gl_materials(ob);
draw_mesh_fancy(ob, baseDM, realDM, dt);
if (baseDMneedsFree) baseDM->release(baseDM);
+ if (realDMneedsFree) realDM->release(realDM);
}
}
@@ -4051,7 +4051,7 @@ void draw_object_backbufsel(Object *ob)
case OB_MESH:
if(ob==G.obedit) {
int dmNeedsFree;
- DerivedMesh *dm = mesh_get_cage_derived(ob, &dmNeedsFree);
+ DerivedMesh *dm = editmesh_get_derived_cage(&dmNeedsFree);
em_solidoffs= bbs_mesh_solid_EM(dm, G.scene->selectmode & SCE_SELECT_FACE);
diff --git a/source/blender/src/editmesh_mods.c b/source/blender/src/editmesh_mods.c
index a3bd62aa6c0..0f0d131793a 100644
--- a/source/blender/src/editmesh_mods.c
+++ b/source/blender/src/editmesh_mods.c
@@ -678,7 +678,7 @@ static EditFace *findnearestface(short *dist)
static void unified_select_draw(EditVert *eve, EditEdge *eed, EditFace *efa)
{
int dmNeedsFree;
- DerivedMesh *dm = mesh_get_cage_derived(G.obedit, &dmNeedsFree);
+ DerivedMesh *dm = editmesh_get_derived_cage(&dmNeedsFree);
glDrawBuffer(GL_FRONT);
diff --git a/source/blender/src/transform_manipulator.c b/source/blender/src/transform_manipulator.c
index c6f68ac331c..a15b686c64a 100644
--- a/source/blender/src/transform_manipulator.c
+++ b/source/blender/src/transform_manipulator.c
@@ -173,7 +173,7 @@ int calc_manipulator_stats(ScrArea *sa)
if(G.obedit->type==OB_MESH) {
int dmNeedsFree;
- DerivedMesh *dm = mesh_get_cage_derived(G.obedit, &dmNeedsFree);
+ DerivedMesh *dm = editmesh_get_derived_cage(&dmNeedsFree);
EditMesh *em = G.editMesh;
EditVert *eve;
float vec[3];