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-08-18 15:31:20 +0400
committerDaniel Dunbar <daniel@zuster.org>2005-08-18 15:31:20 +0400
commit8c41c00ff7b67f885f67af835f1228f0ba42a455 (patch)
treead280f23e68ed054559e447e311c044d313f8da5 /source/blender/blenkernel
parentb774712d80c8901041282544c5dd6a9b3b0bbecf (diff)
- added DerivedMesh.drawUVEdges function & implementations
- removed DerivedMesh.drawLooseEdges and replaced with much more general drawEdgesFlag function that draws based edge flags. - switch DerivedMesh.drawFacesTex to give user control over which faces are drawn - added object_uvs_changed and object_tface_flags_changed functions to do object recalc flag flush/redraw queueing and added calls in appropriate places - added various edge flags to mark TFace information. This is used by the drawEdgesFlag routine and was the best way I could come up with to deal with drawing TFace information from modifier stack. Unfortunate side effects are (1) uses a lot of MEdge flags (although not needed in file so thats fine) and (2) requires recalculation of modifier stack on UV selection changes. #2 is disappointing but I could not find a better solution. - update UV mesh shadow drawing to use modifier result. At the moment just uses the final result but probably should be integrated with the editmode cage option. - convert draw_tfaces3D to use drawEdgesFlag routine which cleaned up the code quite a bit. - convert draw_tface_mesh to draw using result of modifier stack. Same comment about which result actually gets draw in FACESELECT mode as for UV editor shadow drawing applies. There is a still a bug in that selection is using the wrong mesh to draw.
Diffstat (limited to 'source/blender/blenkernel')
-rw-r--r--source/blender/blenkernel/BKE_DerivedMesh.h11
-rw-r--r--source/blender/blenkernel/intern/CCGSubSurf.c9
-rw-r--r--source/blender/blenkernel/intern/CCGSubSurf.h1
-rw-r--r--source/blender/blenkernel/intern/DerivedMesh.c226
-rw-r--r--source/blender/blenkernel/intern/subsurf_ccg.c127
5 files changed, 288 insertions, 86 deletions
diff --git a/source/blender/blenkernel/BKE_DerivedMesh.h b/source/blender/blenkernel/BKE_DerivedMesh.h
index f221391d6f0..99d438743fa 100644
--- a/source/blender/blenkernel/BKE_DerivedMesh.h
+++ b/source/blender/blenkernel/BKE_DerivedMesh.h
@@ -127,15 +127,18 @@ struct DerivedMesh {
/* Draw all vertices as bgl points (no options) */
void (*drawVerts)(DerivedMesh *dm);
+ /* Draw edges in the UV mesh (if exists) */
+ void (*drawUVEdges)(DerivedMesh *dm);
+
/* Draw all edges as lines (no options)
*
* Also called for *final* editmode DerivedMeshes
*/
void (*drawEdges)(DerivedMesh *dm, int drawLooseEdges);
-
- /* Draw all edges without faces as lines (no options) */
- void (*drawLooseEdges)(DerivedMesh *dm);
-
+
+ /* Draw all edges for which (med->flag&mask)==value */
+ void (*drawEdgesFlag)(DerivedMesh *dm, unsigned int mask, unsigned int value);
+
/* Draw all faces
* o Set face normal or vertex normal based on inherited face flag
* o Use inherited face material index to call setMaterial
diff --git a/source/blender/blenkernel/intern/CCGSubSurf.c b/source/blender/blenkernel/intern/CCGSubSurf.c
index bec741c64e6..2ed7d60e57e 100644
--- a/source/blender/blenkernel/intern/CCGSubSurf.c
+++ b/source/blender/blenkernel/intern/CCGSubSurf.c
@@ -2129,6 +2129,15 @@ CCGEdge *ccgSubSurf_getFaceEdge(CCGSubSurf *ss, CCGFace *f, int index) {
return FACE_getEdges(f)[index];
}
}
+int ccgSubSurf_getFaceEdgeIndex(CCGSubSurf *ss, CCGFace *f, CCGEdge *e) {
+ int i;
+
+ for (i=0; i<f->numVerts; i++)
+ if (FACE_getEdges(f)[i]==e)
+ return i;
+
+ return -1;
+}
void *ccgSubSurf_getFaceCenterData(CCGSubSurf *ss, CCGFace *f) {
return FACE_getCenterData(f);
}
diff --git a/source/blender/blenkernel/intern/CCGSubSurf.h b/source/blender/blenkernel/intern/CCGSubSurf.h
index 4c522b1a827..547580bca6e 100644
--- a/source/blender/blenkernel/intern/CCGSubSurf.h
+++ b/source/blender/blenkernel/intern/CCGSubSurf.h
@@ -108,6 +108,7 @@ CCGFaceHDL ccgSubSurf_getFaceFaceHandle (CCGSubSurf *ss, CCGFace *f);
int ccgSubSurf_getFaceNumVerts (CCGSubSurf *ss, CCGFace *f);
CCGVert* ccgSubSurf_getFaceVert (CCGSubSurf *ss, CCGFace *f, int index);
CCGEdge* ccgSubSurf_getFaceEdge (CCGSubSurf *ss, CCGFace *f, int index);
+int ccgSubSurf_getFaceEdgeIndex (CCGSubSurf *ss, CCGFace *f, CCGEdge *e);
int ccgSubSurf_getFaceAge (CCGSubSurf *ss, CCGFace *f);
void* ccgSubSurf_getFaceUserData (CCGSubSurf *ss, CCGFace *f);
diff --git a/source/blender/blenkernel/intern/DerivedMesh.c b/source/blender/blenkernel/intern/DerivedMesh.c
index 6ed73192d56..eda5e3ff485 100644
--- a/source/blender/blenkernel/intern/DerivedMesh.c
+++ b/source/blender/blenkernel/intern/DerivedMesh.c
@@ -163,6 +163,41 @@ static void meshDM_drawVerts(DerivedMesh *dm)
}
glEnd();
}
+static void meshDM_drawUVEdges(DerivedMesh *dm)
+{
+ MeshDerivedMesh *mdm = (MeshDerivedMesh*) dm;
+ Mesh *me = mdm->me;
+ int i;
+
+ if (me->tface) {
+ glBegin(GL_LINES);
+ for (i=0; i<me->totface; i++) {
+ if (me->mface[i].v3) {
+ TFace *tf = &me->tface[i];
+
+ if (!(tf->flag&TF_HIDE)) {
+ glVertex2fv(tf->uv[0]);
+ glVertex2fv(tf->uv[1]);
+
+ glVertex2fv(tf->uv[1]);
+ glVertex2fv(tf->uv[2]);
+
+ if (!me->mface[i].v4) {
+ glVertex2fv(tf->uv[2]);
+ glVertex2fv(tf->uv[0]);
+ } else {
+ glVertex2fv(tf->uv[2]);
+ glVertex2fv(tf->uv[3]);
+
+ glVertex2fv(tf->uv[3]);
+ glVertex2fv(tf->uv[0]);
+ }
+ }
+ }
+ }
+ glEnd();
+ }
+}
static void meshDM_drawEdges(DerivedMesh *dm, int drawLooseEdges)
{
MeshDerivedMesh *mdm = (MeshDerivedMesh*) dm;
@@ -220,30 +255,94 @@ static void meshDM_drawEdges(DerivedMesh *dm, int drawLooseEdges)
glEnd();
}
}
-static void meshDM_drawLooseEdges(DerivedMesh *dm)
+static void meshDM_drawEdgesFlag(DerivedMesh *dm, unsigned int mask, unsigned int value)
{
MeshDerivedMesh *mdm = (MeshDerivedMesh*) dm;
- Mesh *me = mdm->me;
- MFace *mface= me->mface;
- MEdge *medge= me->medge;
+ Mesh *me= mdm->me;
int a;
+ MFace *mface = me->mface;
+ int tfaceFlags = (ME_EDGE_TFSEL|ME_EDGE_TFACT|ME_EDGE_TFVISIBLE|ME_EDGE_TFACTFIRST|ME_EDGE_TFACTLAST);
+
+ if ((mask&tfaceFlags) && me->tface) {
+ TFace *tface = me->tface;
- if (medge) {
glBegin(GL_LINES);
- for(a=0; a<me->totedge; a++, medge++) {
- if ((medge->flag&ME_EDGEDRAW) && (medge->flag&ME_LOOSEEDGE)) {
- glVertex3fv(mdm->verts[medge->v1].co);
- glVertex3fv(mdm->verts[medge->v2].co);
+ for(a=0; a<me->totface; a++, mface++, tface++) {
+ if (mface->v3) {
+ unsigned int flags = ME_EDGEDRAW|ME_EDGEMAPPED;
+ unsigned int flag0, flag1, flag2, flag3;
+
+ if (tface->flag&TF_SELECT) flags |= ME_EDGE_TFSEL;
+ if (!(tface->flag&TF_HIDE)) flags |= ME_EDGE_TFVISIBLE;
+
+ if (tface->flag&TF_ACTIVE) {
+ flags |= ME_EDGE_TFACT;
+ flag0 = flag1 = flag2 = flag3 = flags;
+
+ flag0 |= ME_EDGE_TFACTFIRST;
+ flag3 |= ME_EDGE_TFACTLAST;
+ } else {
+ flag0 = flag1 = flag2 = flag3 = flags;
+ }
+
+ if (mask&ME_SEAM) {
+ if (tface->unwrap&TF_SEAM1) flag0 |= ME_SEAM;
+ if (tface->unwrap&TF_SEAM2) flag1 |= ME_SEAM;
+ if (tface->unwrap&TF_SEAM3) flag2 |= ME_SEAM;
+ if (tface->unwrap&TF_SEAM4) flag3 |= ME_SEAM;
+ }
+
+ if ((flag0&mask)==value) {
+ glVertex3fv(mdm->verts[mface->v1].co);
+ glVertex3fv(mdm->verts[mface->v2].co);
+ }
+
+ if ((flag1&mask)==value) {
+ glVertex3fv(mdm->verts[mface->v2].co);
+ glVertex3fv(mdm->verts[mface->v3].co);
+ }
+
+ if (mface->v4) {
+ if ((flag2&mask)==value) {
+ glVertex3fv(mdm->verts[mface->v3].co);
+ glVertex3fv(mdm->verts[mface->v4].co);
+ }
+
+ if ((flag3&mask)==value) {
+ glVertex3fv(mdm->verts[mface->v4].co);
+ glVertex3fv(mdm->verts[mface->v1].co);
+ }
+ } else {
+ if ((flag3&mask)==value) {
+ glVertex3fv(mdm->verts[mface->v3].co);
+ glVertex3fv(mdm->verts[mface->v1].co);
+ }
+ }
}
}
glEnd();
- } else {
+ }
+ else if(me->medge) {
+ MEdge *medge= me->medge;
+
+ glBegin(GL_LINES);
+ for(a=me->totedge; a>0; a--, medge++) {
+ if (((medge->flag|ME_EDGEMAPPED)&mask)==value) {
+ glVertex3fv(mdm->verts[ medge->v1].co);
+ glVertex3fv(mdm->verts[ medge->v2].co);
+ }
+ }
+ glEnd();
+ }
+ else {
glBegin(GL_LINES);
for(a=0; a<me->totface; a++, mface++) {
- if(!mface->v3) {
- glVertex3fv(mdm->verts[mface->v1].co);
- glVertex3fv(mdm->verts[mface->v2].co);
- }
+ if (!mface->v3) {
+ if (((ME_EDGEDRAW|ME_LOOSEEDGE|ME_EDGEMAPPED)&mask)==value) {
+ glVertex3fv(mdm->verts[mface->v1].co);
+ glVertex3fv(mdm->verts[mface->v2].co);
+ }
+ }
}
glEnd();
}
@@ -381,16 +480,20 @@ static void meshDM_drawFacesTex(DerivedMesh *dm, int (*setDrawParams)(TFace *tf,
for (a=0; a<me->totface; a++) {
MFace *mf= &mface[a];
TFace *tf = tface?&tface[a]:NULL;
+ int flag;
unsigned char *cp= NULL;
- if(mf->v3==0) continue;
- if(tf && ((tf->flag&TF_HIDE) || (tf->mode&TF_INVISIBLE))) continue;
+ if (mf->v3==0) continue;
+
+ flag = setDrawParams(tf, mf->mat_nr);
- if (setDrawParams(tf, mf->mat_nr)) {
+ if (flag==0) {
+ continue;
+ } else if (flag==1) {
if (tf) {
- cp= (unsigned char *) tf->col;
+ cp= (unsigned char*) tf->col;
} else if (me->mcol) {
- cp= (unsigned char *) &me->mcol[a*4];
+ cp= (unsigned char*) &me->mcol[a*4];
}
}
@@ -463,9 +566,10 @@ static DerivedMesh *getMeshDerivedMesh(Mesh *me, Object *ob, float (*vertCos)[3]
mdm->dm.drawVerts = meshDM_drawVerts;
+ mdm->dm.drawUVEdges = meshDM_drawUVEdges;
mdm->dm.drawEdges = meshDM_drawEdges;
- mdm->dm.drawLooseEdges = meshDM_drawLooseEdges;
-
+ mdm->dm.drawEdgesFlag = meshDM_drawEdgesFlag;
+
mdm->dm.drawFacesSolid = meshDM_drawFacesSolid;
mdm->dm.drawFacesColored = meshDM_drawFacesColored;
mdm->dm.drawFacesTex = meshDM_drawFacesTex;
@@ -989,38 +1093,73 @@ static void ssDM_drawMappedFacesEM(DerivedMesh *dm, int (*setDrawOptions)(void *
}
}
-static void ssDM_drawLooseEdges(DerivedMesh *dm)
+static void ssDM_drawVerts(DerivedMesh *dm)
{
SSDerivedMesh *ssdm = (SSDerivedMesh*) dm;
DispListMesh *dlm = ssdm->dlm;
+ MVert *mvert= dlm->mvert;
int i;
- if (dlm->medge) {
- MEdge *medge= dlm->medge;
-
+ bglBegin(GL_POINTS);
+ for (i=0; i<dlm->totvert; i++) {
+ bglVertex3fv(mvert[i].co);
+ }
+ bglEnd();
+}
+static void ssDM_drawUVEdges(DerivedMesh *dm)
+{
+ SSDerivedMesh *ssdm = (SSDerivedMesh*) dm;
+ DispListMesh *dlm = ssdm->dlm;
+ int i;
+
+ if (dlm->tface) {
glBegin(GL_LINES);
- for (i=0; i<dlm->totedge; i++, medge++) {
- if (medge->flag&ME_LOOSEEDGE) {
- glVertex3fv(dlm->mvert[medge->v1].co);
- glVertex3fv(dlm->mvert[medge->v2].co);
+ for (i=0; i<dlm->totface; i++) {
+ if (dlm->mface[i].v3) {
+ TFace *tf = &dlm->tface[i];
+
+ if (!(tf->flag&TF_HIDE)) {
+ glVertex2fv(tf->uv[0]);
+ glVertex2fv(tf->uv[1]);
+
+ glVertex2fv(tf->uv[1]);
+ glVertex2fv(tf->uv[2]);
+
+ if (!dlm->mface[i].v4) {
+ glVertex2fv(tf->uv[2]);
+ glVertex2fv(tf->uv[0]);
+ } else {
+ glVertex2fv(tf->uv[2]);
+ glVertex2fv(tf->uv[3]);
+
+ glVertex2fv(tf->uv[3]);
+ glVertex2fv(tf->uv[0]);
+ }
+ }
}
}
glEnd();
}
}
-
-static void ssDM_drawVerts(DerivedMesh *dm)
+static void ssDM_drawEdgesFlag(DerivedMesh *dm, unsigned int mask, unsigned int value)
{
SSDerivedMesh *ssdm = (SSDerivedMesh*) dm;
DispListMesh *dlm = ssdm->dlm;
- MVert *mvert= dlm->mvert;
+ MVert *mvert = dlm->mvert;
int i;
- bglBegin(GL_POINTS);
- for (i=0; i<dlm->totvert; i++) {
- bglVertex3fv(mvert[i].co);
+ if (dlm->medge) {
+ MEdge *medge= dlm->medge;
+
+ glBegin(GL_LINES);
+ for (i=0; i<dlm->totedge; i++, medge++) {
+ if ((medge->flag&mask)==value) {
+ glVertex3fv(mvert[medge->v1].co);
+ glVertex3fv(mvert[medge->v2].co);
+ }
+ }
+ glEnd();
}
- bglEnd();
}
static void ssDM_drawEdges(DerivedMesh *dm, int drawLooseEdges)
{
@@ -1181,12 +1320,16 @@ static void ssDM_drawFacesTex(DerivedMesh *dm, int (*setDrawParams)(TFace *tf, i
for (a=0; a<dlm->totface; a++) {
MFace *mf= &mface[a];
TFace *tf = tface?&tface[a]:NULL;
+ int flag;
unsigned char *cp= NULL;
- if(mf->v3==0) continue;
- if(tf && ((tf->flag&TF_HIDE) || (tf->mode&TF_INVISIBLE))) continue;
+ if (mf->v3==0) continue;
+
+ flag = setDrawParams(tf, mf->mat_nr);
- if (setDrawParams(tf, mf->mat_nr)) {
+ if (flag==0) {
+ continue;
+ } else if (flag==1) {
if (tf) {
cp= (unsigned char*) tf->col;
} else if (dlm->mcol) {
@@ -1320,9 +1463,10 @@ DerivedMesh *derivedmesh_from_displistmesh(DispListMesh *dlm, float (*vertexCos)
ssdm->dm.drawVerts = ssDM_drawVerts;
+ ssdm->dm.drawUVEdges = ssDM_drawUVEdges;
ssdm->dm.drawEdges = ssDM_drawEdges;
- ssdm->dm.drawLooseEdges = ssDM_drawLooseEdges;
-
+ ssdm->dm.drawEdgesFlag = ssDM_drawEdgesFlag;
+
ssdm->dm.drawFacesSolid = ssDM_drawFacesSolid;
ssdm->dm.drawFacesColored = ssDM_drawFacesColored;
ssdm->dm.drawFacesTex = ssDM_drawFacesTex;
diff --git a/source/blender/blenkernel/intern/subsurf_ccg.c b/source/blender/blenkernel/intern/subsurf_ccg.c
index c971bc8aa42..e16ade4b7cc 100644
--- a/source/blender/blenkernel/intern/subsurf_ccg.c
+++ b/source/blender/blenkernel/intern/subsurf_ccg.c
@@ -196,6 +196,59 @@ static int getFaceIndex(CCGSubSurf *ss, CCGFace *f, int S, int x, int y, int edg
return faceBase + 1 + (gridSize-2)*numVerts + S*(gridSize-2)*(gridSize-2) + (y-1)*(gridSize-2) + (x-1);
}
}
+
+static unsigned int ss_getEdgeFlags(CCGSubSurf *ss, CCGEdge *e, int ssFromEditmesh, MEdge *medge, TFace *tface)
+{
+ unsigned int flags = ME_EDGEDRAW|ME_EDGERENDER|ME_EDGEMAPPED;
+ int j, N = ccgSubSurf_getEdgeNumFaces(ss, e);
+
+ if (!N) flags |= ME_LOOSEEDGE;
+
+ if (ssFromEditmesh) {
+ EditEdge *eed = ccgSubSurf_getEdgeEdgeHandle(ss, e);
+
+ if (eed->seam) {
+ flags |= ME_SEAM;
+ }
+ } else {
+ int edgeIdx = (int) ccgSubSurf_getEdgeEdgeHandle(ss, e);
+
+ /* Edges created by lib have handle of -1 */
+ if (edgeIdx!=-1 && medge) {
+ MEdge *origMed = &medge[edgeIdx];
+
+ flags |= (origMed->flag&ME_SEAM);
+ }
+
+ if (tface) {
+ for (j=0; j<N; j++) {
+ CCGFace *f = ccgSubSurf_getEdgeFace(ss, e, j);
+ int origIdx = (int) ccgSubSurf_getFaceFaceHandle(ss, f);
+ TFace *tf = &tface[origIdx];
+
+ if (!(tf->flag&TF_HIDE)) flags |= ME_EDGE_TFVISIBLE;
+ if (tf->flag&TF_SELECT) flags |= ME_EDGE_TFSEL;
+
+ if (tf->flag&TF_ACTIVE) {
+ int fN = ccgSubSurf_getFaceNumVerts(ss, f);
+ int k = ccgSubSurf_getFaceEdgeIndex(ss, f, e);
+
+ flags |= ME_EDGE_TFACT;
+
+ if (k==0) {
+ flags |= ME_EDGE_TFACTFIRST;
+ }
+ else if (k==fN-1) {
+ flags |= ME_EDGE_TFACTLAST;
+ }
+ }
+ }
+ }
+ }
+
+ return flags;
+}
+
static DispListMesh *ss_to_displistmesh(CCGSubSurf *ss, CCGDerivedMesh *ccgdm, int ssFromEditmesh, int drawInteriorEdges, Mesh *inMe, DispListMesh *inDLM, EditVert ***vertMap_r, EditEdge ***edgeMap_r, EditFace ***faceMap_r) {
DispListMesh *dlm = MEM_callocN(sizeof(*dlm), "dlm");
int edgeSize = ccgSubSurf_getEdgeSize(ss);
@@ -314,30 +367,13 @@ static DispListMesh *ss_to_displistmesh(CCGSubSurf *ss, CCGDerivedMesh *ccgdm, i
ei = ccgSubSurf_getEdgeIterator(ss);
for (; !ccgEdgeIterator_isStopped(ei); ccgEdgeIterator_next(ei)) {
CCGEdge *e = ccgEdgeIterator_getCurrent(ei);
+ unsigned int flags = ss_getEdgeFlags(ss, e, ssFromEditmesh, medge, tface);
+
for (x=0; x<edgeSize-1; x++) {
MEdge *med = &dlm->medge[i];
med->v1 = getEdgeIndex(ss, e, x, edgeSize);
med->v2 = getEdgeIndex(ss, e, x+1, edgeSize);
- med->flag = ME_EDGEDRAW|ME_EDGERENDER;
-
- if (!ccgSubSurf_getEdgeNumFaces(ss, e)) med->flag |= ME_LOOSEEDGE;
-
- if (ssFromEditmesh) {
- EditEdge *eed = ccgSubSurf_getEdgeEdgeHandle(ss, e);
-
- if (eed->seam) {
- med->flag|= ME_SEAM;
- }
- } else {
- int edgeIdx = (int) ccgSubSurf_getEdgeEdgeHandle(ss, e);
-
- /* Edges created by lib have handle of -1 */
- if (edgeIdx!=-1 && medge) {
- MEdge *origMed = &medge[edgeIdx];
-
- med->flag|= (origMed->flag&ME_SEAM);
- }
- }
+ med->flag = flags;
if (edgeMap) {
edgeMap[i] = ccgDM_getEdgeHandle(ccgdm, e);
@@ -428,6 +464,16 @@ static DispListMesh *ss_to_displistmesh(CCGSubSurf *ss, CCGDerivedMesh *ccgdm, i
numDataComponents = 4;
}
+ for (S=0; S<numVerts; S++) {
+ for (k=0; k<numDataComponents; k++) {
+ edge_data[S][k] = (corner_data[S][k] + corner_data[(S+1)%numVerts][k])*0.5f;
+ center_data[k]+= corner_data[S][k];
+ }
+ }
+ for (k=0; k<numDataComponents; k++) {
+ center_data[k]/= numVerts;
+ }
+
mat_nr = origMFace->mat_nr;
flag = origMFace->flag;
} else {
@@ -437,16 +483,6 @@ static DispListMesh *ss_to_displistmesh(CCGSubSurf *ss, CCGDerivedMesh *ccgdm, i
}
for (S=0; S<numVerts; S++) {
- for (k=0; k<numDataComponents; k++) {
- edge_data[S][k] = (corner_data[S][k] + corner_data[(S+1)%numVerts][k])*0.5f;
- center_data[k]+= corner_data[S][k];
- }
- }
- for (k=0; k<numDataComponents; k++) {
- center_data[k]/= numVerts;
- }
-
- for (S=0; S<numVerts; S++) {
int prevS= (S-1+numVerts)%numVerts;
for (y=0; y<gridSize-1; y++) {
@@ -499,6 +535,7 @@ static DispListMesh *ss_to_displistmesh(CCGSubSurf *ss, CCGDerivedMesh *ccgdm, i
col[3] = (int) (data[3]*255);
}
}
+
if (dlm->tface) {
TFace *tf = &dlm->tface[i];
tf->tpage = origTFace->tpage;
@@ -917,18 +954,25 @@ static void ccgDM_drawEdges(DerivedMesh *dm, int drawLooseEdges) {
ccgFaceIterator_free(fi);
ccgEdgeIterator_free(ei);
}
-static void ccgDM_drawLooseEdges(DerivedMesh *dm) {
+static void ccgDM_drawEdgesFlag(DerivedMesh *dm, unsigned int mask, unsigned int value) {
CCGDerivedMesh *ccgdm = (CCGDerivedMesh*) dm;
CCGSubSurf *ss = ccgdm->ss;
CCGEdgeIterator *ei = ccgSubSurf_getEdgeIterator(ss);
int i, edgeSize = ccgSubSurf_getEdgeSize(ss);
+ MEdge *medge = NULL;
+ TFace *tface = NULL;
+
+ if (!ccgdm->fromEditmesh) {
+ medge = ccgdm->dlm?ccgdm->dlm->medge:ccgdm->me->medge;
+ tface = ccgdm->dlm?ccgdm->dlm->tface:ccgdm->me->tface;
+ }
for (; !ccgEdgeIterator_isStopped(ei); ccgEdgeIterator_next(ei)) {
CCGEdge *e = ccgEdgeIterator_getCurrent(ei);
+ VertData *edgeData = ccgSubSurf_getEdgeDataArray(ss, e);
+ unsigned int flags = ss_getEdgeFlags(ss, e, ccgdm->fromEditmesh, medge, tface);
- if (!ccgSubSurf_getEdgeNumFaces(ss, e)) {
- VertData *edgeData = ccgSubSurf_getEdgeDataArray(ss, e);
-
+ if ((flags&mask)==value) {
glBegin(GL_LINE_STRIP);
for (i=0; i<edgeSize-1; i++) {
glVertex3fv(edgeData[i].co);
@@ -940,7 +984,6 @@ static void ccgDM_drawLooseEdges(DerivedMesh *dm) {
ccgEdgeIterator_free(ei);
}
-
static void ccgDM_drawFacesSolid(DerivedMesh *dm, int (*setMaterial)(int)) {
CCGDerivedMesh *ccgdm = (CCGDerivedMesh*) dm;
CCGSubSurf *ss = ccgdm->ss;
@@ -1100,14 +1143,15 @@ static void ccgDM_drawFacesTex(DerivedMesh *dm, int (*setDrawParams)(TFace *tf,
MFace *mf = &mface[index];
TFace *tf = tface?&tface[index]:NULL;
unsigned char *cp= NULL;
-
- if(tf && ((tf->flag&TF_HIDE) || (tf->mode&TF_INVISIBLE))) continue;
+ int flag = setDrawParams(tf, mf->mat_nr);
- if (setDrawParams(tf, mf->mat_nr)) {
+ if (flag==0) {
+ continue;
+ } else if (flag==1) {
if (tf) {
- cp= (unsigned char *) tf->col;
+ cp= (unsigned char*) tf->col;
} else if (mcol) {
- cp= (unsigned char *) &mcol[index*4];
+ cp= (unsigned char*) &mcol[index*4];
}
}
@@ -1336,7 +1380,7 @@ static CCGDerivedMesh *getCCGDerivedMesh(CCGSubSurf *ss, int fromEditmesh, int d
ccgdm->dm.drawVerts = ccgDM_drawVerts;
ccgdm->dm.drawEdges = ccgDM_drawEdges;
- ccgdm->dm.drawLooseEdges = ccgDM_drawLooseEdges;
+ ccgdm->dm.drawEdgesFlag = ccgDM_drawEdgesFlag;
ccgdm->dm.drawFacesSolid = ccgDM_drawFacesSolid;
ccgdm->dm.drawFacesColored = ccgDM_drawFacesColored;
ccgdm->dm.drawFacesTex = ccgDM_drawFacesTex;
@@ -1434,6 +1478,7 @@ DerivedMesh *subsurf_make_derived_from_mesh(Mesh *me, DispListMesh *dlm, Subsurf
ss = _getSubSurf(NULL, smd->levels, 0, 1, useEdgeCreation, useSimple);
ss_sync_from_mesh(ss, me, dlm, vertCos, useSimple);
+
ndlm = ss_to_displistmesh(ss, NULL, 0, drawInteriorEdges, me, dlm, NULL, NULL, NULL);
if (dlm) displistmesh_free(dlm);