diff options
author | Campbell Barton <ideasman42@gmail.com> | 2019-01-04 11:52:13 +0300 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2019-01-04 11:52:13 +0300 |
commit | 1b8c3774a86ebc04fceb9cdf787f9b731f0ebb96 (patch) | |
tree | 8a3e9e51757cbada85be253dc5d060288c3c3859 | |
parent | c6405f5ee8fe38ddc469c3f1d04a9c877141ce83 (diff) |
Fix T54771: Can't change multiple dimensions at once
- Use non-rna button for adjusting dimensions.
- Make Object.dimensions RNA read-only since it never worked well.
This is mainly a UI editing feature.
-rw-r--r-- | source/blender/blenkernel/BKE_object.h | 2 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/object.c | 12 | ||||
-rw-r--r-- | source/blender/editors/space_view3d/view3d_buttons.c | 77 | ||||
-rw-r--r-- | source/blender/makesrna/intern/rna_object.c | 13 |
4 files changed, 76 insertions, 28 deletions
diff --git a/source/blender/blenkernel/BKE_object.h b/source/blender/blenkernel/BKE_object.h index 8a3bf81911d..329be174632 100644 --- a/source/blender/blenkernel/BKE_object.h +++ b/source/blender/blenkernel/BKE_object.h @@ -184,7 +184,7 @@ void BKE_boundbox_minmax(const struct BoundBox *bb, float obmat[4][4], float r_m struct BoundBox *BKE_object_boundbox_get(struct Object *ob); void BKE_object_dimensions_get(struct Object *ob, float vec[3]); -void BKE_object_dimensions_set(struct Object *ob, const float value[3]); +void BKE_object_dimensions_set(struct Object *ob, const float value[3], int axis_mask); void BKE_object_empty_draw_type_set(struct Object *ob, const int value); void BKE_object_boundbox_flag(struct Object *ob, int flag, const bool set); void BKE_object_boundbox_calc_from_mesh(struct Object *ob, struct Mesh *me_eval); diff --git a/source/blender/blenkernel/intern/object.c b/source/blender/blenkernel/intern/object.c index 8ab3962d930..80a59216f60 100644 --- a/source/blender/blenkernel/intern/object.c +++ b/source/blender/blenkernel/intern/object.c @@ -2548,7 +2548,7 @@ void BKE_object_dimensions_get(Object *ob, float vec[3]) } } -void BKE_object_dimensions_set(Object *ob, const float value[3]) +void BKE_object_dimensions_set(Object *ob, const float value[3], int axis_mask) { BoundBox *bb = NULL; @@ -2560,9 +2560,13 @@ void BKE_object_dimensions_set(Object *ob, const float value[3]) len[1] = bb->vec[2][1] - bb->vec[0][1]; len[2] = bb->vec[1][2] - bb->vec[0][2]; - if (len[0] > 0.f) ob->size[0] = value[0] / len[0]; - if (len[1] > 0.f) ob->size[1] = value[1] / len[1]; - if (len[2] > 0.f) ob->size[2] = value[2] / len[2]; + for (int i = 0; i < 3; i++) { + if (((1 << i) & axis_mask) == 0) { + if (len[i] > 0.0f) { + ob->size[i] = value[i] / len[i]; + } + } + } } } diff --git a/source/blender/editors/space_view3d/view3d_buttons.c b/source/blender/editors/space_view3d/view3d_buttons.c index 277d0f6a2a0..cc6b51518b7 100644 --- a/source/blender/editors/space_view3d/view3d_buttons.c +++ b/source/blender/editors/space_view3d/view3d_buttons.c @@ -83,6 +83,7 @@ /* ******************* view3d space & buttons ************** */ #define B_REDR 2 #define B_OBJECTPANELMEDIAN 1008 +#define B_OBJECTPANEL_DIMS 1009 #define NBR_TRANSFORM_PROPERTIES 8 @@ -90,6 +91,7 @@ typedef struct { float ob_eul[4]; /* used for quat too... */ float ob_scale[3]; /* need temp space due to linked values */ + float ob_dims_orig[3]; float ob_dims[3]; short link_scale; float ve_median[NBR_TRANSFORM_PROPERTIES]; @@ -170,6 +172,14 @@ static void apply_scale_factor_clamp(float *val, const int tot, const float ve_m } } +static TransformProperties *v3d_transform_props_ensure(View3D *v3d) +{ + if (v3d->properties_storage == NULL) { + v3d->properties_storage = MEM_callocN(sizeof(TransformProperties), "TransformProperties"); + } + return v3d->properties_storage; +} + /* is used for both read and write... */ static void v3d_editvertex_buts(uiLayout *layout, View3D *v3d, Object *ob, float lim) { @@ -195,7 +205,7 @@ static void v3d_editvertex_buts(uiLayout *layout, View3D *v3d, Object *ob, float #define L_WEIGHT 4 uiBlock *block = (layout) ? uiLayoutAbsoluteBlock(layout) : NULL; - TransformProperties *tfp; + TransformProperties *tfp = v3d_transform_props_ensure(v3d); float median[NBR_TRANSFORM_PROPERTIES], ve_median[NBR_TRANSFORM_PROPERTIES]; int tot, totedgedata, totcurvedata, totlattdata, totcurvebweight; bool has_meshdata = false; @@ -205,11 +215,6 @@ static void v3d_editvertex_buts(uiLayout *layout, View3D *v3d, Object *ob, float copy_vn_fl(median, NBR_TRANSFORM_PROPERTIES, 0.0f); tot = totedgedata = totcurvedata = totlattdata = totcurvebweight = 0; - /* make sure we got storage */ - if (v3d->properties_storage == NULL) - v3d->properties_storage = MEM_callocN(sizeof(TransformProperties), "TransformProperties"); - tfp = v3d->properties_storage; - if (ob->type == OB_MESH) { Mesh *me = ob->data; BMEditMesh *em = me->edit_btmesh; @@ -770,6 +775,47 @@ static void v3d_editvertex_buts(uiLayout *layout, View3D *v3d, Object *ob, float } #undef NBR_TRANSFORM_PROPERTIES +static void v3d_object_dimension_buts(bContext *C, uiLayout *layout, View3D *v3d, Object *ob) +{ + uiBlock *block = (layout) ? uiLayoutAbsoluteBlock(layout) : NULL; + TransformProperties *tfp = v3d_transform_props_ensure(v3d); + + if (block) { + BLI_assert(C == NULL); + uiBut *but; + int yi = 200; + const int butw = 200; + const int buth = 20 * UI_DPI_FAC; + + BKE_object_dimensions_get(ob, tfp->ob_dims); + copy_v3_v3(tfp->ob_dims_orig, tfp->ob_dims); + + uiDefBut(block, UI_BTYPE_LABEL, 0, IFACE_("Dimensions:"), 0, yi -= buth, butw, buth, NULL, 0, 0, 0, 0, ""); + UI_block_align_begin(block); + const float lim = 10000; + for (int i = 0; i < 3; i++) { + char text[3] = {'X' + i, ':', '\0'}; + uiDefButF(block, UI_BTYPE_NUM, B_OBJECTPANEL_DIMS, text, 0, yi -= buth, butw, buth, + &(tfp->ob_dims[i]), 0.0f, lim, 10, 3, ""); + } + UI_block_align_end(block); + } + else { /* apply */ + int axis_mask = 0; + for (int i = 0; i < 3; i++) { + if (tfp->ob_dims[i] == tfp->ob_dims_orig[i]) { + axis_mask |= (1 << i); + } + } + BKE_object_dimensions_set(ob, tfp->ob_dims, axis_mask); + + PointerRNA obptr; + RNA_id_pointer_create(&ob->id, &obptr); + PropertyRNA *prop = RNA_struct_find_property(&obptr, "scale"); + RNA_property_update(C, &obptr, prop); + } +} + #define B_VGRP_PNL_EDIT_SINGLE 8 /* or greater */ static void do_view3d_vgroup_buttons(bContext *C, void *UNUSED(arg), int event) @@ -987,14 +1033,6 @@ static void v3d_transform_butsR(uiLayout *layout, PointerRNA *ptr) uiLayoutSetEmboss(colsub, UI_EMBOSS_NONE); uiItemL(colsub, "", ICON_NONE); uiItemR(colsub, ptr, "lock_scale", UI_ITEM_R_TOGGLE | UI_ITEM_R_ICON_ONLY, "", ICON_DECORATE_UNLOCKED); - - if (ptr->type == &RNA_Object) { - Object *ob = ptr->data; - /* dimensions and editmode just happen to be the same checks */ - if (OB_TYPE_SUPPORT_EDITMODE(ob->type)) { - uiItemR(layout, ptr, "dimensions", 0, NULL, ICON_NONE); - } - } } static void v3d_posearmature_buts(uiLayout *layout, Object *ob) @@ -1120,6 +1158,11 @@ static void do_view3d_region_buttons(bContext *C, void *UNUSED(index), int event DEG_id_tag_update(&ob->id, ID_RECALC_GEOMETRY); } break; + case B_OBJECTPANEL_DIMS: + if (ob) { + v3d_object_dimension_buts(C, NULL, v3d, ob); + } + break; } /* default for now */ @@ -1167,6 +1210,12 @@ static void view3d_panel_transform(const bContext *C, Panel *pa) RNA_id_pointer_create(&ob->id, &obptr); v3d_transform_butsR(col, &obptr); + + /* dimensions and editmode just happen to be the same checks */ + if (OB_TYPE_SUPPORT_EDITMODE(ob->type)) { + View3D *v3d = CTX_wm_view3d(C); + v3d_object_dimension_buts(NULL, col, v3d, ob); + } } } diff --git a/source/blender/makesrna/intern/rna_object.c b/source/blender/makesrna/intern/rna_object.c index feb27018bcd..1c195ff559e 100644 --- a/source/blender/makesrna/intern/rna_object.c +++ b/source/blender/makesrna/intern/rna_object.c @@ -903,12 +903,6 @@ static void rna_Object_dimensions_get(PointerRNA *ptr, float *value) BKE_object_dimensions_get(ob, value); } -static void rna_Object_dimensions_set(PointerRNA *ptr, const float *value) -{ - Object *ob = ptr->data; - BKE_object_dimensions_set(ob, value); -} - static int rna_Object_location_editable(PointerRNA *ptr, int index) { Object *ob = (Object *)ptr->data; @@ -2309,9 +2303,10 @@ static void rna_def_object(BlenderRNA *brna) prop = RNA_def_property(srna, "dimensions", PROP_FLOAT, PROP_XYZ_LENGTH); RNA_def_property_array(prop, 3); - /* only for the transform-panel and conflicts with animating scale */ - RNA_def_property_clear_flag(prop, PROP_ANIMATABLE); - RNA_def_property_float_funcs(prop, "rna_Object_dimensions_get", "rna_Object_dimensions_set", NULL); + /* Only for the transform-panel and conflicts with animating scale. */ + /* Disallow editing, it doesn't work properly, see: T54771. */ + RNA_def_property_clear_flag(prop, PROP_ANIMATABLE | PROP_EDITABLE); + RNA_def_property_float_funcs(prop, "rna_Object_dimensions_get", NULL, NULL); RNA_def_property_ui_range(prop, 0.0f, FLT_MAX, 1, RNA_TRANSLATION_PREC_DEFAULT); RNA_def_property_ui_text(prop, "Dimensions", "Absolute bounding box dimensions of the object"); RNA_def_property_update(prop, NC_OBJECT | ND_TRANSFORM, "rna_Object_internal_update"); |