- removed DispListMesh.{editedge,editface}
- removed displistmesh_from_{mesh,editmesh} - removed EditVert.ssco - removed unused functions for DispListMesh DerivedMesh Still need lots more testing for this stuff.
This commit is contained in:
@@ -129,17 +129,23 @@ struct DerivedMesh {
|
||||
};
|
||||
|
||||
/* Internal function, just temporarily exposed */
|
||||
DerivedMesh *derivedmesh_from_displistmesh(struct EditMesh *em, struct DispListMesh *dlm);
|
||||
DerivedMesh *derivedmesh_from_displistmesh(struct DispListMesh *dlm);
|
||||
|
||||
DerivedMesh *mesh_get_derived(struct Object *ob);
|
||||
DerivedMesh *mesh_get_base_derived(struct Object *ob);
|
||||
|
||||
DerivedMesh *mesh_get_derived_render(struct Object *ob, int *needsFree_r);
|
||||
|
||||
/* 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);
|
||||
|
||||
#endif
|
||||
|
||||
|
@@ -97,8 +97,6 @@ struct DispListMesh {
|
||||
struct MCol *mcol;
|
||||
struct MFace *mface;
|
||||
struct TFace *tface;
|
||||
struct EditEdge **editedge; // added for subsurf, drawobject.c
|
||||
struct EditFace **editface; // added for subsurf, drawobject.c
|
||||
float *nors; // facenormals
|
||||
};
|
||||
|
||||
@@ -107,8 +105,6 @@ void displistmesh_calc_normals(DispListMesh *dlm);
|
||||
|
||||
void displistmesh_to_mesh(DispListMesh *dlm, struct Mesh *me);
|
||||
|
||||
DispListMesh *displistmesh_from_editmesh(struct EditMesh *em);
|
||||
DispListMesh *displistmesh_from_mesh(struct Mesh *mesh, float *extverts);
|
||||
DispListMesh *displistmesh_copy(DispListMesh *odlm);
|
||||
|
||||
/*
|
||||
|
@@ -369,35 +369,22 @@ static int meshDM_getNumFaces(DerivedMesh *dm)
|
||||
return me->totface;
|
||||
}
|
||||
|
||||
static DispListMesh *meshDM_convertToDispListMesh(DerivedMesh *dm)
|
||||
{
|
||||
MeshDerivedMesh *mdm= (MeshDerivedMesh*) dm;
|
||||
|
||||
return displistmesh_from_mesh(mdm->ob->data, mdm->extverts);
|
||||
}
|
||||
|
||||
|
||||
static DerivedMesh *getMeshDerivedMesh(Object *ob, float *extverts, float *nors)
|
||||
{
|
||||
MeshDerivedMesh *mdm = MEM_mallocN(sizeof(*mdm), "dm");
|
||||
MeshDerivedMesh *mdm = MEM_callocN(sizeof(*mdm), "dm");
|
||||
|
||||
mdm->dm.getNumVerts = meshDM_getNumVerts;
|
||||
mdm->dm.getNumFaces = meshDM_getNumFaces;
|
||||
mdm->dm.convertToDispListMesh = meshDM_convertToDispListMesh;
|
||||
|
||||
mdm->dm.drawVerts = meshDM_drawVerts;
|
||||
mdm->dm.drawMappedVertsEM = NULL;
|
||||
|
||||
mdm->dm.drawEdges = meshDM_drawEdges;
|
||||
mdm->dm.drawMappedEdges = meshDM_drawEdges;
|
||||
mdm->dm.drawLooseEdges = meshDM_drawLooseEdges;
|
||||
mdm->dm.drawMappedEdgeEM = NULL;
|
||||
mdm->dm.drawMappedEdgesEM = NULL;
|
||||
|
||||
mdm->dm.drawFacesSolid = meshDM_drawFacesSolid;
|
||||
mdm->dm.drawFacesColored = meshDM_drawFacesColored;
|
||||
mdm->dm.drawFacesTex = meshDM_drawFacesTex;
|
||||
mdm->dm.drawMappedFacesEM = NULL;
|
||||
|
||||
mdm->dm.release = (void(*)(DerivedMesh*)) MEM_freeN;
|
||||
|
||||
@@ -524,35 +511,21 @@ static int emDM_getNumFaces(DerivedMesh *dm)
|
||||
return BLI_countlist(&emdm->em->faces);
|
||||
}
|
||||
|
||||
static DispListMesh *emDM_convertToDispListMesh(DerivedMesh *dm)
|
||||
{
|
||||
EditMeshDerivedMesh *emdm= (EditMeshDerivedMesh*) dm;
|
||||
|
||||
return displistmesh_from_editmesh(emdm->em);
|
||||
}
|
||||
|
||||
static DerivedMesh *getEditMeshDerivedMesh(EditMesh *em)
|
||||
{
|
||||
EditMeshDerivedMesh *emdm = MEM_mallocN(sizeof(*emdm), "dm");
|
||||
EditMeshDerivedMesh *emdm = MEM_callocN(sizeof(*emdm), "dm");
|
||||
|
||||
emdm->dm.getNumVerts = emDM_getNumVerts;
|
||||
emdm->dm.getNumFaces = emDM_getNumFaces;
|
||||
emdm->dm.getMappedVertCoEM = emDM_getMappedVertCoEM;
|
||||
emdm->dm.convertToDispListMesh = emDM_convertToDispListMesh;
|
||||
|
||||
emdm->dm.drawVerts = NULL;
|
||||
emdm->dm.drawMappedVertsEM = emDM_drawMappedVertsEM;
|
||||
|
||||
emdm->dm.drawEdges = NULL;
|
||||
emdm->dm.drawMappedEdges = NULL;
|
||||
emdm->dm.drawLooseEdges = NULL;
|
||||
emdm->dm.drawMappedEdgeEM = emDM_drawMappedEdgeEM;
|
||||
emdm->dm.drawMappedEdgesEM = emDM_drawMappedEdgesEM;
|
||||
emdm->dm.drawMappedEdgesInterpEM = emDM_drawMappedEdgesInterpEM;
|
||||
|
||||
emdm->dm.drawFacesSolid = emDM_drawFacesSolid;
|
||||
emdm->dm.drawFacesColored = NULL;
|
||||
emdm->dm.drawFacesTex = NULL;
|
||||
emdm->dm.drawMappedFacesEM = emDM_drawMappedFacesEM;
|
||||
|
||||
emdm->dm.release = (void(*)(DerivedMesh*)) MEM_freeN;
|
||||
@@ -568,33 +541,8 @@ typedef struct {
|
||||
DerivedMesh dm;
|
||||
|
||||
DispListMesh *dlm;
|
||||
EditMesh *em;
|
||||
} SSDerivedMesh;
|
||||
|
||||
static void ssDM_getMappedVertCoEM(DerivedMesh *dm, void *vert, float co_r[3])
|
||||
{
|
||||
EditVert *eve = vert;
|
||||
|
||||
// !eve->ssco happens for old subsurf, verts w/ unattached faces
|
||||
if (eve->ssco) {
|
||||
co_r[0] = eve->ssco[0];
|
||||
co_r[1] = eve->ssco[1];
|
||||
co_r[2] = eve->ssco[2];
|
||||
}
|
||||
}
|
||||
static void ssDM_drawMappedVertsEM(DerivedMesh *dm, int (*setDrawOptions)(void *userData, EditVert *vert), void *userData)
|
||||
{
|
||||
SSDerivedMesh *ssdm = (SSDerivedMesh*) dm;
|
||||
EditVert *eve;
|
||||
|
||||
bglBegin(GL_POINTS);
|
||||
for (eve=ssdm->em->verts.first; eve; eve=eve->next) {
|
||||
if(eve->ssco && (!setDrawOptions || setDrawOptions(userData, eve)))
|
||||
bglVertex3fv(eve->ssco);
|
||||
}
|
||||
bglEnd();
|
||||
}
|
||||
|
||||
static void ssDM_drawMappedEdges(DerivedMesh *dm)
|
||||
{
|
||||
SSDerivedMesh *ssdm = (SSDerivedMesh*) dm;
|
||||
@@ -618,46 +566,6 @@ static void ssDM_drawLooseEdges(DerivedMesh *dm)
|
||||
/* Can't implement currently */
|
||||
}
|
||||
|
||||
static void ssDM_drawMappedEdgeEM(DerivedMesh *dm, void *edge)
|
||||
{
|
||||
SSDerivedMesh *ssdm = (SSDerivedMesh*) dm;
|
||||
DispListMesh *dlm = ssdm->dlm;
|
||||
MEdge *medge= dlm->medge;
|
||||
MVert *mvert= dlm->mvert;
|
||||
int a;
|
||||
|
||||
glBegin(GL_LINES);
|
||||
for (a=0; a<dlm->totedge; a++, medge++) {
|
||||
if (medge->flag&ME_EDGEDRAW) {
|
||||
if (edge==dlm->editedge[a]) {
|
||||
glVertex3fv(mvert[medge->v1].co);
|
||||
glVertex3fv(mvert[medge->v2].co);
|
||||
}
|
||||
}
|
||||
}
|
||||
glEnd();
|
||||
}
|
||||
static void ssDM_drawMappedEdgesEM(DerivedMesh *dm, int (*setDrawOptions)(void *userData, EditEdge *edge), void *userData)
|
||||
{
|
||||
SSDerivedMesh *ssdm = (SSDerivedMesh*) dm;
|
||||
DispListMesh *dlm = ssdm->dlm;
|
||||
MEdge *medge= dlm->medge;
|
||||
MVert *mvert= dlm->mvert;
|
||||
int a;
|
||||
|
||||
glBegin(GL_LINES);
|
||||
for (a=0; a<dlm->totedge; a++, medge++) {
|
||||
if (medge->flag&ME_EDGEDRAW) {
|
||||
EditEdge *eed = dlm->editedge[a];
|
||||
|
||||
if (eed && (!setDrawOptions || setDrawOptions(userData, eed))) {
|
||||
glVertex3fv(mvert[medge->v1].co);
|
||||
glVertex3fv(mvert[medge->v2].co);
|
||||
}
|
||||
}
|
||||
}
|
||||
glEnd();
|
||||
}
|
||||
static void ssDM_drawVerts(DerivedMesh *dm)
|
||||
{
|
||||
SSDerivedMesh *ssdm = (SSDerivedMesh*) dm;
|
||||
@@ -813,27 +721,6 @@ static void ssDM_drawFacesColored(DerivedMesh *dm, int useTwoSided, unsigned cha
|
||||
|
||||
#undef PASSVERT
|
||||
}
|
||||
static void ssDM_drawMappedFacesEM(DerivedMesh *dm, int (*setDrawOptions)(void *userData, EditFace *face), void *userData)
|
||||
{
|
||||
SSDerivedMesh *ssdm = (SSDerivedMesh*) dm;
|
||||
DispListMesh *dlm = ssdm->dlm;
|
||||
MFace *mface= dlm->mface;
|
||||
int a;
|
||||
|
||||
for(a=0; a<dlm->totface; a++, mface++) {
|
||||
if(mface->v3) {
|
||||
if (!setDrawOptions || setDrawOptions(userData, dlm->editface[a])) {
|
||||
glBegin(mface->v4?GL_QUADS:GL_TRIANGLES);
|
||||
glVertex3fv(dlm->mvert[mface->v1].co);
|
||||
glVertex3fv(dlm->mvert[mface->v2].co);
|
||||
glVertex3fv(dlm->mvert[mface->v3].co);
|
||||
if (mface->v4) glVertex3fv(dlm->mvert[mface->v4].co);
|
||||
glEnd();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void ssDM_drawFacesTex(DerivedMesh *dm, int (*setDrawParams)(TFace *tf, int matnr))
|
||||
{
|
||||
SSDerivedMesh *ssdm = (SSDerivedMesh*) dm;
|
||||
@@ -920,34 +807,27 @@ static void ssDM_release(DerivedMesh *dm)
|
||||
MEM_freeN(dm);
|
||||
}
|
||||
|
||||
DerivedMesh *derivedmesh_from_displistmesh(EditMesh *em, DispListMesh *dlm)
|
||||
DerivedMesh *derivedmesh_from_displistmesh(DispListMesh *dlm)
|
||||
{
|
||||
SSDerivedMesh *ssdm = MEM_mallocN(sizeof(*ssdm), "dm");
|
||||
SSDerivedMesh *ssdm = MEM_callocN(sizeof(*ssdm), "dm");
|
||||
|
||||
ssdm->dm.getNumVerts = ssDM_getNumVerts;
|
||||
ssdm->dm.getNumFaces = ssDM_getNumFaces;
|
||||
ssdm->dm.getMappedVertCoEM = ssDM_getMappedVertCoEM;
|
||||
ssdm->dm.convertToDispListMesh = ssDM_convertToDispListMesh;
|
||||
|
||||
ssdm->dm.drawVerts = ssDM_drawVerts;
|
||||
ssdm->dm.drawMappedVertsEM = ssDM_drawMappedVertsEM;
|
||||
|
||||
ssdm->dm.drawEdges = ssDM_drawEdges;
|
||||
ssdm->dm.drawMappedEdges = ssDM_drawMappedEdges;
|
||||
ssdm->dm.drawLooseEdges = ssDM_drawLooseEdges;
|
||||
ssdm->dm.drawMappedEdgeEM = ssDM_drawMappedEdgeEM;
|
||||
ssdm->dm.drawMappedEdgesEM = ssDM_drawMappedEdgesEM;
|
||||
ssdm->dm.drawMappedEdgesInterpEM = NULL;
|
||||
|
||||
ssdm->dm.drawFacesSolid = ssDM_drawFacesSolid;
|
||||
ssdm->dm.drawFacesColored = ssDM_drawFacesColored;
|
||||
ssdm->dm.drawFacesTex = ssDM_drawFacesTex;
|
||||
ssdm->dm.drawMappedFacesEM = ssDM_drawMappedFacesEM;
|
||||
|
||||
ssdm->dm.release = ssDM_release;
|
||||
|
||||
ssdm->dlm = dlm;
|
||||
ssdm->em = em;
|
||||
|
||||
return (DerivedMesh*) ssdm;
|
||||
}
|
||||
|
@@ -107,120 +107,6 @@ struct _FastLamp {
|
||||
static FastLamp *fastlamplist= NULL;
|
||||
static float fviewmat[4][4];
|
||||
|
||||
/* only called from subsurf.c when levels is zero */
|
||||
DispListMesh *displistmesh_from_editmesh(EditMesh *em)
|
||||
{
|
||||
DispListMesh *dlm= MEM_callocN(sizeof(*dlm),"dlm");
|
||||
EditVert *eve, *evePrev;
|
||||
EditEdge *eed;
|
||||
EditFace *efa;
|
||||
MFace *mfNew;
|
||||
int i;
|
||||
|
||||
dlm->totvert= BLI_countlist(&em->verts);
|
||||
dlm->totedge= BLI_countlist(&em->edges);
|
||||
dlm->totface= BLI_countlist(&em->faces);
|
||||
dlm->editedge= MEM_mallocN(sizeof(*dlm->editedge)*dlm->totedge, "dlm->editedge");
|
||||
dlm->editface= MEM_mallocN(sizeof(*dlm->editface)*dlm->totface, "dlm->editface");
|
||||
dlm->mvert= MEM_callocN(sizeof(*dlm->mface)*dlm->totvert, "dlm->mvert");
|
||||
dlm->mcol= NULL;
|
||||
dlm->tface= NULL;
|
||||
dlm->medge= MEM_mallocN(sizeof(*dlm->medge)*dlm->totedge, "dlm->mface");
|
||||
dlm->mface= MEM_mallocN(sizeof(*dlm->mface)*dlm->totface, "dlm->mface");
|
||||
|
||||
i=0;
|
||||
for (eve= em->verts.first; eve; eve= eve->next, i++) {
|
||||
MVert *mvNew= &dlm->mvert[i];
|
||||
VECCOPY(mvNew->co, eve->co);
|
||||
eve->ssco= eve->co; /* no subsurf coordinate, but we add a save pointer in it */
|
||||
eve->prev= (void*) i; /* hack to fetch indices */
|
||||
}
|
||||
|
||||
mfNew= dlm->mface;
|
||||
for (i=0,efa= em->faces.first; efa; efa= efa->next) {
|
||||
// we skip hidden faces
|
||||
if(efa->v1->h || efa->v2->h || efa->v3->h || (efa->v4 && efa->v4->h)) dlm->totface--;
|
||||
else {
|
||||
dlm->editface[i++] = efa;
|
||||
mfNew->v1= (int) efa->v1->prev;
|
||||
mfNew->v2= (int) efa->v2->prev;
|
||||
mfNew->v3= (int) efa->v3->prev;
|
||||
mfNew->v4= efa->v4?(int) efa->v4->prev:0;
|
||||
mfNew->flag= efa->flag;
|
||||
mfNew->mat_nr= efa->mat_nr;
|
||||
mfNew->puno= 0;
|
||||
mfNew->edcode= 0;
|
||||
|
||||
if (efa->v4 && !mfNew->v4) {
|
||||
mfNew->v1^= mfNew->v3^= mfNew->v1^= mfNew->v3;
|
||||
mfNew->v2^= mfNew->v4^= mfNew->v2^= mfNew->v4;
|
||||
}
|
||||
mfNew++;
|
||||
}
|
||||
}
|
||||
for (i=0,eed= em->edges.first; eed; eed= eed->next) {
|
||||
MEdge *medge = &dlm->medge[i];
|
||||
dlm->editedge[i++] = eed;
|
||||
medge->v1 = (int) eed->v1->prev;
|
||||
medge->v2 = (int) eed->v2->prev;
|
||||
medge->crease = eed->crease;
|
||||
medge->flag = ME_EDGEDRAW;
|
||||
}
|
||||
|
||||
/* restore prev links */
|
||||
for (evePrev=NULL, eve= em->verts.first; eve; evePrev=eve, eve= eve->next)
|
||||
eve->prev= evePrev;
|
||||
|
||||
displistmesh_calc_normals(dlm);
|
||||
|
||||
return dlm;
|
||||
}
|
||||
DispListMesh *displistmesh_from_mesh(Mesh *me, float *extverts)
|
||||
{
|
||||
DispListMesh *dlm= MEM_callocN(sizeof(*dlm),"dlm");
|
||||
int i;
|
||||
|
||||
if (!me->medge) {
|
||||
make_edges(me);
|
||||
}
|
||||
|
||||
dlm->totvert= me->totvert;
|
||||
dlm->totedge= me->totedge;
|
||||
dlm->totface= me->totface;
|
||||
dlm->mvert= MEM_dupallocN(me->mvert);
|
||||
dlm->mcol= me->mcol?MEM_dupallocN(me->mcol):NULL;
|
||||
dlm->tface= me->tface?MEM_dupallocN(me->tface):NULL;
|
||||
dlm->medge= MEM_mallocN(sizeof(*dlm->medge)*dlm->totedge, "dlm->totedge");
|
||||
dlm->mface= MEM_mallocN(sizeof(*dlm->mface)*dlm->totface, "dlm->mface");
|
||||
|
||||
if (extverts) {
|
||||
for (i=0; i<dlm->totvert; i++) {
|
||||
VECCOPY(dlm->mvert[i].co, &extverts[i*3]);
|
||||
}
|
||||
}
|
||||
for (i=0; i<dlm->totface; i++) {
|
||||
MFace *mfOld= &((MFace*) me->mface)[i];
|
||||
MFace *mfNew= &dlm->mface[i];
|
||||
|
||||
mfNew->v1= mfOld->v1;
|
||||
mfNew->v2= mfOld->v2;
|
||||
mfNew->v3= mfOld->v3;
|
||||
mfNew->v4= mfOld->v4;
|
||||
mfNew->flag= mfOld->flag;
|
||||
mfNew->mat_nr= mfOld->mat_nr;
|
||||
mfNew->puno= 0;
|
||||
mfNew->edcode= 0;
|
||||
}
|
||||
for (i=0; i<dlm->totedge; i++) {
|
||||
dlm->medge[i] = me->medge[i];
|
||||
dlm->medge[i].flag |= ME_EDGEDRAW;
|
||||
}
|
||||
|
||||
displistmesh_calc_normals(dlm);
|
||||
|
||||
return dlm;
|
||||
}
|
||||
|
||||
void displistmesh_free(DispListMesh *dlm)
|
||||
{
|
||||
// also check on mvert and mface, can be NULL after decimator (ton)
|
||||
@@ -229,8 +115,6 @@ void displistmesh_free(DispListMesh *dlm)
|
||||
if (dlm->mface) MEM_freeN(dlm->mface);
|
||||
if (dlm->mcol) MEM_freeN(dlm->mcol);
|
||||
if (dlm->tface) MEM_freeN(dlm->tface);
|
||||
if (dlm->editedge) MEM_freeN(dlm->editedge);
|
||||
if (dlm->editface) MEM_freeN(dlm->editface);
|
||||
if (dlm->nors) MEM_freeN(dlm->nors);
|
||||
MEM_freeN(dlm);
|
||||
}
|
||||
@@ -238,8 +122,6 @@ void displistmesh_free(DispListMesh *dlm)
|
||||
DispListMesh *displistmesh_copy(DispListMesh *odlm)
|
||||
{
|
||||
DispListMesh *ndlm= MEM_dupallocN(odlm);
|
||||
ndlm->editedge= NULL;
|
||||
ndlm->editface= NULL;
|
||||
ndlm->mvert= MEM_dupallocN(odlm->mvert);
|
||||
ndlm->medge= MEM_dupallocN(odlm->medge);
|
||||
ndlm->mface= MEM_dupallocN(odlm->mface);
|
||||
|
@@ -293,13 +293,6 @@ static DispListMesh *subSurf_createDispListMesh(SubSurf *ssm) {
|
||||
for (; !ccgVertIterator_isStopped(vi); ccgVertIterator_next(vi)) {
|
||||
CCGVert *v = ccgVertIterator_getCurrent(vi);
|
||||
VecCopyf(dlm->mvert[i].co, ccgSubSurf_getVertData(ss, v));
|
||||
|
||||
if (ssm->controlType==SUBSURF_CONTROLTYPE_EDITMESH) {
|
||||
EditVert *ev = ccgSubSurf_getVertVertHandle(ss, v);
|
||||
|
||||
ev->ssco = dlm->mvert[i].co;
|
||||
}
|
||||
|
||||
*((int*) ccgSubSurf_getVertUserData(ss, v)) = i++;
|
||||
}
|
||||
ccgVertIterator_free(vi);
|
||||
@@ -1014,7 +1007,7 @@ DerivedMesh *subsurf_make_derived_from_mesh(Mesh *me, int subdivLevels) {
|
||||
|
||||
subSurf_free(ss);
|
||||
|
||||
return derivedmesh_from_displistmesh(NULL, dlm);
|
||||
return derivedmesh_from_displistmesh(dlm);
|
||||
}
|
||||
|
||||
void subsurf_calculate_limit_positions(Mesh *me, float (*positions_r)[3])
|
||||
|
@@ -46,7 +46,6 @@ typedef struct EditVert
|
||||
struct EditVert *next, *prev, *vn;
|
||||
float no[3];
|
||||
float co[3];
|
||||
float *ssco; /* subsurfed coordinate, dont use for temporal storage! it points to DispListMesh */
|
||||
short xs, ys;
|
||||
unsigned char f, h, f1, f2;
|
||||
short fast; /* only 0 or 1, for editmesh_fastmalloc */
|
||||
|
Reference in New Issue
Block a user