- 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);
};
/* 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

View File

@@ -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

View File

@@ -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]);

View File

@@ -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);
}
if(!me->disp.first || !((DispList*) me->disp.first)->nors) {
addnormalsDispList(ob, &me->disp);
}
}
DerivedMesh *mesh_get_derived(Object *ob)
{
Mesh *me= ob->data;
if ((me->flag&ME_SUBSURF) && me->subdiv) {
build_mesh_data(ob, G.obedit && me==G.obedit->data);
if(G.obedit && me==G.obedit->data) {
return G.editMesh->derived;
MEM_freeN(deformedMVerts);
} else {
return me->derived;
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 (deformedVerts && deformedVerts!=inputVertexCos) {
MEM_freeN(deformedVerts);
}
}
return NULL;
}
/***/
DerivedMesh *mesh_get_derived_final(Object *ob, int *needsFree_r)
{
Mesh *me = ob->data;
build_mesh_data(ob, G.obedit && me==G.obedit->data);
if (!me->derived) {
makeDispListMesh(ob);
}
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) {
if (!ob->derivedDeform) {
makeDispListMesh(ob);
}
*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)
DerivedMesh *mesh_create_derived_render(Object *ob)
{
Mesh *me= ob->data;
DerivedMesh *final;
if ((me->flag&ME_SUBSURF) && me->subdivr) {
if (me->subdiv==me->subdivr) {
*needsFree_r = 0;
mesh_calc_modifiers(ob->data, ob, NULL, NULL, &final, 1, 1);
// 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 *mesh_get_base_derived(Object *ob)
DerivedMesh *mesh_create_derived_no_deform(Mesh *me, float (*vertCos)[3])
{
Mesh *me= ob->data;
DerivedMesh *final;
build_mesh_data(ob, G.obedit && me==G.obedit->data);
mesh_calc_modifiers(me, NULL, vertCos, NULL, &final, 0, 0);
if (G.obedit && me==G.obedit->data) {
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);
} 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)
DerivedMesh *editmesh_get_derived(void)
{
Mesh *me= ob->data;
Mesh *me= G.obedit->data;
if ((me->flag&ME_SUBSURF) && me->subdiv) {
if (!G.editMesh->derived) {
makeDispListMesh(G.obedit);
}
return G.editMesh->derived;
}
return NULL;
}
DerivedMesh *editmesh_get_derived_cage(int *needsFree_r)
{
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)
{
Mesh *me = ob->data;
/***/
return getMeshDerivedMesh(ob->data, ob, deformedVerts, NULL, NULL);
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;
}
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);
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);
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);
} else {
return getMeshDerivedMesh(me, NULL, NULL, NULL, vertCos);
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);
}
}

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)
{
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;

View File

@@ -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)

View File

@@ -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;

View File

@@ -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;

View File

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

View File

@@ -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 );

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 start, end, do_autosmooth=0, totvert = 0;
DispListMesh *dlm = NULL;
DerivedMesh *dm;
me= ob->data;
@@ -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);
dm = mesh_create_derived_render(ob);
dlm = dm->convertToDispListMesh(dm);
if (needsFree) {
dm->release(dm);
}
mvert= dlm->mvert;
totvert= dlm->totvert;
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);
}
/* ------------------------------------------------------------------------- */

View File

@@ -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;

View File

@@ -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);

View File

@@ -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);

View File

@@ -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];