- 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:
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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]);
|
||||
|
||||
|
||||
@@ -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 (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(inEditMode && !G.editMesh->derived) {
|
||||
makeDispListMesh(ob);
|
||||
} else if (!inEditMode && !me->derived) {
|
||||
makeDispListMesh(ob);
|
||||
}
|
||||
*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->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) {
|
||||
build_mesh_data(ob, G.obedit && me==G.obedit->data);
|
||||
|
||||
if(G.obedit && me==G.obedit->data) {
|
||||
return G.editMesh->derived;
|
||||
} else {
|
||||
return me->derived;
|
||||
if (!G.editMesh->derived) {
|
||||
makeDispListMesh(G.obedit);
|
||||
}
|
||||
|
||||
return G.editMesh->derived;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
DerivedMesh *mesh_get_derived_final(Object *ob, int *needsFree_r)
|
||||
DerivedMesh *editmesh_get_derived_cage(int *needsFree_r)
|
||||
{
|
||||
Mesh *me= ob->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;
|
||||
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);
|
||||
}
|
||||
|
||||
DerivedMesh *mesh_create_derived_no_deform(Mesh *me, float (*vertCos)[3])
|
||||
void makeDispListMesh(Object *ob)
|
||||
{
|
||||
if ((me->flag&ME_SUBSURF) && me->subdiv) {
|
||||
return subsurf_make_derived_from_mesh(me, me->subdiv, NULL, vertCos);
|
||||
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 {
|
||||
return getMeshDerivedMesh(me, NULL, NULL, NULL, vertCos);
|
||||
}
|
||||
}
|
||||
|
||||
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);
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -65,7 +65,6 @@ typedef struct Mesh {
|
||||
struct BoundBox *bb;
|
||||
|
||||
ListBase effect;
|
||||
ListBase disp;
|
||||
|
||||
struct Ipo *ipo;
|
||||
struct Key *key;
|
||||
|
||||
@@ -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 );
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
/* ------------------------------------------------------------------------- */
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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];
|
||||
|
||||
Reference in New Issue
Block a user