Add Vertex bevel weight to Editmode UI.

This panel UI code needs more love, cleanup etc. in next commits.
This commit is contained in:
Bastien Montagne
2014-10-14 21:29:26 +02:00
parent 8d1d16bf0d
commit 7e64a020ed

View File

@@ -82,7 +82,7 @@
#define B_REDR 2 #define B_REDR 2
#define B_OBJECTPANELMEDIAN 1008 #define B_OBJECTPANELMEDIAN 1008
#define NBR_TRANSFORM_PROPERTIES 7 #define NBR_TRANSFORM_PROPERTIES 8
/* temporary struct for storing transform properties */ /* temporary struct for storing transform properties */
typedef struct { typedef struct {
@@ -135,10 +135,11 @@ static void v3d_editvertex_buts(uiLayout *layout, View3D *v3d, Object *ob, float
#define LOC_Z 2 #define LOC_Z 2
/* Meshes... */ /* Meshes... */
#define M_CREASE 3 #define M_CREASE 3
#define M_WEIGHT 4 #define M_BV_WEIGHT 4
#define M_BE_WEIGHT 5
/* XXX Those two *must* remain contiguous (used as array)! */ /* XXX Those two *must* remain contiguous (used as array)! */
#define M_SKIN_X 5 #define M_SKIN_X 6
#define M_SKIN_Y 6 #define M_SKIN_Y 7
/* Curves... */ /* Curves... */
#define C_BWEIGHT 3 #define C_BWEIGHT 3
#define C_WEIGHT 4 #define C_WEIGHT 4
@@ -150,12 +151,13 @@ static void v3d_editvertex_buts(uiLayout *layout, View3D *v3d, Object *ob, float
uiBlock *block = (layout) ? uiLayoutAbsoluteBlock(layout) : NULL; uiBlock *block = (layout) ? uiLayoutAbsoluteBlock(layout) : NULL;
TransformProperties *tfp; TransformProperties *tfp;
float median[NBR_TRANSFORM_PROPERTIES], ve_median[NBR_TRANSFORM_PROPERTIES]; float median[NBR_TRANSFORM_PROPERTIES], ve_median[NBR_TRANSFORM_PROPERTIES];
int tot, totedgedata, totcurvedata, totlattdata, totskinradius, totcurvebweight; int tot, totedgedata, totcurvedata, totlattdata, totcurvebweight;
bool has_meshdata = false; bool has_meshdata = false;
bool has_skinradius = false;
PointerRNA data_ptr; PointerRNA data_ptr;
fill_vn_fl(median, NBR_TRANSFORM_PROPERTIES, 0.0f); fill_vn_fl(median, NBR_TRANSFORM_PROPERTIES, 0.0f);
tot = totedgedata = totcurvedata = totlattdata = totskinradius = totcurvebweight = 0; tot = totedgedata = totcurvedata = totlattdata = totcurvebweight = 0;
/* make sure we got storage */ /* make sure we got storage */
if (v3d->properties_storage == NULL) if (v3d->properties_storage == NULL)
@@ -175,19 +177,21 @@ static void v3d_editvertex_buts(uiLayout *layout, View3D *v3d, Object *ob, float
const int cd_edge_bweight_offset = CustomData_get_offset(&bm->edata, CD_BWEIGHT); const int cd_edge_bweight_offset = CustomData_get_offset(&bm->edata, CD_BWEIGHT);
const int cd_edge_crease_offset = CustomData_get_offset(&bm->edata, CD_CREASE); const int cd_edge_crease_offset = CustomData_get_offset(&bm->edata, CD_CREASE);
has_skinradius = (cd_vert_skin_offset != -1);
if (bm->totvertsel) { if (bm->totvertsel) {
BM_ITER_MESH (eve, &iter, bm, BM_VERTS_OF_MESH) { BM_ITER_MESH (eve, &iter, bm, BM_VERTS_OF_MESH) {
if (BM_elem_flag_test(eve, BM_ELEM_SELECT)) { if (BM_elem_flag_test(eve, BM_ELEM_SELECT)) {
tot++; tot++;
add_v3_v3(&median[LOC_X], eve->co); add_v3_v3(&median[LOC_X], eve->co);
/* TODO cd_vert_bweight_offset */ if (cd_vert_bweight_offset != -1) {
(void)cd_vert_bweight_offset; median[M_BV_WEIGHT] += BM_ELEM_CD_GET_FLOAT(eve, cd_vert_bweight_offset);
}
if (cd_vert_skin_offset != -1) { if (has_skinradius) {
MVertSkin *vs = BM_ELEM_CD_GET_VOID_P(eve, cd_vert_skin_offset); MVertSkin *vs = BM_ELEM_CD_GET_VOID_P(eve, cd_vert_skin_offset);
add_v2_v2(&median[M_SKIN_X], vs->radius); /* Third val not used currently. */ add_v2_v2(&median[M_SKIN_X], vs->radius); /* Third val not used currently. */
totskinradius++;
} }
} }
} }
@@ -200,7 +204,7 @@ static void v3d_editvertex_buts(uiLayout *layout, View3D *v3d, Object *ob, float
BM_ITER_MESH (eed, &iter, bm, BM_EDGES_OF_MESH) { BM_ITER_MESH (eed, &iter, bm, BM_EDGES_OF_MESH) {
if (BM_elem_flag_test(eed, BM_ELEM_SELECT)) { if (BM_elem_flag_test(eed, BM_ELEM_SELECT)) {
if (cd_edge_bweight_offset != -1) { if (cd_edge_bweight_offset != -1) {
median[M_WEIGHT] += BM_ELEM_CD_GET_FLOAT(eed, cd_edge_bweight_offset); median[M_BE_WEIGHT] += BM_ELEM_CD_GET_FLOAT(eed, cd_edge_bweight_offset);
} }
if (cd_edge_crease_offset != -1) { if (cd_edge_crease_offset != -1) {
@@ -216,7 +220,7 @@ static void v3d_editvertex_buts(uiLayout *layout, View3D *v3d, Object *ob, float
totedgedata = bm->totedgesel; totedgedata = bm->totedgesel;
} }
has_meshdata = (totedgedata || totskinradius); has_meshdata = (tot || totedgedata);
} }
else if (ob->type == OB_CURVE || ob->type == OB_SURF) { else if (ob->type == OB_CURVE || ob->type == OB_SURF) {
Curve *cu = ob->data; Curve *cu = ob->data;
@@ -326,11 +330,14 @@ static void v3d_editvertex_buts(uiLayout *layout, View3D *v3d, Object *ob, float
if (has_meshdata) { if (has_meshdata) {
if (totedgedata) { if (totedgedata) {
median[M_CREASE] /= (float)totedgedata; median[M_CREASE] /= (float)totedgedata;
median[M_WEIGHT] /= (float)totedgedata; median[M_BE_WEIGHT] /= (float)totedgedata;
} }
if (totskinradius) { if (tot) {
median[M_SKIN_X] /= (float)totskinradius; median[M_BV_WEIGHT] /= (float)tot;
median[M_SKIN_Y] /= (float)totskinradius; if (has_skinradius) {
median[M_SKIN_X] /= (float)tot;
median[M_SKIN_Y] /= (float)tot;
}
} }
} }
else if (totcurvedata) { else if (totcurvedata) {
@@ -394,6 +401,8 @@ static void v3d_editvertex_buts(uiLayout *layout, View3D *v3d, Object *ob, float
/* Meshes... */ /* Meshes... */
if (has_meshdata) { if (has_meshdata) {
if (totedgedata) { if (totedgedata) {
uiDefBut(block, LABEL, 0, totedgedata == 1 ? IFACE_("Edge Data:") : IFACE_("Edges Data:"),
0, yi -= buth + but_margin, 200, buth, NULL, 0.0, 0.0, 0, 0, "");
/* customdata layer added on demand */ /* customdata layer added on demand */
uiDefButF(block, NUM, B_OBJECTPANELMEDIAN, uiDefButF(block, NUM, B_OBJECTPANELMEDIAN,
totedgedata == 1 ? IFACE_("Crease:") : IFACE_("Mean Crease:"), totedgedata == 1 ? IFACE_("Crease:") : IFACE_("Mean Crease:"),
@@ -403,15 +412,24 @@ static void v3d_editvertex_buts(uiLayout *layout, View3D *v3d, Object *ob, float
uiDefButF(block, NUM, B_OBJECTPANELMEDIAN, uiDefButF(block, NUM, B_OBJECTPANELMEDIAN,
totedgedata == 1 ? IFACE_("Bevel Weight:") : IFACE_("Mean Bevel Weight:"), totedgedata == 1 ? IFACE_("Bevel Weight:") : IFACE_("Mean Bevel Weight:"),
0, yi -= buth + but_margin, 200, buth, 0, yi -= buth + but_margin, 200, buth,
&(tfp->ve_median[M_WEIGHT]), 0.0, 1.0, 1, 2, TIP_("Weight used by Bevel modifier")); &(tfp->ve_median[M_BE_WEIGHT]), 0.0, 1.0, 1, 2, TIP_("Edge weight used by Bevel modifier"));
} }
if (totskinradius) { if (tot) {
uiDefBut(block, LABEL, 0, tot == 1 ? IFACE_("Vertex Data:") : IFACE_("Vertices Data:"),
0, yi -= buth + but_margin, 200, buth, NULL, 0.0, 0.0, 0, 0, "");
/* customdata layer added on demand */
uiDefButF(block, NUM, B_OBJECTPANELMEDIAN, uiDefButF(block, NUM, B_OBJECTPANELMEDIAN,
totskinradius == 1 ? IFACE_("Radius X:") : IFACE_("Mean Radius X:"), tot == 1 ? IFACE_("Bevel Weight:") : IFACE_("Mean Bevel Weight:"),
0, yi -= buth + but_margin, 200, buth,
&(tfp->ve_median[M_BV_WEIGHT]), 0.0, 1.0, 1, 2, TIP_("Vertex weight used by Bevel modifier"));
}
if (has_skinradius) {
uiDefButF(block, NUM, B_OBJECTPANELMEDIAN,
tot == 1 ? IFACE_("Radius X:") : IFACE_("Mean Radius X:"),
0, yi -= buth + but_margin, 200, buth, 0, yi -= buth + but_margin, 200, buth,
&(tfp->ve_median[M_SKIN_X]), 0.0, 100.0, 1, 3, TIP_("X radius used by Skin modifier")); &(tfp->ve_median[M_SKIN_X]), 0.0, 100.0, 1, 3, TIP_("X radius used by Skin modifier"));
uiDefButF(block, NUM, B_OBJECTPANELMEDIAN, uiDefButF(block, NUM, B_OBJECTPANELMEDIAN,
totskinradius == 1 ? IFACE_("Radius Y:") : IFACE_("Mean Radius Y:"), tot == 1 ? IFACE_("Radius Y:") : IFACE_("Mean Radius Y:"),
0, yi -= buth + but_margin, 200, buth, 0, yi -= buth + but_margin, 200, buth,
&(tfp->ve_median[M_SKIN_Y]), 0.0, 100.0, 1, 3, TIP_("Y radius used by Skin modifier")); &(tfp->ve_median[M_SKIN_Y]), 0.0, 100.0, 1, 3, TIP_("Y radius used by Skin modifier"));
} }
@@ -492,6 +510,42 @@ static void v3d_editvertex_buts(uiLayout *layout, View3D *v3d, Object *ob, float
EDBM_mesh_normals_update(em); EDBM_mesh_normals_update(em);
} }
if (median[M_BV_WEIGHT] != 0.0f) {
const int cd_vert_bweight_offset = (BM_mesh_cd_flag_ensure(bm, me, ME_CDFLAG_VERT_BWEIGHT),
CustomData_get_offset(&bm->vdata, CD_BWEIGHT));
const float sca = compute_scale_factor(ve_median[M_BV_WEIGHT], median[M_BV_WEIGHT]);
BMVert *eve;
BLI_assert(cd_vert_bweight_offset != -1);
if (ELEM(sca, 0.0f, 1.0f)) {
BM_ITER_MESH (eve, &iter, bm, BM_VERTS_OF_MESH) {
if (BM_elem_flag_test(eve, BM_ELEM_SELECT)) {
float *bweight = BM_ELEM_CD_GET_VOID_P(eve, cd_vert_bweight_offset);
*bweight = sca;
}
}
}
else if (sca > 0.0f) {
BM_ITER_MESH (eve, &iter, bm, BM_VERTS_OF_MESH) {
if (BM_elem_flag_test(eve, BM_ELEM_SELECT) && !BM_elem_flag_test(eve, BM_ELEM_HIDDEN)) {
float *bweight = BM_ELEM_CD_GET_VOID_P(eve, cd_vert_bweight_offset);
*bweight *= sca;
CLAMP(*bweight, 0.0f, 1.0f);
}
}
}
else {
BM_ITER_MESH (eve, &iter, bm, BM_VERTS_OF_MESH) {
if (BM_elem_flag_test(eve, BM_ELEM_SELECT) && !BM_elem_flag_test(eve, BM_ELEM_HIDDEN)) {
float *bweight = BM_ELEM_CD_GET_VOID_P(eve, cd_vert_bweight_offset);
*bweight = 1.0f + ((1.0f - *bweight) * sca);
CLAMP(*bweight, 0.0f, 1.0f);
}
}
}
}
if (median[M_CREASE] != 0.0f) { if (median[M_CREASE] != 0.0f) {
const int cd_edge_crease_offset = (BM_mesh_cd_flag_ensure(bm, me, ME_CDFLAG_EDGE_CREASE), const int cd_edge_crease_offset = (BM_mesh_cd_flag_ensure(bm, me, ME_CDFLAG_EDGE_CREASE),
CustomData_get_offset(&bm->edata, CD_CREASE)); CustomData_get_offset(&bm->edata, CD_CREASE));
@@ -525,10 +579,10 @@ static void v3d_editvertex_buts(uiLayout *layout, View3D *v3d, Object *ob, float
} }
} }
if (median[M_WEIGHT] != 0.0f) { if (median[M_BE_WEIGHT] != 0.0f) {
const int cd_edge_bweight_offset = (BM_mesh_cd_flag_ensure(bm, me, ME_CDFLAG_EDGE_BWEIGHT), const int cd_edge_bweight_offset = (BM_mesh_cd_flag_ensure(bm, me, ME_CDFLAG_EDGE_BWEIGHT),
CustomData_get_offset(&bm->edata, CD_BWEIGHT)); CustomData_get_offset(&bm->edata, CD_BWEIGHT));
const float sca = compute_scale_factor(ve_median[M_WEIGHT], median[M_WEIGHT]); const float sca = compute_scale_factor(ve_median[M_BE_WEIGHT], median[M_BE_WEIGHT]);
BMEdge *eed; BMEdge *eed;
BLI_assert(cd_edge_bweight_offset != -1); BLI_assert(cd_edge_bweight_offset != -1);
@@ -747,7 +801,8 @@ static void v3d_editvertex_buts(uiLayout *layout, View3D *v3d, Object *ob, float
#undef LOC_Z #undef LOC_Z
/* Meshes (and lattice)... */ /* Meshes (and lattice)... */
#undef M_CREASE #undef M_CREASE
#undef M_WEIGHT #undef M_BV_WEIGHT
#undef M_BE_WEIGHT
#undef M_SKIN_X #undef M_SKIN_X
#undef M_SKIN_Y #undef M_SKIN_Y
/* Curves... */ /* Curves... */