diff options
author | Tamito Kajiyama <rd6t-kjym@asahi-net.or.jp> | 2013-03-13 10:44:43 +0400 |
---|---|---|
committer | Tamito Kajiyama <rd6t-kjym@asahi-net.or.jp> | 2013-03-13 10:44:43 +0400 |
commit | 894c240f9d007271e9d587d3c1b6f961c445b1b8 (patch) | |
tree | 369079e17a0c80a5b39e323a67045ca397849491 /source/blender/blenkernel/intern | |
parent | 2d801f2bec3c4de663f33b0f0f198a12f09ef989 (diff) |
New implementation of Freestyle edge/face marks
The previous implementation of Freestyle edge/face marks was refactored
based on suggestions from the latest code review by Campbell. The new
implementation relies on mesh CustomData to store edge/face marks, instead
of introducing extra flags in the core Mesh and BMesh data structures.
The CustomData-based implementation will allow further additions of new
edge/face attributes because of the independence from Mesh/BMesh.
This revision is work in progress, mainly intended to address the review
comments and ask for further code review in view of the trunk merger in
the upcoming 2.67 release.
Diffstat (limited to 'source/blender/blenkernel/intern')
-rw-r--r-- | source/blender/blenkernel/intern/customdata.c | 15 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/subsurf_ccg.c | 38 |
2 files changed, 40 insertions, 13 deletions
diff --git a/source/blender/blenkernel/intern/customdata.c b/source/blender/blenkernel/intern/customdata.c index 580a69466c9..48d7ae1de86 100644 --- a/source/blender/blenkernel/intern/customdata.c +++ b/source/blender/blenkernel/intern/customdata.c @@ -1143,7 +1143,11 @@ static const LayerTypeInfo LAYERTYPEINFO[CD_NUMTYPES] = { layerFree_grid_paint_mask, NULL, NULL, NULL}, /* 36: CD_SKIN_NODE */ {sizeof(MVertSkin), "MVertSkin", 1, NULL, NULL, NULL, - layerInterp_mvert_skin, NULL, layerDefault_mvert_skin} + layerInterp_mvert_skin, NULL, layerDefault_mvert_skin}, + /* 37: CD_FREESTYLE_EDGE */ + {sizeof(FreestyleEdge), "FreestyleEdge", 1, NULL, NULL, NULL, NULL, NULL, NULL}, + /* 38: CD_FREESTYLE_FACE */ + {sizeof(FreestyleFace), "FreestyleFace", 1, NULL, NULL, NULL, NULL, NULL, NULL} }; /* note, numbers are from trunk and need updating for bmesh */ @@ -1158,7 +1162,8 @@ static const char *LAYERTYPENAMES[CD_NUMTYPES] = { /* BMESH ONLY */ /* 25-29 */ "CDMPoly", "CDMLoop", "CDShapeKeyIndex", "CDShapeKey", "CDBevelWeight", /* 30-34 */ "CDSubSurfCrease", "CDOrigSpaceLoop", "CDPreviewLoopCol", "CDBMElemPyPtr", "CDPaintMask", - /* 35-36 */ "CDGridPaintMask", "CDMVertSkin" + /* 35-36 */ "CDGridPaintMask", "CDMVertSkin", + /* 37-38 */ "CDFreestyleEdge", "CDFreestyleFace" }; @@ -1170,7 +1175,7 @@ const CustomDataMask CD_MASK_MESH = CD_MASK_PROP_FLT | CD_MASK_PROP_INT | CD_MASK_PROP_STR | CD_MASK_MDISPS | CD_MASK_MLOOPUV | CD_MASK_MLOOPCOL | CD_MASK_MPOLY | CD_MASK_MLOOP | CD_MASK_MTEXPOLY | CD_MASK_NORMAL | CD_MASK_RECAST | CD_MASK_PAINT_MASK | - CD_MASK_GRID_PAINT_MASK | CD_MASK_MVERT_SKIN; + CD_MASK_GRID_PAINT_MASK | CD_MASK_MVERT_SKIN | CD_MASK_FREESTYLE_EDGE | CD_MASK_FREESTYLE_FACE; const CustomDataMask CD_MASK_EDITMESH = CD_MASK_MSTICKY | CD_MASK_MDEFORMVERT | CD_MASK_MTFACE | CD_MASK_MLOOPUV | CD_MASK_MLOOPCOL | CD_MASK_MTEXPOLY | CD_MASK_SHAPE_KEYINDEX | @@ -1183,13 +1188,13 @@ const CustomDataMask CD_MASK_DERIVEDMESH = CD_MASK_MLOOPUV | CD_MASK_MLOOPCOL | CD_MASK_MTEXPOLY | CD_MASK_PREVIEW_MLOOPCOL | CD_MASK_PROP_STR | CD_MASK_ORIGSPACE | CD_MASK_ORIGSPACE_MLOOP | CD_MASK_ORCO | CD_MASK_TANGENT | CD_MASK_PREVIEW_MCOL | CD_MASK_NORMAL | CD_MASK_SHAPEKEY | CD_MASK_RECAST | - CD_MASK_ORIGINDEX | CD_MASK_MVERT_SKIN; + CD_MASK_ORIGINDEX | CD_MASK_MVERT_SKIN | CD_MASK_FREESTYLE_EDGE | CD_MASK_FREESTYLE_FACE; const CustomDataMask CD_MASK_BMESH = CD_MASK_MLOOPUV | CD_MASK_MLOOPCOL | CD_MASK_MTEXPOLY | CD_MASK_MSTICKY | CD_MASK_MDEFORMVERT | CD_MASK_PROP_FLT | CD_MASK_PROP_INT | CD_MASK_PROP_STR | CD_MASK_SHAPEKEY | CD_MASK_SHAPE_KEYINDEX | CD_MASK_MDISPS | CD_MASK_CREASE | CD_MASK_BWEIGHT | CD_MASK_RECAST | CD_MASK_PAINT_MASK | - CD_MASK_GRID_PAINT_MASK | CD_MASK_MVERT_SKIN; + CD_MASK_GRID_PAINT_MASK | CD_MASK_MVERT_SKIN | CD_MASK_FREESTYLE_EDGE | CD_MASK_FREESTYLE_FACE; const CustomDataMask CD_MASK_FACECORNERS = CD_MASK_MTFACE | CD_MASK_MCOL | CD_MASK_MTEXPOLY | CD_MASK_MLOOPUV | CD_MASK_MLOOPCOL; diff --git a/source/blender/blenkernel/intern/subsurf_ccg.c b/source/blender/blenkernel/intern/subsurf_ccg.c index 0d0944d6ea7..3c90da60103 100644 --- a/source/blender/blenkernel/intern/subsurf_ccg.c +++ b/source/blender/blenkernel/intern/subsurf_ccg.c @@ -964,11 +964,7 @@ static void ccgDM_getFinalEdge(DerivedMesh *dm, int edgeNum, MEdge *med) edgeFlag = (ccgdm->edgeFlags) ? &ccgdm->edgeFlags[i] : NULL; if (edgeFlag) -#ifdef WITH_FREESTYLE - flags |= (*edgeFlag & (ME_SEAM | ME_SHARP | ME_FREESTYLE_EDGE)) | ME_EDGEDRAW | ME_EDGERENDER; -#else flags |= (*edgeFlag & (ME_SEAM | ME_SHARP)) | ME_EDGEDRAW | ME_EDGERENDER; -#endif else flags |= ME_EDGEDRAW | ME_EDGERENDER; @@ -1236,11 +1232,7 @@ static void ccgDM_copyFinalEdgeArray(DerivedMesh *dm, MEdge *medge) if (edgeFlags) { if (edgeIdx != -1) { -#ifdef WITH_FREESTYLE - ed_flag |= ((edgeFlags[index] & (ME_SEAM | ME_SHARP | ME_FREESTYLE_EDGE)) | ME_EDGEDRAW | ME_EDGERENDER); -#else ed_flag |= ((edgeFlags[index] & (ME_SEAM | ME_SHARP)) | ME_EDGEDRAW | ME_EDGERENDER); -#endif } } else { @@ -3117,6 +3109,10 @@ static CCGDerivedMesh *getCCGDerivedMesh(CCGSubSurf *ss, MEdge *medge = NULL; /* MFace *mface = NULL; */ MPoly *mpoly = NULL; +#ifdef WITH_FREESTYLE + FreestyleEdge *fed = NULL, *ccgdm_fed = NULL; + FreestyleFace *ffa = NULL, *ccgdm_ffa = NULL; +#endif DM_from_template(&ccgdm->dm, dm, DM_TYPE_CCGDM, ccgSubSurf_getNumFinalVerts(ss), @@ -3291,6 +3287,18 @@ static CCGDerivedMesh *getCCGDerivedMesh(CCGSubSurf *ss, has_edge_origindex = CustomData_has_layer(&ccgdm->dm.edgeData, CD_ORIGINDEX); +#ifdef WITH_FREESTYLE + fed = DM_get_edge_data_layer(dm, CD_FREESTYLE_EDGE); + if (fed) { + ccgdm_fed = CustomData_add_layer(&ccgdm->dm.edgeData, CD_FREESTYLE_EDGE, CD_CALLOC, NULL, + ccgSubSurf_getNumFinalEdges(ss)); + } + ffa = DM_get_poly_data_layer(dm, CD_FREESTYLE_FACE); + if (ffa) { + ccgdm_ffa = CustomData_add_layer(&ccgdm->dm.faceData, CD_FREESTYLE_FACE, CD_CALLOC, NULL, + ccgSubSurf_getNumFinalFaces(ss)); + } +#endif loopindex = loopindex2 = 0; /* current loop index */ for (index = 0; index < totface; index++) { @@ -3430,6 +3438,12 @@ static CCGDerivedMesh *getCCGDerivedMesh(CCGSubSurf *ss, /* This is a simple one to one mapping, here... */ polyidx[faceNum] = faceNum; +#ifdef WITH_FREESTYLE + if (ffa && ffa[index].flag & FREESTYLE_FACE_MARK) { + ccgdm_ffa[faceNum].flag |= FREESTYLE_FACE_MARK; + } +#endif + faceNum++; } } @@ -3479,6 +3493,14 @@ static CCGDerivedMesh *getCCGDerivedMesh(CCGSubSurf *ss, } } +#ifdef WITH_FREESTYLE + if (fed && fed[index].flag & FREESTYLE_EDGE_MARK) { + for (i = 0; i < numFinalEdges; ++i) { + ccgdm_fed[edgeNum + i].flag |= FREESTYLE_EDGE_MARK; + } + } +#endif + edgeNum += numFinalEdges; } |