=bmesh= fixed edge creasing for subsurf

This commit is contained in:
Joseph Eagar
2011-03-27 03:29:27 +00:00
parent 7fa0c61730
commit fc050837b0
4 changed files with 31 additions and 8 deletions

View File

@@ -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);

View File

@@ -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

View File

@@ -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;

View File

@@ -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*/