diff options
Diffstat (limited to 'source/blender/blenkernel/intern/subsurf_ccg.c')
-rw-r--r-- | source/blender/blenkernel/intern/subsurf_ccg.c | 176 |
1 files changed, 104 insertions, 72 deletions
diff --git a/source/blender/blenkernel/intern/subsurf_ccg.c b/source/blender/blenkernel/intern/subsurf_ccg.c index be8b572417e..d3ffde33f0d 100644 --- a/source/blender/blenkernel/intern/subsurf_ccg.c +++ b/source/blender/blenkernel/intern/subsurf_ccg.c @@ -50,8 +50,8 @@ #include "BLI_edgehash.h" #include "BLI_math.h" #include "BLI_memarena.h" -#include "BLI_pbvh.h" +#include "BKE_pbvh.h" #include "BKE_ccg.h" #include "BKE_cdderivedmesh.h" #include "BKE_global.h" @@ -295,7 +295,7 @@ static int ss_sync_from_uv(CCGSubSurf *ss, CCGSubSurf *origss, DerivedMesh *dm, float uv[3] = {0.0f, 0.0f, 0.0f}; /* only first 2 values are written into */ limit[0] = limit[1] = STD_UV_CONNECT_LIMIT; - vmap = BKE_mesh_uv_vert_map_make(mpoly, mloop, mloopuv, totface, totvert, 0, limit); + vmap = BKE_mesh_uv_vert_map_create(mpoly, mloop, mloopuv, totface, totvert, 0, limit); if (!vmap) return 0; @@ -1013,7 +1013,11 @@ static void ccgDM_getFinalFace(DerivedMesh *dm, int faceNum, MFace *mf) mf->flag = faceFlags[i].flag; mf->mat_nr = faceFlags[i].mat_nr; } - else mf->flag = ME_SMOOTH; + else { + mf->flag = ME_SMOOTH; +} + + mf->edcode = 0; } /* Translate GridHidden into the ME_HIDE flag for MVerts. Assumes @@ -1093,6 +1097,14 @@ void subsurf_copy_grid_paint_mask(DerivedMesh *dm, const MPoly *mpoly, } } +/* utility functon */ +BLI_INLINE void ccgDM_to_MVert(MVert *mv, const CCGKey *key, CCGElem *elem) +{ + copy_v3_v3(mv->co, CCG_elem_co(key, elem)); + normal_float_to_short_v3(mv->no, CCG_elem_no(key, elem)); + mv->flag = mv->bweight = 0; +} + static void ccgDM_copyFinalVertArray(DerivedMesh *dm, MVert *mvert) { CCGDerivedMesh *ccgdm = (CCGDerivedMesh *) dm; @@ -1103,7 +1115,7 @@ static void ccgDM_copyFinalVertArray(DerivedMesh *dm, MVert *mvert) int totvert, totedge, totface; int gridSize = ccgSubSurf_getGridSize(ss); int edgeSize = ccgSubSurf_getEdgeSize(ss); - int i = 0; + unsigned int i = 0; CCG_key_top_level(&key, ss); @@ -1113,24 +1125,20 @@ static void ccgDM_copyFinalVertArray(DerivedMesh *dm, MVert *mvert) int x, y, S, numVerts = ccgSubSurf_getFaceNumVerts(f); vd = ccgSubSurf_getFaceCenterData(f); - copy_v3_v3(mvert[i].co, CCG_elem_co(&key, vd)); - normal_float_to_short_v3(mvert[i].no, CCG_elem_no(&key, vd)); - i++; + ccgDM_to_MVert(&mvert[i++], &key, vd); for (S = 0; S < numVerts; S++) { - for (x = 1; x < gridSize - 1; x++, i++) { + for (x = 1; x < gridSize - 1; x++) { vd = ccgSubSurf_getFaceGridEdgeData(ss, f, S, x); - copy_v3_v3(mvert[i].co, CCG_elem_co(&key, vd)); - normal_float_to_short_v3(mvert[i].no, CCG_elem_no(&key, vd)); + ccgDM_to_MVert(&mvert[i++], &key, vd); } } for (S = 0; S < numVerts; S++) { for (y = 1; y < gridSize - 1; y++) { - for (x = 1; x < gridSize - 1; x++, i++) { + for (x = 1; x < gridSize - 1; x++) { vd = ccgSubSurf_getFaceGridData(ss, f, S, x, y); - copy_v3_v3(mvert[i].co, CCG_elem_co(&key, vd)); - normal_float_to_short_v3(mvert[i].no, CCG_elem_no(&key, vd)); + ccgDM_to_MVert(&mvert[i++], &key, vd); } } } @@ -1141,15 +1149,14 @@ static void ccgDM_copyFinalVertArray(DerivedMesh *dm, MVert *mvert) CCGEdge *e = ccgdm->edgeMap[index].edge; int x; - for (x = 1; x < edgeSize - 1; x++, i++) { - vd = ccgSubSurf_getEdgeData(ss, e, x); - copy_v3_v3(mvert[i].co, CCG_elem_co(&key, vd)); + for (x = 1; x < edgeSize - 1; x++) { /* This gives errors with -debug-fpe * the normals don't seem to be unit length. * this is most likely caused by edges with no * faces which are now zerod out, see comment in: * ccgSubSurf__calcVertNormals(), - campbell */ - normal_float_to_short_v3(mvert[i].no, CCG_elem_no(&key, vd)); + vd = ccgSubSurf_getEdgeData(ss, e, x); + ccgDM_to_MVert(&mvert[i++], &key, vd); } } @@ -1158,12 +1165,20 @@ static void ccgDM_copyFinalVertArray(DerivedMesh *dm, MVert *mvert) CCGVert *v = ccgdm->vertMap[index].vert; vd = ccgSubSurf_getVertData(ss, v); - copy_v3_v3(mvert[i].co, CCG_elem_co(&key, vd)); - normal_float_to_short_v3(mvert[i].no, CCG_elem_no(&key, vd)); - i++; + ccgDM_to_MVert(&mvert[i++], &key, vd); } } + +/* utility functon */ +BLI_INLINE void ccgDM_to_MEdge(MEdge *med, const int v1, const int v2, const short flag) +{ + med->v1 = v1; + med->v2 = v2; + med->crease = med->bweight = 0; + med->flag = flag; +} + static void ccgDM_copyFinalEdgeArray(DerivedMesh *dm, MEdge *medge) { CCGDerivedMesh *ccgdm = (CCGDerivedMesh *) dm; @@ -1172,8 +1187,9 @@ static void ccgDM_copyFinalEdgeArray(DerivedMesh *dm, MEdge *medge) int totedge, totface; int gridSize = ccgSubSurf_getGridSize(ss); int edgeSize = ccgSubSurf_getEdgeSize(ss); - int i = 0; + unsigned int i = 0; short *edgeFlags = ccgdm->edgeFlags; + const short ed_interior_flag = ccgdm->drawInteriorEdges ? (ME_EDGEDRAW | ME_EDGERENDER) : 0; totface = ccgSubSurf_getNumFaces(ss); for (index = 0; index < totface; index++) { @@ -1182,36 +1198,22 @@ static void ccgDM_copyFinalEdgeArray(DerivedMesh *dm, MEdge *medge) for (S = 0; S < numVerts; S++) { for (x = 0; x < gridSize - 1; x++) { - MEdge *med = &medge[i]; - - if (ccgdm->drawInteriorEdges) - med->flag = ME_EDGEDRAW | ME_EDGERENDER; - med->v1 = getFaceIndex(ss, f, S, x, 0, edgeSize, gridSize); - med->v2 = getFaceIndex(ss, f, S, x + 1, 0, edgeSize, gridSize); - i++; + ccgDM_to_MEdge(&medge[i++], + getFaceIndex(ss, f, S, x, 0, edgeSize, gridSize), + getFaceIndex(ss, f, S, x + 1, 0, edgeSize, gridSize), + ed_interior_flag); } for (x = 1; x < gridSize - 1; x++) { for (y = 0; y < gridSize - 1; y++) { - MEdge *med; - - med = &medge[i]; - if (ccgdm->drawInteriorEdges) - med->flag = ME_EDGEDRAW | ME_EDGERENDER; - med->v1 = getFaceIndex(ss, f, S, x, y, - edgeSize, gridSize); - med->v2 = getFaceIndex(ss, f, S, x, y + 1, - edgeSize, gridSize); - i++; - - med = &medge[i]; - if (ccgdm->drawInteriorEdges) - med->flag = ME_EDGEDRAW | ME_EDGERENDER; - med->v1 = getFaceIndex(ss, f, S, y, x, - edgeSize, gridSize); - med->v2 = getFaceIndex(ss, f, S, y + 1, x, - edgeSize, gridSize); - i++; + ccgDM_to_MEdge(&medge[i++], + getFaceIndex(ss, f, S, x, y, edgeSize, gridSize), + getFaceIndex(ss, f, S, x, y + 1, edgeSize, gridSize), + ed_interior_flag); + ccgDM_to_MEdge(&medge[i++], + getFaceIndex(ss, f, S, y, x, edgeSize, gridSize), + getFaceIndex(ss, f, S, y + 1, x, edgeSize, gridSize), + ed_interior_flag); } } } @@ -1220,27 +1222,28 @@ static void ccgDM_copyFinalEdgeArray(DerivedMesh *dm, MEdge *medge) totedge = ccgSubSurf_getNumEdges(ss); for (index = 0; index < totedge; index++) { CCGEdge *e = ccgdm->edgeMap[index].edge; - unsigned int flags = 0; + short ed_flag = 0; int x; int edgeIdx = GET_INT_FROM_POINTER(ccgSubSurf_getEdgeEdgeHandle(e)); - if (!ccgSubSurf_getEdgeNumFaces(e)) flags |= ME_LOOSEEDGE; + if (!ccgSubSurf_getEdgeNumFaces(e)) { + ed_flag |= ME_LOOSEEDGE; + } if (edgeFlags) { if (edgeIdx != -1) { - flags |= ((edgeFlags[index] & (ME_SEAM | ME_SHARP)) | ME_EDGEDRAW | ME_EDGERENDER); + ed_flag |= ((edgeFlags[index] & (ME_SEAM | ME_SHARP)) | ME_EDGEDRAW | ME_EDGERENDER); } } else { - flags |= ME_EDGEDRAW | ME_EDGERENDER; + ed_flag |= ME_EDGEDRAW | ME_EDGERENDER; } for (x = 0; x < edgeSize - 1; x++) { - MEdge *med = &medge[i]; - med->v1 = getEdgeIndex(ss, e, x, edgeSize); - med->v2 = getEdgeIndex(ss, e, x + 1, edgeSize); - med->flag = flags; - i++; + ccgDM_to_MEdge(&medge[i++], + getEdgeIndex(ss, e, x, edgeSize), + getEdgeIndex(ss, e, x + 1, edgeSize), + ed_flag); } } } @@ -1278,6 +1281,7 @@ static void ccgDM_copyFinalFaceArray(DerivedMesh *dm, MFace *mface) edgeSize, gridSize); mf->mat_nr = mat_nr; mf->flag = flag; + mf->edcode = 0; i++; } @@ -1314,8 +1318,8 @@ static void ccgDM_copyFinalLoopArray(DerivedMesh *dm, MLoop *mloop) for (index = 0; index < totface; index++) { CCGFace *f = ccgdm->faceMap[index].face; int x, y, S, numVerts = ccgSubSurf_getFaceNumVerts(f); - /* int flag = (faceFlags)? faceFlags[index*2]: ME_SMOOTH; */ /* UNUSED */ - /* int mat_nr = (faceFlags)? faceFlags[index*2+1]: 0; */ /* UNUSED */ + /* int flag = (faceFlags) ? faceFlags[index * 2]: ME_SMOOTH; */ /* UNUSED */ + /* int mat_nr = (faceFlags) ? faceFlags[index * 2 + 1]: 0; */ /* UNUSED */ for (S = 0; S < numVerts; S++) { for (y = 0; y < gridSize - 1; y++) { @@ -1569,7 +1573,7 @@ static void ccgdm_pbvh_update(CCGDerivedMesh *ccgdm) CCGFace **faces; int totface; - BLI_pbvh_get_grid_updates(ccgdm->pbvh, 1, (void ***)&faces, &totface); + BKE_pbvh_get_grid_updates(ccgdm->pbvh, 1, (void ***)&faces, &totface); if (totface) { ccgSubSurf_updateFromFaces(ccgdm->ss, 0, faces, totface); ccgSubSurf_updateNormals(ccgdm->ss, faces, totface); @@ -1707,7 +1711,8 @@ static void ccgDM_drawFacesSolid(DerivedMesh *dm, float (*partial_redraw_planes) if (ccgdm->pbvh && ccgdm->multires.mmd && !fast) { if (dm->numTessFaceData) { - BLI_pbvh_draw(ccgdm->pbvh, partial_redraw_planes, NULL, setMaterial); + BKE_pbvh_draw(ccgdm->pbvh, partial_redraw_planes, NULL, + setMaterial, FALSE); glShadeModel(GL_FLAT); } @@ -2980,7 +2985,7 @@ static const MeshElemMap *ccgDM_getPolyMap(Object *ob, DerivedMesh *dm) if (!ccgdm->multires.mmd && !ccgdm->pmap && ob->type == OB_MESH) { Mesh *me = ob->data; - create_vert_poly_map(&ccgdm->pmap, &ccgdm->pmap_mem, + BKE_mesh_vert_poly_map_create(&ccgdm->pmap, &ccgdm->pmap_mem, me->mpoly, me->mloop, me->totvert, me->totpoly, me->totloop); } @@ -3025,7 +3030,7 @@ static struct PBVH *ccgDM_getPBVH(Object *ob, DerivedMesh *dm) * when the ccgdm gets remade, the assumption is that the topology * does not change. */ ccgdm_create_grids(dm); - BLI_pbvh_grids_update(ob->sculpt->pbvh, ccgdm->gridData, ccgdm->gridAdjacency, (void **)ccgdm->gridFaces, + BKE_pbvh_grids_update(ob->sculpt->pbvh, ccgdm->gridData, ccgdm->gridAdjacency, (void **)ccgdm->gridFaces, ccgdm->gridFlagMats, ccgdm->gridHidden); } @@ -3043,15 +3048,15 @@ static struct PBVH *ccgDM_getPBVH(Object *ob, DerivedMesh *dm) numGrids = ccgDM_getNumGrids(dm); - ob->sculpt->pbvh = ccgdm->pbvh = BLI_pbvh_new(); - BLI_pbvh_build_grids(ccgdm->pbvh, ccgdm->gridData, ccgdm->gridAdjacency, + ob->sculpt->pbvh = ccgdm->pbvh = BKE_pbvh_new(); + BKE_pbvh_build_grids(ccgdm->pbvh, ccgdm->gridData, ccgdm->gridAdjacency, numGrids, &key, (void **) ccgdm->gridFaces, ccgdm->gridFlagMats, ccgdm->gridHidden); } else if (ob->type == OB_MESH) { Mesh *me = ob->data; - ob->sculpt->pbvh = ccgdm->pbvh = BLI_pbvh_new(); + ob->sculpt->pbvh = ccgdm->pbvh = BKE_pbvh_new(); BLI_assert(!(me->mface == NULL && me->mpoly != NULL)); /* BMESH ONLY complain if mpoly is valid but not mface */ - BLI_pbvh_build_mesh(ccgdm->pbvh, me->mface, me->mvert, + BKE_pbvh_build_mesh(ccgdm->pbvh, me->mface, me->mvert, me->totface, me->totvert, &me->vdata); } @@ -3098,12 +3103,15 @@ static CCGDerivedMesh *getCCGDerivedMesh(CCGSubSurf *ss, int numTex, numCol; int hasPCol, hasOrigSpace; int gridInternalEdges; - float *w = NULL; WeightTable wtable = {0}; /* MCol *mcol; */ /* UNUSED */ 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), @@ -3278,6 +3286,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++) { @@ -3286,7 +3306,7 @@ static CCGDerivedMesh *getCCGDerivedMesh(CCGSubSurf *ss, int numFinalEdges = numVerts * (gridSideEdges + gridInternalEdges); int origIndex = GET_INT_FROM_POINTER(ccgSubSurf_getFaceFaceHandle(f)); int g2_wid = gridCuts + 2; - float *w2; + float *w, *w2; int s, x, y; w = get_ss_weights(&wtable, gridCuts, numVerts); @@ -3299,8 +3319,6 @@ static CCGDerivedMesh *getCCGDerivedMesh(CCGSubSurf *ss, faceFlags->mat_nr = mpoly ? mpoly[origIndex].mat_nr : 0; faceFlags++; - origIndex = base_polyOrigIndex ? base_polyOrigIndex[origIndex] : origIndex; - /* set the face base vert */ *((int *)ccgSubSurf_getFaceUserData(ss, f)) = vertNum; @@ -3319,7 +3337,7 @@ static CCGDerivedMesh *getCCGDerivedMesh(CCGSubSurf *ss, /*I think this is for interpolating the center vert?*/ - w2 = w; // + numVerts*(g2_wid-1)*(g2_wid-1); //numVerts*((g2_wid-1)*g2_wid+g2_wid-1); + w2 = w; // + numVerts*(g2_wid-1) * (g2_wid-1); //numVerts*((g2_wid-1) * g2_wid+g2_wid-1); DM_interp_vert_data(dm, &ccgdm->dm, vertidx, w2, numVerts, vertNum); if (vertOrigIndex) { @@ -3408,7 +3426,7 @@ static CCGDerivedMesh *getCCGDerivedMesh(CCGSubSurf *ss, faceOrigIndex++; } if (polyOrigIndex) { - *polyOrigIndex = origIndex; + *polyOrigIndex = base_polyOrigIndex ? base_polyOrigIndex[origIndex] : origIndex; polyOrigIndex++; } @@ -3417,6 +3435,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++; } } @@ -3466,6 +3490,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; } |