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:
authorBen Batt <benbatt@gmail.com>2006-12-07 21:30:00 +0300
committerBen Batt <benbatt@gmail.com>2006-12-07 21:30:00 +0300
commitc3fdaac9b41c317d4806c67b30ffff7177050546 (patch)
tree1ff4aa3afaf9fa5182cc34036547196c4c08d1ee /source/blender/blenkernel/intern/subsurf_ccg.c
parentaae544e9f4779d91bf176db8fa37a910a25a88c6 (diff)
Fix for bug #5177: EdgeSplit modifier mode "From Flag" doesn't show sharp
edges in Editmode This bug was due to CCGDerivedMesh (the DerivedMesh backend used to store editmode subsurf results) not copying edge flags correctly, meaning that they were unavailable to the EdgeSplit modifier. I have updated CCGDerivedMesh to copy edge flags correctly.
Diffstat (limited to 'source/blender/blenkernel/intern/subsurf_ccg.c')
-rw-r--r--source/blender/blenkernel/intern/subsurf_ccg.c28
1 files changed, 23 insertions, 5 deletions
diff --git a/source/blender/blenkernel/intern/subsurf_ccg.c b/source/blender/blenkernel/intern/subsurf_ccg.c
index 5f7b656d45a..d44a0a2901f 100644
--- a/source/blender/blenkernel/intern/subsurf_ccg.c
+++ b/source/blender/blenkernel/intern/subsurf_ccg.c
@@ -1123,7 +1123,12 @@ static void ccgDM_getFinalEdge(DerivedMesh *dm, int edgeNum, MEdge *med)
| ME_EDGEDRAW | ME_EDGERENDER;
}
} else {
- flags |= ME_EDGEDRAW | ME_EDGERENDER;
+ int *edgeFlag = dm->getEdgeData(dm, edgeNum, CD_FLAGS);
+ if(edgeFlag)
+ flags |= (*edgeFlag & (ME_SEAM | ME_SHARP))
+ | ME_EDGEDRAW | ME_EDGERENDER;
+ else
+ flags |= ME_EDGEDRAW | ME_EDGERENDER;
}
med->flag = flags;
@@ -1235,6 +1240,7 @@ static void ccgDM_copyFinalEdgeArray(DerivedMesh *dm, MEdge *medge)
int edgeSize = ccgSubSurf_getEdgeSize(ss);
int i = 0;
MEdge *origEdges = NULL;
+ int *edgeFlags = dm->getEdgeDataArray(dm, CD_FLAGS);
if(ccgdm->me) origEdges = ccgdm->me->medge;
@@ -1285,18 +1291,22 @@ static void ccgDM_copyFinalEdgeArray(DerivedMesh *dm, MEdge *medge)
CCGEdge *e = ccgdm->edgeMap[index].edge;
unsigned int flags = 0;
int x;
+ int edgeIdx = (int)ccgSubSurf_getEdgeEdgeHandle(ss, e);
if(!ccgSubSurf_getEdgeNumFaces(ss, e)) flags |= ME_LOOSEEDGE;
if(origEdges){
- int edgeIdx = (int)ccgSubSurf_getEdgeEdgeHandle(ss, e);
-
if(edgeIdx != -1) {
MEdge *origMed = &origEdges[edgeIdx];
flags |= (origMed->flag & (ME_SEAM | ME_SHARP))
| ME_EDGEDRAW | ME_EDGERENDER;
}
+ } else if(edgeFlags) {
+ if(edgeIdx != -1) {
+ flags |= (edgeFlags[i] & (ME_SEAM | ME_SHARP))
+ | ME_EDGEDRAW | ME_EDGERENDER;
+ }
} else {
flags |= ME_EDGEDRAW | ME_EDGERENDER;
}
@@ -2039,7 +2049,7 @@ static CCGDerivedMesh *getCCGDerivedMesh(CCGSubSurf *ss,
int i;
int vertNum, edgeNum, faceNum;
int *vertOrigIndex, *edgeOrigIndex, *faceOrigIndex;
- int *faceFlags;
+ int *faceFlags, *edgeFlags;
int edgeSize;
int gridSize;
int gridFaces;
@@ -2061,6 +2071,7 @@ static CCGDerivedMesh *getCCGDerivedMesh(CCGSubSurf *ss,
ccgSubSurf_getNumFinalFaces(ss));
tface = dm->getFaceDataArray(dm, CD_MTFACE);
DM_add_face_layer(&ccgdm->dm, CD_FLAGS, CD_FLAG_NOCOPY, NULL);
+ DM_add_edge_layer(&ccgdm->dm, CD_FLAGS, CD_FLAG_NOCOPY, NULL);
} else {
DM_init(&ccgdm->dm, ccgSubSurf_getNumFinalVerts(ss),
ccgSubSurf_getNumFinalEdges(ss),
@@ -2321,12 +2332,15 @@ static CCGDerivedMesh *getCCGDerivedMesh(CCGSubSurf *ss,
MEM_freeN(faceMap2Uv);
}
+ edgeFlags = DM_get_edge_data_layer(&ccgdm->dm, CD_FLAGS);
+
for(index = 0; index < totedge; ++index) {
CCGEdge *e = ccgdm->edgeMap[index].edge;
int numFinalEdges = edgeSize - 1;
int mapIndex = ccgDM_getEdgeMapIndex(ccgdm, ss, e);
int x;
int vertIdx[2];
+ int edgeIdx = (int)ccgSubSurf_getEdgeEdgeHandle(ss, e);
CCGVert *v;
v = ccgSubSurf_getEdgeVert0(ss, e);
@@ -2350,9 +2364,13 @@ static CCGDerivedMesh *getCCGDerivedMesh(CCGSubSurf *ss,
++vertNum;
}
- for(i = 0; i < numFinalEdges; ++i)
+ for(i = 0; i < numFinalEdges; ++i) {
+ if(edgeIdx >= 0 && edgeFlags)
+ edgeFlags[edgeNum + i] = medge[edgeIdx].flag;
+
*(int *)DM_get_edge_data(&ccgdm->dm, edgeNum + i,
CD_ORIGINDEX) = mapIndex;
+ }
edgeNum += numFinalEdges;
}