Merge gsoc Bevel (with rounding) into trunk.
This commit is contained in:
@@ -1064,6 +1064,7 @@ static BMOpDefine bmo_create_cube_def = {
|
||||
0,
|
||||
};
|
||||
|
||||
#define NEW_BEVEL 1
|
||||
/*
|
||||
* Bevel
|
||||
*
|
||||
@@ -1071,6 +1072,12 @@ static BMOpDefine bmo_create_cube_def = {
|
||||
*/
|
||||
static BMOpDefine bmo_bevel_def = {
|
||||
"bevel",
|
||||
#ifdef NEW_BEVEL
|
||||
{{BMO_OP_SLOT_ELEMENT_BUF, "geom"}, /* input edges and vertices */
|
||||
{BMO_OP_SLOT_FLT, "offset"}, /* amount to offset beveled edge */
|
||||
{BMO_OP_SLOT_INT, "segments"}, /* number of segments in bevel */
|
||||
{0} /* null-terminating sentinel */},
|
||||
#else
|
||||
{{BMO_OP_SLOT_ELEMENT_BUF, "geom"}, /* input edges and vertices */
|
||||
{BMO_OP_SLOT_ELEMENT_BUF, "face_spans"}, /* new geometry */
|
||||
{BMO_OP_SLOT_ELEMENT_BUF, "face_holes"}, /* new geometry */
|
||||
@@ -1081,6 +1088,7 @@ static BMOpDefine bmo_bevel_def = {
|
||||
{BMO_OP_SLOT_INT, "lengthlayer"}, /* which PROP_FLT layer to us */
|
||||
{BMO_OP_SLOT_FLT, "percent"}, /* percentage to expand beveled edge */
|
||||
{0} /* null-terminating sentinel */},
|
||||
#endif
|
||||
bmo_bevel_exec,
|
||||
BMO_OP_FLAG_UNTAN_MULTIRES
|
||||
};
|
||||
|
File diff suppressed because it is too large
Load Diff
@@ -4602,11 +4602,15 @@ void MESH_OT_noise(wmOperatorType *ot)
|
||||
RNA_def_float(ot->srna, "factor", 0.1f, -FLT_MAX, FLT_MAX, "Factor", "", 0.0f, 1.0f);
|
||||
}
|
||||
|
||||
#define NEW_BEVEL 1
|
||||
|
||||
typedef struct {
|
||||
BMEditMesh *em;
|
||||
BMBackup mesh_backup;
|
||||
#ifndef NEW_BEVEL
|
||||
float *weights;
|
||||
int li;
|
||||
#endif
|
||||
int mcenter[2];
|
||||
float initial_length;
|
||||
float pixel_size; /* use when mouse input is interpreted as spatial distance */
|
||||
@@ -4619,13 +4623,28 @@ typedef struct {
|
||||
|
||||
static void edbm_bevel_update_header(wmOperator *op, bContext *C)
|
||||
{
|
||||
#ifdef NEW_BEVEL
|
||||
static char str[] = "Confirm: Enter/LClick, Cancel: (Esc/RMB), offset: %s, segments: %d";
|
||||
#else
|
||||
static char str[] = "Confirm: Enter/LClick, Cancel: (Esc/RMB), factor: %s, Use Dist (D): %s: Use Even (E): %s";
|
||||
#endif
|
||||
|
||||
char msg[HEADER_LENGTH];
|
||||
ScrArea *sa = CTX_wm_area(C);
|
||||
BevelData *opdata = op->customdata;
|
||||
|
||||
if (sa) {
|
||||
#ifdef NEW_BEVEL
|
||||
char offset_str[NUM_STR_REP_LEN];
|
||||
if (hasNumInput(&opdata->num_input))
|
||||
outputNumInput(&opdata->num_input, offset_str);
|
||||
else
|
||||
BLI_snprintf(offset_str, NUM_STR_REP_LEN, "%f", RNA_float_get(op->ptr, "offset"));
|
||||
BLI_snprintf(msg, HEADER_LENGTH, str,
|
||||
offset_str,
|
||||
RNA_int_get(op->ptr, "segments")
|
||||
);
|
||||
#else
|
||||
char factor_str[NUM_STR_REP_LEN];
|
||||
if (hasNumInput(&opdata->num_input))
|
||||
outputNumInput(&opdata->num_input, factor_str);
|
||||
@@ -4636,11 +4655,13 @@ static void edbm_bevel_update_header(wmOperator *op, bContext *C)
|
||||
RNA_boolean_get(op->ptr, "use_dist") ? "On" : "Off",
|
||||
RNA_boolean_get(op->ptr, "use_even") ? "On" : "Off"
|
||||
);
|
||||
#endif
|
||||
|
||||
ED_area_headerprint(sa, msg);
|
||||
}
|
||||
}
|
||||
|
||||
#ifndef NEW_BEVEL
|
||||
static void edbm_bevel_recalc_weights(wmOperator *op)
|
||||
{
|
||||
float df, s, ftot;
|
||||
@@ -4668,15 +4689,20 @@ static void edbm_bevel_recalc_weights(wmOperator *op)
|
||||
|
||||
mul_vn_fl(opdata->weights, recursion, 1.0f / (float)ftot);
|
||||
}
|
||||
#endif
|
||||
|
||||
static int edbm_bevel_init(bContext *C, wmOperator *op, int is_modal)
|
||||
{
|
||||
Object *obedit = CTX_data_edit_object(C);
|
||||
BMEditMesh *em = BMEdit_FromObject(obedit);
|
||||
#ifdef NEW_BEVEL
|
||||
BevelData *opdata;
|
||||
#else
|
||||
BMIter iter;
|
||||
BMEdge *eed;
|
||||
BevelData *opdata;
|
||||
int li;
|
||||
#endif
|
||||
|
||||
if (em == NULL) {
|
||||
return 0;
|
||||
@@ -4684,6 +4710,7 @@ static int edbm_bevel_init(bContext *C, wmOperator *op, int is_modal)
|
||||
|
||||
op->customdata = opdata = MEM_mallocN(sizeof(BevelData), "beveldata_mesh_operator");
|
||||
|
||||
#ifndef NEW_BEVEL
|
||||
BM_data_layer_add(em->bm, &em->bm->edata, CD_PROP_FLT);
|
||||
li = CustomData_number_of_layers(&em->bm->edata, CD_PROP_FLT) - 1;
|
||||
|
||||
@@ -4693,10 +4720,12 @@ static int edbm_bevel_init(bContext *C, wmOperator *op, int is_modal)
|
||||
|
||||
*dv = d;
|
||||
}
|
||||
|
||||
opdata->em = em;
|
||||
|
||||
opdata->li = li;
|
||||
opdata->weights = NULL;
|
||||
#endif
|
||||
|
||||
opdata->em = em;
|
||||
opdata->is_modal = is_modal;
|
||||
opdata->shift_factor = -1.0f;
|
||||
|
||||
@@ -4706,7 +4735,9 @@ static int edbm_bevel_init(bContext *C, wmOperator *op, int is_modal)
|
||||
/* avoid the cost of allocating a bm copy */
|
||||
if (is_modal)
|
||||
opdata->mesh_backup = EDBM_redo_state_store(em);
|
||||
#ifndef NEW_BEVEL
|
||||
edbm_bevel_recalc_weights(op);
|
||||
#endif
|
||||
|
||||
return 1;
|
||||
}
|
||||
@@ -4716,6 +4747,26 @@ static int edbm_bevel_calc(bContext *C, wmOperator *op)
|
||||
BevelData *opdata = op->customdata;
|
||||
BMEditMesh *em = opdata->em;
|
||||
BMOperator bmop;
|
||||
#ifdef NEW_BEVEL
|
||||
float offset = RNA_float_get(op->ptr, "offset");
|
||||
int segments = RNA_int_get(op->ptr, "segments");
|
||||
|
||||
/* revert to original mesh */
|
||||
if (opdata->is_modal) {
|
||||
EDBM_redo_state_restore(opdata->mesh_backup, em, FALSE);
|
||||
}
|
||||
|
||||
if (!EDBM_op_init(em, &bmop, op,
|
||||
"bevel geom=%hev offset=%f segments=%i",
|
||||
BM_ELEM_SELECT, offset, segments))
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
BMO_op_exec(em->bm, &bmop);
|
||||
if (!EDBM_op_finish(em, &bmop, op, TRUE))
|
||||
return 0;
|
||||
#else
|
||||
int i;
|
||||
|
||||
float factor = RNA_float_get(op->ptr, "percent") /*, dfac */ /* UNUSED */;
|
||||
@@ -4743,6 +4794,7 @@ static int edbm_bevel_calc(bContext *C, wmOperator *op)
|
||||
if (!EDBM_op_finish(em, &bmop, op, TRUE))
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
EDBM_mesh_normals_update(opdata->em);
|
||||
|
||||
@@ -4760,10 +4812,12 @@ static void edbm_bevel_exit(bContext *C, wmOperator *op)
|
||||
if (sa) {
|
||||
ED_area_headerprint(sa, NULL);
|
||||
}
|
||||
#ifndef NEW_BEVEL
|
||||
BM_data_layer_free_n(opdata->em->bm, &opdata->em->bm->edata, CD_PROP_FLT, opdata->li);
|
||||
|
||||
if (opdata->weights)
|
||||
MEM_freeN(opdata->weights);
|
||||
#endif
|
||||
if (opdata->is_modal) {
|
||||
EDBM_redo_state_free(&opdata->mesh_backup, NULL, FALSE);
|
||||
}
|
||||
@@ -4844,7 +4898,11 @@ static int edbm_bevel_invoke(bContext *C, wmOperator *op, wmEvent *event)
|
||||
static float edbm_bevel_mval_factor(wmOperator *op, wmEvent *event)
|
||||
{
|
||||
BevelData *opdata = op->customdata;
|
||||
#ifdef NEW_BEVEL
|
||||
int use_dist = TRUE;
|
||||
#else
|
||||
int use_dist = RNA_boolean_get(op->ptr, "use_dist");
|
||||
#endif
|
||||
float mdiff[2];
|
||||
float factor;
|
||||
|
||||
@@ -4907,7 +4965,11 @@ static int edbm_bevel_modal(bContext *C, wmOperator *op, wmEvent *event)
|
||||
case MOUSEMOVE:
|
||||
if (!hasNumInput(&opdata->num_input)) {
|
||||
const float factor = edbm_bevel_mval_factor(op, event);
|
||||
#ifdef NEW_BEVEL
|
||||
RNA_float_set(op->ptr, "offset", factor);
|
||||
#else
|
||||
RNA_float_set(op->ptr, "percent", factor);
|
||||
#endif
|
||||
|
||||
edbm_bevel_calc(C, op);
|
||||
edbm_bevel_update_header(op, C);
|
||||
@@ -4967,6 +5029,10 @@ void MESH_OT_bevel(wmOperatorType *ot)
|
||||
/* flags */
|
||||
ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO | OPTYPE_GRAB_POINTER | OPTYPE_BLOCKING;
|
||||
|
||||
#ifdef NEW_BEVEL
|
||||
RNA_def_float(ot->srna, "offset", 0.0f, -FLT_MAX, FLT_MAX, "Offset", "", 0.0f, 1.0f);
|
||||
RNA_def_int(ot->srna, "segments", 1, 1, 50, "Segments", "Segments for curved edge", 1, 8);
|
||||
#else
|
||||
/* take note, used as a factor _and_ a distance depending on 'use_dist' */
|
||||
RNA_def_float(ot->srna, "percent", 0.0f, -FLT_MAX, FLT_MAX, "Percentage", "", 0.0f, 1.0f);
|
||||
/* XXX, disabled for 2.63 release, needs to work much better without overlap before we can give to users. */
|
||||
@@ -4974,6 +5040,7 @@ void MESH_OT_bevel(wmOperatorType *ot)
|
||||
|
||||
RNA_def_boolean(ot->srna, "use_even", FALSE, "Even", "Calculate evenly spaced bevel");
|
||||
RNA_def_boolean(ot->srna, "use_dist", FALSE, "Distance", "Interpret the percent in blender units");
|
||||
#endif
|
||||
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user