=bmesh= fixed edge creasing for subsurf
This commit is contained in:
@@ -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);
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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*/
|
||||
|
||||
Reference in New Issue
Block a user