diff --git a/source/blender/blenkernel/intern/cdderivedmesh.c b/source/blender/blenkernel/intern/cdderivedmesh.c index 3ea09a40ef5..f17e72f2530 100644 --- a/source/blender/blenkernel/intern/cdderivedmesh.c +++ b/source/blender/blenkernel/intern/cdderivedmesh.c @@ -1850,7 +1850,12 @@ DerivedMesh *CDDM_from_BMEditMesh(BMEditMesh *em, Mesh *me) int numCol = CustomData_number_of_layers(&em->bm->ldata, CD_MLOOPCOL); int numTex = CustomData_number_of_layers(&em->bm->pdata, CD_MTEXPOLY); int i, j, *index, add_orig; - + int has_crease, has_edge_bweight, has_vert_bweight; + + has_edge_bweight = CustomData_has_layer(&em->bm->edata, CD_BWEIGHT); + has_vert_bweight = CustomData_has_layer(&em->bm->vdata, CD_BWEIGHT); + has_crease = CustomData_has_layer(&em->bm->edata, CD_CREASE); + dm->deformedOnly = 1; /*don't add origindex layer if one already exists*/ @@ -1889,6 +1894,9 @@ DerivedMesh *CDDM_from_BMEditMesh(BMEditMesh *em, Mesh *me) mv->flag = BMFlags_To_MEFlags(eve); + if (has_vert_bweight) + mv->bweight = (unsigned char)(BM_GetCDf(&bm->vdata, eve, CD_BWEIGHT)*255.0f); + if (add_orig) *index = i; CustomData_from_bmesh_block(&bm->vdata, &dm->vertData, eve->head.data, i); @@ -1904,6 +1912,11 @@ DerivedMesh *CDDM_from_BMEditMesh(BMEditMesh *em, Mesh *me) med->v1 = BMINDEX_GET(eed->v1); med->v2 = BMINDEX_GET(eed->v2); med->flag = ME_EDGEDRAW|ME_EDGERENDER; + + if (has_crease) + med->crease = (unsigned char)(BM_GetCDf(&bm->edata, eed, CD_CREASE)*255.0f); + if (has_edge_bweight) + med->bweight = (unsigned char)(BM_GetCDf(&bm->edata, eed, CD_BWEIGHT)*255.0f); med->flag = BMFlags_To_MEFlags(eed); diff --git a/source/blender/blenkernel/intern/editderivedbmesh.c b/source/blender/blenkernel/intern/editderivedbmesh.c index b38521b0a23..3f45a0069d9 100644 --- a/source/blender/blenkernel/intern/editderivedbmesh.c +++ b/source/blender/blenkernel/intern/editderivedbmesh.c @@ -1273,7 +1273,8 @@ static void bmDM_copyEdgeArray(DerivedMesh *dm, MEdge *edge_r) BMEdge *ee; BMIter iter; BMVert *ev; - int i; + int has_bweight = CustomData_has_layer(&bm->edata, CD_BWEIGHT); + int i, has_crease = CustomData_has_layer(&bm->edata, CD_CREASE); /* store vertex indices in tmp union */ ev = BMIter_New(&iter, bm, BM_VERTS_OF_MESH, NULL); @@ -1282,11 +1283,11 @@ static void bmDM_copyEdgeArray(DerivedMesh *dm, MEdge *edge_r) ee = BMIter_New(&iter, bm, BM_EDGES_OF_MESH, NULL); for( ; ee; ee=BMIter_Step(&iter)) { - if (CustomData_has_layer(&bm->edata, CD_BWEIGHT)) { + if (has_bweight) { edge_r->bweight = (unsigned char) (BM_GetCDf(&bm->edata, ee, CD_BWEIGHT)*255.0f); } - if (CustomData_has_layer(&bm->edata, CD_CREASE)) { + if (has_crease) { edge_r->crease = (unsigned char) (BM_GetCDf(&bm->edata, ee, CD_CREASE)*255.0f); } @@ -1294,7 +1295,7 @@ static void bmDM_copyEdgeArray(DerivedMesh *dm, MEdge *edge_r) if (ee->head.flag & BM_SEAM) edge_r->flag |= ME_SEAM; if (ee->head.flag & BM_SHARP) edge_r->flag |= ME_SHARP; #if 0 - /* this needs setup of f2 field */ + /* this needs setup of f2 (edge draw flags, if I remember right) field */ if (!ee->f2) edge_r->flag |= ME_LOOSEEDGE; #endif diff --git a/source/blender/blenkernel/intern/subsurf_ccg.c b/source/blender/blenkernel/intern/subsurf_ccg.c index 14053b16adf..c92b5686df3 100644 --- a/source/blender/blenkernel/intern/subsurf_ccg.c +++ b/source/blender/blenkernel/intern/subsurf_ccg.c @@ -563,7 +563,7 @@ static int ss_sync_from_derivedmesh(CCGSubSurf *ss, DerivedMesh *dm, for(i = 0; i < totedge; i++, me++) { CCGEdge *e; float crease; - + crease = useFlatSubdiv ? creaseFactor : me->crease * creaseFactor / 255.0f; diff --git a/source/blender/bmesh/operators/mesh_conv.c b/source/blender/bmesh/operators/mesh_conv.c index 999da40a845..fc9ecfadbe2 100644 --- a/source/blender/bmesh/operators/mesh_conv.c +++ b/source/blender/bmesh/operators/mesh_conv.c @@ -378,6 +378,10 @@ void bmesh_to_mesh_exec(BMesh *bm, BMOperator *op) { i = 0; BM_ITER(v, &iter, bm, BM_VERTS_OF_MESH, NULL) { + float *bweight = CustomData_bmesh_get(&bm->vdata, v->head.data, CD_BWEIGHT); + + mvert->bweight = bweight ? (char)((*bweight)*255) : 0; + VECCOPY(mvert->co, v->co); mvert->no[0] = (short) (v->no[0]*32767.0f); @@ -399,11 +403,16 @@ void bmesh_to_mesh_exec(BMesh *bm, BMOperator *op) { i = 0; BM_ITER(e, &iter, bm, BM_EDGES_OF_MESH, NULL) { + float *crease = CustomData_bmesh_get(&bm->edata, e->head.data, CD_CREASE); + float *bweight = CustomData_bmesh_get(&bm->edata, e->head.data, CD_BWEIGHT); + medge->v1 = BMINDEX_GET(e->v1); medge->v2 = BMINDEX_GET(e->v2); - + medge->crease = crease ? (char)((*crease)*255) : 0; + medge->bweight = bweight ? (char)((*bweight)*255) : 0; + medge->flag = BMFlags_To_MEFlags(e); - + BMINDEX_SET(e, i); /*copy over customdata*/