- 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
This commit is contained in:
2005-07-19 00:21:01 +00:00
parent d1dfb246c7
commit b58f7d0c55
15 changed files with 208 additions and 311 deletions

View File

@@ -146,30 +146,19 @@ struct DerivedMesh {
void (*release)(DerivedMesh *dm); void (*release)(DerivedMesh *dm);
}; };
/* Internal functions, just temporarily exposed */ /* Internal function, just temporarily exposed */
DerivedMesh *derivedmesh_from_displistmesh(struct DispListMesh *dlm); 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_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_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(struct Mesh *me, float (*vertCos)[3]);
DerivedMesh *mesh_create_derived_no_deform_render(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 DerivedMesh *editmesh_get_derived(void);
* objects, rather they are just proxies for the mesh or editmesh DerivedMesh *editmesh_get_derived_proxy(void);
* objects and are used to keep the drawing code consistent. They DerivedMesh *editmesh_get_derived_cage(int *needsFree_r);
* 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);
#endif #endif

View File

@@ -42,7 +42,6 @@
#define DL_INDEX3 4 #define DL_INDEX3 4
#define DL_INDEX4 5 #define DL_INDEX4 5
#define DL_VERTCOL 6 #define DL_VERTCOL 6
#define DL_NORS 8
/* dl->flag */ /* dl->flag */
#define DL_CYCL_U 1 #define DL_CYCL_U 1

View File

@@ -37,7 +37,7 @@ struct DerivedMesh;
struct EditMesh; 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_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]); void subsurf_calculate_limit_positions(Mesh *me, float (*positions_r)[3]);

View File

@@ -42,6 +42,7 @@
#include "DNA_object_types.h" #include "DNA_object_types.h"
#include "DNA_object_force.h" #include "DNA_object_force.h"
#include "BLI_arithb.h"
#include "BLI_blenlib.h" #include "BLI_blenlib.h"
#include "BLI_editVert.h" #include "BLI_editVert.h"
@@ -54,6 +55,7 @@
#include "BKE_mesh.h" #include "BKE_mesh.h"
#include "BKE_object.h" #include "BKE_object.h"
#include "BKE_subsurf.h" #include "BKE_subsurf.h"
#include "BKE_deform.h"
#include "BIF_gl.h" #include "BIF_gl.h"
#include "BIF_glutil.h" #include "BIF_glutil.h"
@@ -448,7 +450,31 @@ static void meshDM_release(DerivedMesh *dm)
MEM_freeN(mdm); 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"); MeshDerivedMesh *mdm = MEM_callocN(sizeof(*mdm), "mdm");
@@ -476,26 +502,24 @@ static DerivedMesh *getMeshDerivedMesh(Mesh *me, Object *ob, MVert *deformedVert
mdm->ob = ob; mdm->ob = ob;
mdm->me = me; mdm->me = me;
mdm->nors = nors; mdm->verts = me->mvert;
mdm->nors = NULL;
mdm->freeNors = 0; mdm->freeNors = 0;
if (vertCos) { if (vertCos) {
int i; 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++) { for (i=0; i<me->totvert; i++) {
deformedVerts[i].co[0] = vertCos[i][0]; mdm->verts[i].co[0] = vertCos[i][0];
deformedVerts[i].co[1] = vertCos[i][1]; mdm->verts[i].co[1] = vertCos[i][1];
deformedVerts[i].co[2] = vertCos[i][2]; 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); mesh_calc_normals(mdm->verts, me->totvert, me->mface, me->totface, &mdm->nors);
mdm->freeNors = 1; mdm->freeNors = 1;
} else { } else {
mdm->verts = me->mvert; mdm->nors = mesh_build_faceNormals(ob);
mdm->freeNors = 1;
} }
return (DerivedMesh*) mdm; return (DerivedMesh*) mdm;
@@ -984,160 +1008,179 @@ DerivedMesh *derivedmesh_from_displistmesh(DispListMesh *dlm)
return (DerivedMesh*) ssdm; 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 (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) { if ((me->flag&ME_SUBSURF) && me->subdiv) {
if(inEditMode && !G.editMesh->derived) { *final_r = subsurf_make_derived_from_mesh(me, useRenderParms?me->subdivr:me->subdiv, deformedVerts);
makeDispListMesh(ob); } else {
} else if (!inEditMode && !me->derived) { *final_r = getMeshDerivedMesh(me, ob, deformedVerts);
makeDispListMesh(ob);
}
} }
if(!me->disp.first || !((DispList*) me->disp.first)->nors) { if (deformedVerts && deformedVerts!=inputVertexCos) {
addnormalsDispList(ob, &me->disp); 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->derived) {
makeDispListMesh(ob);
}
*needsFree_r = 0;
return me->derived;
}
DerivedMesh *mesh_get_derived_deform(Object *ob, int *needsFree_r)
{
if (!ob->derivedDeform) {
makeDispListMesh(ob);
}
*needsFree_r = 0;
return ob->derivedDeform;
}
DerivedMesh *mesh_create_derived_render(Object *ob)
{
DerivedMesh *final;
mesh_calc_modifiers(ob->data, ob, NULL, NULL, &final, 1, 1);
return final;
}
DerivedMesh *mesh_create_derived_no_deform(Mesh *me, float (*vertCos)[3])
{
DerivedMesh *final;
mesh_calc_modifiers(me, NULL, vertCos, NULL, &final, 0, 0);
return final;
}
DerivedMesh *mesh_create_derived_no_deform_render(Mesh *me, float (*vertCos)[3])
{
DerivedMesh *final;
mesh_calc_modifiers(me, NULL, vertCos, NULL, &final, 1, 0);
return final;
}
/***/
DerivedMesh *editmesh_get_derived_proxy(void)
{
return getEditMeshDerivedMesh(G.editMesh);
}
DerivedMesh *editmesh_get_derived(void)
{
Mesh *me= G.obedit->data;
if ((me->flag&ME_SUBSURF) && me->subdiv) { if ((me->flag&ME_SUBSURF) && me->subdiv) {
build_mesh_data(ob, G.obedit && me==G.obedit->data); if (!G.editMesh->derived) {
makeDispListMesh(G.obedit);
if(G.obedit && me==G.obedit->data) {
return G.editMesh->derived;
} else {
return me->derived;
} }
return G.editMesh->derived;
} }
return NULL; return NULL;
} }
DerivedMesh *mesh_get_derived_final(Object *ob, int *needsFree_r) DerivedMesh *editmesh_get_derived_cage(int *needsFree_r)
{ {
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) {
*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);
}
}
DerivedMesh *mesh_get_derived_deform(Object *ob, int *needsFree_r)
{
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);
*needsFree_r = 1;
meDL = me->disp.first;
return getMeshDerivedMesh(ob->data, ob, NULL, meDL?meDL->nors:NULL, NULL);
}
}
DerivedMesh *mesh_get_derived_render(Object *ob, int *needsFree_r)
{
Mesh *me= ob->data;
if ((me->flag&ME_SUBSURF) && me->subdivr) {
if (me->subdiv==me->subdivr) {
*needsFree_r = 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;
}
}
*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 *mesh_get_base_derived(Object *ob)
{
Mesh *me= ob->data;
build_mesh_data(ob, G.obedit && me==G.obedit->data);
if (G.obedit && me==G.obedit->data) {
return getEditMeshDerivedMesh(G.editMesh);
} else {
DispList *meDL = me->disp.first;
return getMeshDerivedMesh(ob->data, ob, NULL, meDL?meDL->nors:NULL, NULL);
}
}
DerivedMesh *mesh_get_cage_derived(struct Object *ob, int *needsFree_r)
{
Mesh *me= ob->data;
DerivedMesh *dm = NULL; DerivedMesh *dm = NULL;
*needsFree_r = 0; *needsFree_r = 0;
if (me->flag&ME_OPT_EDGES) { if (me->flag&ME_OPT_EDGES) {
dm = mesh_get_derived(ob); dm = editmesh_get_derived();
} }
if (!dm) { if (!dm) {
*needsFree_r = 1; *needsFree_r = 1;
dm = mesh_get_base_derived(ob); dm = editmesh_get_derived_proxy();
} }
return dm; return dm;
} }
DerivedMesh *derivedmesh_from_mesh(Object *ob, MVert *deformedVerts) /***/
{
Mesh *me = ob->data;
return getMeshDerivedMesh(ob->data, ob, deformedVerts, NULL, NULL); void makeDispListMesh(Object *ob)
}
DerivedMesh *mesh_create_derived_no_deform(Mesh *me, float (*vertCos)[3])
{ {
if ((me->flag&ME_SUBSURF) && me->subdiv) { MVert *deformedMVerts = NULL;
return subsurf_make_derived_from_mesh(me, me->subdiv, NULL, vertCos); 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 { } 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);
DerivedMesh *mesh_create_derived_no_deform_render(Mesh *me, float (*vertCos)[3]) me->derived->getMinMax(me->derived, min, max);
{
if ((me->flag&ME_SUBSURF) && me->subdivr) { boundbox_set_from_min_max(mesh_get_bb(ob->data), min, max);
return subsurf_make_derived_from_mesh(me, me->subdivr, NULL, vertCos);
} else { build_particle_system(ob);
return getMeshDerivedMesh(me, NULL, NULL, NULL, vertCos);
} }
} }

View File

@@ -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) void addnormalsDispList(Object *ob, ListBase *lb)
{ {
DispList *dl = NULL; DispList *dl = NULL;
Mesh *me;
float *vdata, *ndata, nor[3]; float *vdata, *ndata, nor[3];
float *v1, *v2, *v3, *v4; float *v1, *v2, *v3, *v4;
float *n1, *n2, *n3, *n4; float *n1, *n2, *n3, *n4;
int a, b, p1, p2, p3, p4; 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; dl= lb->first;
while(dl) { while(dl) {
@@ -1408,62 +1361,6 @@ float calc_taper(Object *taperobj, int cur, int tot)
return 1.0; 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) void makeDispListMBall(Object *ob)
{ {
if(!ob || (ob->flag&OB_FROMDUPLI) || ob->type!=OB_MBALL) return; if(!ob || (ob->flag&OB_FROMDUPLI) || ob->type!=OB_MBALL) return;

View File

@@ -151,7 +151,6 @@ void free_mesh(Mesh *me)
if(me->mat) MEM_freeN(me->mat); if(me->mat) MEM_freeN(me->mat);
if(me->bb) MEM_freeN(me->bb); if(me->bb) MEM_freeN(me->bb);
if(me->disp.first) freedisplist(&me->disp);
if(me->derived) me->derived->release(me->derived); if(me->derived) me->derived->release(me->derived);
} }
@@ -236,8 +235,6 @@ Mesh *copy_mesh(Mesh *me)
men->texcomesh= NULL; men->texcomesh= NULL;
men->bb= MEM_dupallocN(men->bb); 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); men->key= copy_key(me->key);
if(men->key) men->key->from= (ID *)men; if(men->key) men->key->from= (ID *)men;
@@ -724,20 +721,6 @@ void flipnorm_mesh(Mesh *me)
} }
mface++; 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) Mesh *get_mesh(Object *ob)

View File

@@ -72,7 +72,6 @@ typedef struct _SubSurf {
/* used by mesh control type */ /* used by mesh control type */
Mesh *me; Mesh *me;
Object *deformOb;
float (*vertCos)[3]; float (*vertCos)[3];
} SubSurf; } SubSurf;
@@ -145,14 +144,13 @@ static SubSurf *subSurf_fromEditmesh(EditMesh *em, int subdivLevels, int useAgin
return ss; 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"); SubSurf *ss = MEM_mallocN(sizeof(*ss), "ss_m");
ss->controlType = SUBSURF_CONTROLTYPE_MESH; ss->controlType = SUBSURF_CONTROLTYPE_MESH;
ss->useAging=0; ss->useAging=0;
ss->subSurf = _getSubSurf(ss, subdivLevels, 1); ss->subSurf = _getSubSurf(ss, subdivLevels, 1);
ss->me = me; ss->me = me;
ss->deformOb = deformOb;
ss->vertCos = vertCos; ss->vertCos = vertCos;
ccgSubSurf_setAllowEdgeCreation(ss->subSurf, 1, useFlatSubdiv?subdivLevels:0.0f); ccgSubSurf_setAllowEdgeCreation(ss->subSurf, 1, useFlatSubdiv?subdivLevels:0.0f);
@@ -509,15 +507,7 @@ static void subSurf_sync(SubSurf *ss, int useFlatSubdiv) {
CCGVertHDL fVerts[4]; CCGVertHDL fVerts[4];
int i; int i;
if (ss->deformOb && ss->deformOb->derivedDeform) { if (ss->vertCos) {
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) {
for (i=0; i<ss->me->totvert; i++) { for (i=0; i<ss->me->totvert; i++) {
ccgSubSurf_syncVert(ss->subSurf, (CCGVertHDL) i, ss->vertCos[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; 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; 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; DispListMesh *dlm;
subSurf_sync(ss, useFlatSubdiv); 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 * calculated vert positions is incorrect for the verts
* on the boundary of the mesh. * 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]; float edge_sum[3], face_sum[3];
CCGVertIterator *vi; CCGVertIterator *vi;

View File

@@ -2086,7 +2086,6 @@ static void direct_link_mesh(FileData *fd, Mesh *mesh)
mesh->dvert= newdataadr(fd, mesh->dvert); mesh->dvert= newdataadr(fd, mesh->dvert);
direct_link_dverts(fd, mesh->totvert, mesh->dvert); direct_link_dverts(fd, mesh->totvert, mesh->dvert);
mesh->disp.first= mesh->disp.last= NULL;
mesh->bb= NULL; mesh->bb= NULL;
mesh->oc= 0; mesh->oc= 0;
mesh->dface= NULL; mesh->dface= NULL;

View File

@@ -65,7 +65,6 @@ typedef struct Mesh {
struct BoundBox *bb; struct BoundBox *bb;
ListBase effect; ListBase effect;
ListBase disp;
struct Ipo *ipo; struct Ipo *ipo;
struct Key *key; struct Key *key;

View File

@@ -2399,7 +2399,6 @@ static void EXPP_unlink_mesh( Mesh * me )
static int unlink_existingMeshData( Mesh * mesh ) static int unlink_existingMeshData( Mesh * mesh )
{ {
freedisplist( &mesh->disp );
EXPP_unlink_mesh( mesh ); EXPP_unlink_mesh( mesh );
if( mesh->mvert ) if( mesh->mvert )
MEM_freeN( mesh->mvert ); MEM_freeN( mesh->mvert );

View File

@@ -1318,6 +1318,7 @@ static void init_render_mesh(Object *ob)
int a, a1, ok, do_puno=0, need_orco=0, totvlako, totverto, vertofs; int a, a1, ok, do_puno=0, need_orco=0, totvlako, totverto, vertofs;
int start, end, do_autosmooth=0, totvert = 0; int start, end, do_autosmooth=0, totvert = 0;
DispListMesh *dlm = NULL; DispListMesh *dlm = NULL;
DerivedMesh *dm;
me= ob->data; me= ob->data;
@@ -1358,19 +1359,13 @@ static void init_render_mesh(Object *ob)
orco = get_mesh_orco(ob); orco = get_mesh_orco(ob);
} }
{ dm = mesh_create_derived_render(ob);
int needsFree;
DerivedMesh *dm = mesh_get_derived_render(ob, &needsFree);
dlm = dm->convertToDispListMesh(dm); dlm = dm->convertToDispListMesh(dm);
if (needsFree) {
dm->release(dm);
}
mvert= dlm->mvert; mvert= dlm->mvert;
totvert= dlm->totvert; totvert= dlm->totvert;
ms = (totvert==me->totvert)?me->msticky:NULL; ms = (totvert==me->totvert)?me->msticky:NULL;
}
ma= give_render_material(ob, 1); ma= give_render_material(ob, 1);
@@ -1600,6 +1595,7 @@ static void init_render_mesh(Object *ob)
} }
if(dlm) displistmesh_free(dlm); if(dlm) displistmesh_free(dlm);
dm->release(dm);
} }
/* ------------------------------------------------------------------------- */ /* ------------------------------------------------------------------------- */

View File

@@ -2054,7 +2054,10 @@ void do_meshbuts(unsigned short event)
if(G.obedit) { if(G.obedit) {
flip_editnormals(); 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); allqueue(REDRAWVIEW3D, 0);
break; break;

View File

@@ -1062,7 +1062,7 @@ static void calc_meshverts(DerivedMesh *dm)
void calc_meshverts_ext(void) void calc_meshverts_ext(void)
{ {
int dmNeedsFree; int dmNeedsFree;
DerivedMesh *dm = mesh_get_cage_derived(G.obedit, &dmNeedsFree); DerivedMesh *dm = editmesh_get_derived_cage(&dmNeedsFree);
areawinset(curarea->win); areawinset(curarea->win);
persp(PERSP_VIEW); persp(PERSP_VIEW);
@@ -1080,7 +1080,7 @@ void calc_meshverts_ext(void)
void calc_meshverts_ext_f2(void) void calc_meshverts_ext_f2(void)
{ {
int dmNeedsFree; int dmNeedsFree;
DerivedMesh *dm = mesh_get_cage_derived(G.obedit, &dmNeedsFree); DerivedMesh *dm = editmesh_get_derived_cage(&dmNeedsFree);
float co[3], mat[4][4]; float co[3], mat[4][4];
EditVert *eve; 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; Mesh *me = ob->data;
Material *ma= give_current_material(ob, 1); Material *ma= give_current_material(ob, 1);
int hasHaloMat = (ma && (ma->mode&MA_HALO)); int hasHaloMat = (ma && (ma->mode&MA_HALO));
int draw_wire = ob->dtx&OB_DRAWWIRE; int draw_wire = ob->dtx&OB_DRAWWIRE;
DispList *dl; DispList *dl;
DerivedMesh *dm = realDM?realDM:baseDM;
glFrontFace((ob->transflag&OB_NEG_SCALE)?GL_CW:GL_CCW); 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; int has_alpha= 0;
if(G.obedit && ob->data==G.obedit->data) { if(G.obedit && ob->data==G.obedit->data) {
DerivedMesh *baseDM = mesh_get_base_derived(ob); DerivedMesh *baseDM = editmesh_get_derived_proxy();
DerivedMesh *realDM = mesh_get_derived(ob); DerivedMesh *realDM = editmesh_get_derived();
if(dt>OB_WIRE) init_gl_materials(ob); // no transp in editmode, the fancy draw over goes bad then 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); 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); BoundBox *bb = mesh_get_bb(me);
if(me->totface<=4 || boundbox_clip(ob->obmat, bb)) { if(me->totface<=4 || boundbox_clip(ob->obmat, bb)) {
int baseDMneedsFree; int baseDMneedsFree, realDMneedsFree;
DerivedMesh *baseDM = mesh_get_derived_deform(ob, &baseDMneedsFree); 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); if(dt==OB_SOLID) has_alpha= init_gl_materials(ob);
draw_mesh_fancy(ob, baseDM, realDM, dt); draw_mesh_fancy(ob, baseDM, realDM, dt);
if (baseDMneedsFree) baseDM->release(baseDM); if (baseDMneedsFree) baseDM->release(baseDM);
if (realDMneedsFree) realDM->release(realDM);
} }
} }
@@ -4051,7 +4051,7 @@ void draw_object_backbufsel(Object *ob)
case OB_MESH: case OB_MESH:
if(ob==G.obedit) { if(ob==G.obedit) {
int dmNeedsFree; 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); em_solidoffs= bbs_mesh_solid_EM(dm, G.scene->selectmode & SCE_SELECT_FACE);

View File

@@ -678,7 +678,7 @@ static EditFace *findnearestface(short *dist)
static void unified_select_draw(EditVert *eve, EditEdge *eed, EditFace *efa) static void unified_select_draw(EditVert *eve, EditEdge *eed, EditFace *efa)
{ {
int dmNeedsFree; int dmNeedsFree;
DerivedMesh *dm = mesh_get_cage_derived(G.obedit, &dmNeedsFree); DerivedMesh *dm = editmesh_get_derived_cage(&dmNeedsFree);
glDrawBuffer(GL_FRONT); glDrawBuffer(GL_FRONT);

View File

@@ -173,7 +173,7 @@ int calc_manipulator_stats(ScrArea *sa)
if(G.obedit->type==OB_MESH) { if(G.obedit->type==OB_MESH) {
int dmNeedsFree; int dmNeedsFree;
DerivedMesh *dm = mesh_get_cage_derived(G.obedit, &dmNeedsFree); DerivedMesh *dm = editmesh_get_derived_cage(&dmNeedsFree);
EditMesh *em = G.editMesh; EditMesh *em = G.editMesh;
EditVert *eve; EditVert *eve;
float vec[3]; float vec[3];