diff options
author | Nicholas Bishop <nicholasbishop@gmail.com> | 2010-10-25 06:58:32 +0400 |
---|---|---|
committer | Nicholas Bishop <nicholasbishop@gmail.com> | 2010-10-25 06:58:32 +0400 |
commit | acef2ca4c5cc1dcdff0edc7af79f8772186a2c3d (patch) | |
tree | cd486f450bcbb754910c66f3a4998fe1d6100688 | |
parent | 2882c4b6efdadf935f14fb920a38e7ff2f5db55d (diff) |
Closing #24367 (Incorrect behaviour for Optimal Display option) and reopening #22634 (sculpting/multires and wireframe display mode glitches)
* Reverting my earlier changes to subsurf edge drawing; seems to be causing more bugs than the minor bug it fixed.
-rw-r--r-- | source/blender/blenkernel/intern/subsurf_ccg.c | 85 |
1 files changed, 41 insertions, 44 deletions
diff --git a/source/blender/blenkernel/intern/subsurf_ccg.c b/source/blender/blenkernel/intern/subsurf_ccg.c index 51cee333370..26bd981db4a 100644 --- a/source/blender/blenkernel/intern/subsurf_ccg.c +++ b/source/blender/blenkernel/intern/subsurf_ccg.c @@ -1146,74 +1146,71 @@ static void ccgDM_drawVerts(DerivedMesh *dm) { ccgFaceIterator_free(fi); glEnd(); } - static void ccgDM_drawEdges(DerivedMesh *dm, int drawLooseEdges, int UNUSED(drawAllEdges)) { CCGDerivedMesh *ccgdm = (CCGDerivedMesh*) dm; CCGSubSurf *ss = ccgdm->ss; - CCGFaceIterator *fi = ccgSubSurf_getFaceIterator(ss); CCGEdgeIterator *ei = ccgSubSurf_getEdgeIterator(ss); + CCGFaceIterator *fi = ccgSubSurf_getFaceIterator(ss); + int i, edgeSize = ccgSubSurf_getEdgeSize(ss); int gridSize = ccgSubSurf_getGridSize(ss); - int edgeSize = ccgSubSurf_getEdgeSize(ss); - int step; int useAging; ccgSubSurf_getUseAgeCounts(ss, &useAging, NULL, NULL, NULL); - /* nothing to do */ - if(!drawLooseEdges && !ccgdm->drawInteriorEdges) - return; + for (; !ccgEdgeIterator_isStopped(ei); ccgEdgeIterator_next(ei)) { + CCGEdge *e = ccgEdgeIterator_getCurrent(ei); + DMGridData *edgeData = ccgSubSurf_getEdgeDataArray(ss, e); + + if (!drawLooseEdges && !ccgSubSurf_getEdgeNumFaces(e)) + continue; + + if (useAging && !(G.f&G_BACKBUFSEL)) { + int ageCol = 255-ccgSubSurf_getEdgeAge(ss, e)*4; + glColor3ub(0, ageCol>0?ageCol:0, 0); + } + + glBegin(GL_LINE_STRIP); + for (i=0; i<edgeSize-1; i++) { + glVertex3fv(edgeData[i].co); + glVertex3fv(edgeData[i+1].co); + } + glEnd(); + } if (useAging && !(G.f&G_BACKBUFSEL)) { glColor3ub(0, 0, 0); } - if(ccgdm->drawInteriorEdges) - step = 1; - else - step = gridSize - 1; + if (ccgdm->drawInteriorEdges) { + for (; !ccgFaceIterator_isStopped(fi); ccgFaceIterator_next(fi)) { + CCGFace *f = ccgFaceIterator_getCurrent(fi); + int S, x, y, numVerts = ccgSubSurf_getFaceNumVerts(f); - /* draw edges using face grids */ - for (; !ccgFaceIterator_isStopped(fi); ccgFaceIterator_next(fi)) { - CCGFace *f = ccgFaceIterator_getCurrent(fi); - int S, x, y, numVerts = ccgSubSurf_getFaceNumVerts(f); + for (S=0; S<numVerts; S++) { + DMGridData *faceGridData = ccgSubSurf_getFaceGridDataArray(ss, f, S); - for (S=0; S<numVerts; S++) { - DMGridData *faceGridData = ccgSubSurf_getFaceGridDataArray(ss, f, S); - - for (y=0; y<gridSize; y+=step) { glBegin(GL_LINE_STRIP); for (x=0; x<gridSize; x++) - glVertex3fv(faceGridData[y*gridSize + x].co); - glEnd(); - } - for (x=0; x<gridSize; x+=step) { - glBegin(GL_LINE_STRIP); - for (y=0; y<gridSize; y++) - glVertex3fv(faceGridData[y*gridSize + x].co); + glVertex3fv(faceGridData[x].co); glEnd(); + for (y=1; y<gridSize-1; y++) { + glBegin(GL_LINE_STRIP); + for (x=0; x<gridSize; x++) + glVertex3fv(faceGridData[y*gridSize + x].co); + glEnd(); + } + for (x=1; x<gridSize-1; x++) { + glBegin(GL_LINE_STRIP); + for (y=0; y<gridSize; y++) + glVertex3fv(faceGridData[y*gridSize + x].co); + glEnd(); + } } } } - /* draw edges with no adjacent face */ - if(!drawLooseEdges) return; - for(; !ccgEdgeIterator_isStopped(ei); ccgEdgeIterator_next(ei)) { - CCGEdge *e = ccgEdgeIterator_getCurrent(ei); - - if(!ccgSubSurf_getEdgeNumFaces(e)) { - DMGridData *edgeData = ccgSubSurf_getEdgeDataArray(ss, e); - int i; - - glBegin(GL_LINE_STRIP); - for (i=0; i<edgeSize-1; i++) { - glVertex3fv(edgeData[i].co); - glVertex3fv(edgeData[i+1].co); - } - glEnd(); - } - } - ccgFaceIterator_free(fi); + ccgEdgeIterator_free(ei); } static void ccgDM_drawLooseEdges(DerivedMesh *dm) { CCGDerivedMesh *ccgdm = (CCGDerivedMesh*) dm; |