diff options
author | Campbell Barton <ideasman42@gmail.com> | 2017-06-10 03:42:35 +0300 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2017-06-10 03:42:35 +0300 |
commit | 11d90f0f3b65abb6689ca66731ab54f2f38e905f (patch) | |
tree | 2799562c86e924d70ce400db910292829abf54a9 /source/blender/editors | |
parent | 0a5e9e2f56f5d738b1128b46ecadd9713bd42dec (diff) |
Manipulator Update/Refactor
Sync with custom-manipulators branch
- Use identifiers for properties.
- Property array index access.
- Remove operator from manipulators
(wasn't used and will likely add in a different way).
Diffstat (limited to 'source/blender/editors')
15 files changed, 492 insertions, 339 deletions
diff --git a/source/blender/editors/include/ED_manipulator_library.h b/source/blender/editors/include/ED_manipulator_library.h index a9c04c8e004..1c3cbcf3294 100644 --- a/source/blender/editors/include/ED_manipulator_library.h +++ b/source/blender/editors/include/ED_manipulator_library.h @@ -38,8 +38,27 @@ void ED_manipulatortypes_dial_3d(void); void ED_manipulatortypes_facemap_3d(void); void ED_manipulatortypes_primitive_3d(void); +struct wmManipulator; struct wmManipulatorGroup; + +/* -------------------------------------------------------------------- */ +/* Shape Presets + * + * Intended to be called by custom draw functions. + */ + +/* manipulator_library_presets.c */ +void ED_manipulator_draw_preset_box( + const struct wmManipulator *mpr, float mat[4][4], int select_id); +void ED_manipulator_draw_preset_arrow( + const struct wmManipulator *mpr, float mat[4][4], int axis, int select_id); +void ED_manipulator_draw_preset_circle( + const struct wmManipulator *mpr, float mat[4][4], int axis, int select_id); +void ED_manipulator_draw_preset_facemap( + const struct wmManipulator *mpr, struct Scene *scene, struct Object *ob, const int facemap, int select_id); + + /* -------------------------------------------------------------------- */ /* 3D Arrow Manipulator */ @@ -56,27 +75,22 @@ enum { ED_MANIPULATOR_ARROW_STYLE_CONE = (1 << 6), }; -/* slots for properties */ -enum { - ED_MANIPULATOR_ARROW_SLOT_OFS_WORLD_SPACE = 0 -}; - struct wmManipulator *ED_manipulator_arrow3d_new( struct wmManipulatorGroup *mgroup, const char *name, const int style); -void ED_manipulator_arrow3d_set_direction(struct wmManipulator *manipulator, const float direction[3]); -void ED_manipulator_arrow3d_set_up_vector(struct wmManipulator *manipulator, const float direction[3]); -void ED_manipulator_arrow3d_set_line_len(struct wmManipulator *manipulator, const float len); -void ED_manipulator_arrow3d_set_ui_range(struct wmManipulator *manipulator, const float min, const float max); -void ED_manipulator_arrow3d_set_range_fac(struct wmManipulator *manipulator, const float range_fac); -void ED_manipulator_arrow3d_cone_set_aspect(struct wmManipulator *manipulator, const float aspect[2]); +void ED_manipulator_arrow3d_set_direction(struct wmManipulator *mpr, const float direction[3]); +void ED_manipulator_arrow3d_set_up_vector(struct wmManipulator *mpr, const float direction[3]); +void ED_manipulator_arrow3d_set_line_len(struct wmManipulator *mpr, const float len); +void ED_manipulator_arrow3d_set_ui_range(struct wmManipulator *mpr, const float min, const float max); +void ED_manipulator_arrow3d_set_range_fac(struct wmManipulator *mpr, const float range_fac); +void ED_manipulator_arrow3d_cone_set_aspect(struct wmManipulator *mpr, const float aspect[2]); /* -------------------------------------------------------------------- */ /* 2D Arrow Manipulator */ struct wmManipulator *ED_manipulator_arrow2d_new(struct wmManipulatorGroup *mgroup, const char *name); -void ED_manipulator_arrow2d_set_angle(struct wmManipulator *manipulator, const float rot_fac); -void ED_manipulator_arrow2d_set_line_len(struct wmManipulator *manipulator, const float len); +void ED_manipulator_arrow2d_set_angle(struct wmManipulator *mpr, const float rot_fac); +void ED_manipulator_arrow2d_set_line_len(struct wmManipulator *mpr, const float len); /* -------------------------------------------------------------------- */ @@ -89,15 +103,10 @@ enum { ED_MANIPULATOR_RECT_TRANSFORM_STYLE_SCALE_UNIFORM = (1 << 3), /* Manipulator scales uniformly */ }; -enum { - ED_MANIPULATOR_RECT_TX_SLOT_OFFSET = 0, - ED_MANIPULATOR_RECT_TX_SLOT_SCALE = 1 -}; - struct wmManipulator *ED_manipulator_rect_transform_new( struct wmManipulatorGroup *mgroup, const char *name, const int style); void ED_manipulator_rect_transform_set_dimensions( - struct wmManipulator *manipulator, const float width, const float height); + struct wmManipulator *mpr, const float width, const float height); /* -------------------------------------------------------------------- */ @@ -112,7 +121,7 @@ enum { struct wmManipulator *ED_manipulator_dial3d_new( struct wmManipulatorGroup *mgroup, const char *name, const int style); void ED_manipulator_dial3d_set_up_vector( - struct wmManipulator *manipulator, const float direction[3]); + struct wmManipulator *mpr, const float direction[3]); /* -------------------------------------------------------------------- */ @@ -121,7 +130,7 @@ void ED_manipulator_dial3d_set_up_vector( struct wmManipulator *ED_manipulator_facemap_new( struct wmManipulatorGroup *mgroup, const char *name, const int style, struct Object *ob, const int facemap); -struct bFaceMap *ED_manipulator_facemap_get_fmap(struct wmManipulator *manipulator); +struct bFaceMap *ED_manipulator_facemap_get_fmap(struct wmManipulator *mpr); /* -------------------------------------------------------------------- */ @@ -133,7 +142,7 @@ enum { struct wmManipulator *ED_manipulator_primitive3d_new( struct wmManipulatorGroup *mgroup, const char *name, const int style); -void ED_manipulator_primitive3d_set_direction(struct wmManipulator *manipulator, const float direction[3]); -void ED_manipulator_primitive3d_set_up_vector(struct wmManipulator *manipulator, const float direction[3]); +void ED_manipulator_primitive3d_set_direction(struct wmManipulator *mpr, const float direction[3]); +void ED_manipulator_primitive3d_set_up_vector(struct wmManipulator *mpr, const float direction[3]); #endif /* __ED_MANIPULATOR_LIBRARY_H__ */ diff --git a/source/blender/editors/include/ED_view3d.h b/source/blender/editors/include/ED_view3d.h index 667ca099305..69d27e30b1f 100644 --- a/source/blender/editors/include/ED_view3d.h +++ b/source/blender/editors/include/ED_view3d.h @@ -355,6 +355,8 @@ int ED_view3d_scene_layer_set(int lay, const int *values, int *active); struct RV3DMatrixStore *ED_view3d_mats_rv3d_backup(struct RegionView3D *rv3d); void ED_view3d_mats_rv3d_restore(struct RegionView3D *rv3d, struct RV3DMatrixStore *rv3dmat); +void ED_draw_object_facemap(struct Scene *scene, struct Object *ob, const float col[4], const int facemap); + bool ED_view3d_context_activate(struct bContext *C); void ED_view3d_draw_offscreen_init(struct Scene *scene, struct SceneLayer *sl, struct View3D *v3d); void ED_view3d_draw_offscreen( diff --git a/source/blender/editors/manipulator_library/CMakeLists.txt b/source/blender/editors/manipulator_library/CMakeLists.txt index bcb814e963f..1d1dcf8b725 100644 --- a/source/blender/editors/manipulator_library/CMakeLists.txt +++ b/source/blender/editors/manipulator_library/CMakeLists.txt @@ -44,6 +44,7 @@ set(SRC geom_arrow_manipulator.c geom_cube_manipulator.c manipulator_draw_utils.c + manipulator_library_presets.c manipulator_library_utils.c primitive3d_manipulator.c diff --git a/source/blender/editors/manipulator_library/arrow2d_manipulator.c b/source/blender/editors/manipulator_library/arrow2d_manipulator.c index 61827723752..1273710ff69 100644 --- a/source/blender/editors/manipulator_library/arrow2d_manipulator.c +++ b/source/blender/editors/manipulator_library/arrow2d_manipulator.c @@ -105,19 +105,19 @@ static void arrow2d_draw_geom(ArrowManipulator2D *arrow, const float origin[2], gpuPopMatrix(); } -static void manipulator_arrow2d_draw(const bContext *UNUSED(C), struct wmManipulator *manipulator) +static void manipulator_arrow2d_draw(const bContext *UNUSED(C), struct wmManipulator *mpr) { - ArrowManipulator2D *arrow = (ArrowManipulator2D *)manipulator; + ArrowManipulator2D *arrow = (ArrowManipulator2D *)mpr; float col[4]; - manipulator_color_get(manipulator, manipulator->state & WM_MANIPULATOR_STATE_HIGHLIGHT, col); + manipulator_color_get(mpr, mpr->state & WM_MANIPULATOR_STATE_HIGHLIGHT, col); - glLineWidth(manipulator->line_width); + glLineWidth(mpr->line_width); glEnable(GL_BLEND); - arrow2d_draw_geom(arrow, manipulator->origin, col); + arrow2d_draw_geom(arrow, mpr->origin, col); glDisable(GL_BLEND); - if (arrow->manipulator.interaction_data) { + if (mpr->interaction_data) { ManipulatorInteraction *inter = arrow->manipulator.interaction_data; glEnable(GL_BLEND); @@ -127,24 +127,24 @@ static void manipulator_arrow2d_draw(const bContext *UNUSED(C), struct wmManipul } static void manipulator_arrow2d_invoke( - bContext *UNUSED(C), struct wmManipulator *manipulator, const wmEvent *UNUSED(event)) + bContext *UNUSED(C), struct wmManipulator *mpr, const wmEvent *UNUSED(event)) { ManipulatorInteraction *inter = MEM_callocN(sizeof(ManipulatorInteraction), __func__); - copy_v2_v2(inter->init_origin, manipulator->origin); - manipulator->interaction_data = inter; + copy_v2_v2(inter->init_origin, mpr->origin); + mpr->interaction_data = inter; } -static int manipulator_arrow2d_intersect( - bContext *UNUSED(C), struct wmManipulator *manipulator, const wmEvent *event) +static int manipulator_arrow2d_test_select( + bContext *UNUSED(C), struct wmManipulator *mpr, const wmEvent *event) { - ArrowManipulator2D *arrow = (ArrowManipulator2D *)manipulator; + ArrowManipulator2D *arrow = (ArrowManipulator2D *)mpr; const float mval[2] = {event->mval[0], event->mval[1]}; - const float line_len = arrow->line_len * manipulator->scale; + const float line_len = arrow->line_len * mpr->scale; float mval_local[2]; copy_v2_v2(mval_local, mval); - sub_v2_v2(mval_local, manipulator->origin); + sub_v2_v2(mval_local, mpr->origin); float line[2][2]; line[0][0] = line[0][1] = line[1][0] = 0.0f; @@ -160,7 +160,7 @@ static int manipulator_arrow2d_intersect( /* arrow line intersection check */ float isect_1[2], isect_2[2]; const int isect = isect_line_sphere_v2( - line[0], line[1], mval_local, MANIPULATOR_HOTSPOT + manipulator->line_width * 0.5f, + line[0], line[1], mval_local, MANIPULATOR_HOTSPOT + mpr->line_width * 0.5f, isect_1, isect_2); if (isect > 0) { @@ -190,8 +190,8 @@ static int manipulator_arrow2d_intersect( struct wmManipulator *ED_manipulator_arrow2d_new(wmManipulatorGroup *mgroup, const char *name) { - const wmManipulatorType *mpt = WM_manipulatortype_find("MANIPULATOR_WT_arrow_2d", false); - ArrowManipulator2D *arrow = (ArrowManipulator2D *)WM_manipulator_new(mpt, mgroup, name); + ArrowManipulator2D *arrow = (ArrowManipulator2D *)WM_manipulator_new( + "MANIPULATOR_WT_arrow_2d", mgroup, name); arrow->manipulator.flag |= WM_MANIPULATOR_DRAW_ACTIVE; @@ -200,15 +200,15 @@ struct wmManipulator *ED_manipulator_arrow2d_new(wmManipulatorGroup *mgroup, con return &arrow->manipulator; } -void ED_manipulator_arrow2d_set_angle(struct wmManipulator *manipulator, const float angle) +void ED_manipulator_arrow2d_set_angle(struct wmManipulator *mpr, const float angle) { - ArrowManipulator2D *arrow = (ArrowManipulator2D *)manipulator; + ArrowManipulator2D *arrow = (ArrowManipulator2D *)mpr; arrow->angle = angle; } -void ED_manipulator_arrow2d_set_line_len(struct wmManipulator *manipulator, const float len) +void ED_manipulator_arrow2d_set_line_len(struct wmManipulator *mpr, const float len) { - ArrowManipulator2D *arrow = (ArrowManipulator2D *)manipulator; + ArrowManipulator2D *arrow = (ArrowManipulator2D *)mpr; arrow->line_len = len; } @@ -220,9 +220,9 @@ static void MANIPULATOR_WT_arrow_2d(wmManipulatorType *wt) /* api callbacks */ wt->draw = manipulator_arrow2d_draw; wt->invoke = manipulator_arrow2d_invoke; - wt->intersect = manipulator_arrow2d_intersect; + wt->test_select = manipulator_arrow2d_test_select; - wt->size = sizeof(ArrowManipulator2D); + wt->struct_size = sizeof(ArrowManipulator2D); } void ED_manipulatortypes_arrow_2d(void) diff --git a/source/blender/editors/manipulator_library/arrow3d_manipulator.c b/source/blender/editors/manipulator_library/arrow3d_manipulator.c index 87e26aeba66..a2a2feb811c 100644 --- a/source/blender/editors/manipulator_library/arrow3d_manipulator.c +++ b/source/blender/editors/manipulator_library/arrow3d_manipulator.c @@ -90,9 +90,9 @@ typedef struct ArrowManipulator3D { /* -------------------------------------------------------------------- */ -static void manipulator_arrow_get_final_pos(wmManipulator *manipulator, float r_pos[3]) +static void manipulator_arrow_get_final_pos(wmManipulator *mpr, float r_pos[3]) { - ArrowManipulator3D *arrow = (ArrowManipulator3D *)manipulator; + ArrowManipulator3D *arrow = (ArrowManipulator3D *)mpr; mul_v3_v3fl(r_pos, arrow->direction, arrow->data.offset); add_v3_v3(r_pos, arrow->manipulator.origin); @@ -239,26 +239,26 @@ static void arrow_draw_intern(ArrowManipulator3D *arrow, const bool select, cons } static void manipulator_arrow_render_3d_intersect( - const bContext *UNUSED(C), wmManipulator *manipulator, + const bContext *UNUSED(C), wmManipulator *mpr, int selectionbase) { GPU_select_load_id(selectionbase); - arrow_draw_intern((ArrowManipulator3D *)manipulator, true, false); + arrow_draw_intern((ArrowManipulator3D *)mpr, true, false); } -static void manipulator_arrow_draw(const bContext *UNUSED(C), wmManipulator *manipulator) +static void manipulator_arrow_draw(const bContext *UNUSED(C), wmManipulator *mpr) { - arrow_draw_intern((ArrowManipulator3D *)manipulator, false, (manipulator->state & WM_MANIPULATOR_STATE_HIGHLIGHT) != 0); + arrow_draw_intern((ArrowManipulator3D *)mpr, false, (mpr->state & WM_MANIPULATOR_STATE_HIGHLIGHT) != 0); } /** * Calculate arrow offset independent from prop min value, * meaning the range will not be offset by min value first. */ -static void manipulator_arrow_handler(bContext *C, wmManipulator *manipulator, const wmEvent *event, const int flag) +static void manipulator_arrow_modal(bContext *C, wmManipulator *mpr, const wmEvent *event, const int flag) { - ArrowManipulator3D *arrow = (ArrowManipulator3D *)manipulator; - ManipulatorInteraction *inter = manipulator->interaction_data; + ArrowManipulator3D *arrow = (ArrowManipulator3D *)mpr; + ManipulatorInteraction *inter = mpr->interaction_data; ARegion *ar = CTX_wm_region(C); RegionView3D *rv3d = ar->regiondata; @@ -343,18 +343,19 @@ static void manipulator_arrow_handler(bContext *C, wmManipulator *manipulator, c ManipulatorCommonData *data = &arrow->data; const float ofs_new = facdir * len_v3(offset); - const int slot = ED_MANIPULATOR_ARROW_SLOT_OFS_WORLD_SPACE; + + wmManipulatorProperty *mpr_prop = WM_manipulator_get_property(mpr, "offset"); /* set the property for the operator and call its modal function */ - if (manipulator->props[slot]) { + if (mpr_prop->prop != NULL) { const bool constrained = arrow->style & ED_MANIPULATOR_ARROW_STYLE_CONSTRAINED; const bool inverted = arrow->style & ED_MANIPULATOR_ARROW_STYLE_INVERTED; const bool use_precision = flag & WM_MANIPULATOR_TWEAK_PRECISE; float value = manipulator_value_from_offset(data, inter, ofs_new, constrained, inverted, use_precision); - manipulator_property_value_set(C, manipulator, slot, value); + manipulator_property_value_set(C, mpr, mpr_prop, value); /* get clamped value */ - value = manipulator_property_value_get(manipulator, slot); + value = manipulator_property_value_get(mpr, mpr_prop); data->offset = manipulator_offset_from_value(data, value, constrained, inverted); } @@ -369,15 +370,15 @@ static void manipulator_arrow_handler(bContext *C, wmManipulator *manipulator, c static void manipulator_arrow_invoke( - bContext *UNUSED(C), wmManipulator *manipulator, const wmEvent *event) + bContext *UNUSED(C), wmManipulator *mpr, const wmEvent *event) { - ArrowManipulator3D *arrow = (ArrowManipulator3D *)manipulator; + ArrowManipulator3D *arrow = (ArrowManipulator3D *)mpr; ManipulatorInteraction *inter = MEM_callocN(sizeof(ManipulatorInteraction), __func__); - PointerRNA ptr = manipulator->ptr[ED_MANIPULATOR_ARROW_SLOT_OFS_WORLD_SPACE]; - PropertyRNA *prop = manipulator->props[ED_MANIPULATOR_ARROW_SLOT_OFS_WORLD_SPACE]; + wmManipulatorProperty *mpr_prop = WM_manipulator_get_property(mpr, "offset"); - if (prop) { - inter->init_value = RNA_property_float_get(&ptr, prop); + /* Some manipulators don't use properties. */ + if (mpr_prop && mpr_prop->prop) { + inter->init_value = RNA_property_float_get(&mpr_prop->ptr, mpr_prop->prop); } inter->init_offset = arrow->data.offset; @@ -385,32 +386,33 @@ static void manipulator_arrow_invoke( inter->init_mval[0] = event->mval[0]; inter->init_mval[1] = event->mval[1]; - inter->init_scale = manipulator->scale; + inter->init_scale = mpr->scale; - manipulator_arrow_get_final_pos(manipulator, inter->init_origin); + manipulator_arrow_get_final_pos(mpr, inter->init_origin); - manipulator->interaction_data = inter; + mpr->interaction_data = inter; } -static void manipulator_arrow_prop_data_update(wmManipulator *manipulator, const int slot) +static void manipulator_arrow_property_update(wmManipulator *mnp, wmManipulatorProperty *mpr_prop) { - ArrowManipulator3D *arrow = (ArrowManipulator3D *)manipulator; + ArrowManipulator3D *arrow = (ArrowManipulator3D *)mnp; manipulator_property_data_update( - manipulator, &arrow->data, slot, + mnp, &arrow->data, mpr_prop, (arrow->style & ED_MANIPULATOR_ARROW_STYLE_CONSTRAINED) != 0, (arrow->style & ED_MANIPULATOR_ARROW_STYLE_INVERTED) != 0); } -static void manipulator_arrow_exit(bContext *C, wmManipulator *manipulator, const bool cancel) +static void manipulator_arrow_exit(bContext *C, wmManipulator *mpr, const bool cancel) { if (!cancel) return; - ArrowManipulator3D *arrow = (ArrowManipulator3D *)manipulator; + ArrowManipulator3D *arrow = (ArrowManipulator3D *)mpr; ManipulatorCommonData *data = &arrow->data; - ManipulatorInteraction *inter = manipulator->interaction_data; + ManipulatorInteraction *inter = mpr->interaction_data; - manipulator_property_value_reset(C, manipulator, inter, ED_MANIPULATOR_ARROW_SLOT_OFS_WORLD_SPACE); + wmManipulatorProperty *mpr_prop = WM_manipulator_get_property(mpr, "offset"); + manipulator_property_value_reset(C, mpr, inter, mpr_prop); data->offset = inter->init_offset; } @@ -422,8 +424,8 @@ static void manipulator_arrow_exit(bContext *C, wmManipulator *manipulator, cons wmManipulator *ED_manipulator_arrow3d_new(wmManipulatorGroup *mgroup, const char *name, const int style) { - const wmManipulatorType *mpt = WM_manipulatortype_find("MANIPULATOR_WT_arrow_3d", false); - ArrowManipulator3D *arrow = (ArrowManipulator3D *)WM_manipulator_new(mpt, mgroup, name); + ArrowManipulator3D *arrow = (ArrowManipulator3D *)WM_manipulator_new( + "MANIPULATOR_WT_arrow_3d", mgroup, name); int real_style = style; @@ -447,9 +449,9 @@ wmManipulator *ED_manipulator_arrow3d_new(wmManipulatorGroup *mgroup, const char /** * Define direction the arrow will point towards */ -void ED_manipulator_arrow3d_set_direction(wmManipulator *manipulator, const float direction[3]) +void ED_manipulator_arrow3d_set_direction(wmManipulator *mpr, const float direction[3]) { - ArrowManipulator3D *arrow = (ArrowManipulator3D *)manipulator; + ArrowManipulator3D *arrow = (ArrowManipulator3D *)mpr; copy_v3_v3(arrow->direction, direction); normalize_v3(arrow->direction); @@ -458,9 +460,9 @@ void ED_manipulator_arrow3d_set_direction(wmManipulator *manipulator, const floa /** * Define up-direction of the arrow manipulator */ -void ED_manipulator_arrow3d_set_up_vector(wmManipulator *manipulator, const float direction[3]) +void ED_manipulator_arrow3d_set_up_vector(wmManipulator *mpr, const float direction[3]) { - ArrowManipulator3D *arrow = (ArrowManipulator3D *)manipulator; + ArrowManipulator3D *arrow = (ArrowManipulator3D *)mpr; if (direction) { copy_v3_v3(arrow->up, direction); @@ -475,24 +477,24 @@ void ED_manipulator_arrow3d_set_up_vector(wmManipulator *manipulator, const floa /** * Define a custom arrow line length */ -void ED_manipulator_arrow3d_set_line_len(wmManipulator *manipulator, const float len) +void ED_manipulator_arrow3d_set_line_len(wmManipulator *mpr, const float len) { - ArrowManipulator3D *arrow = (ArrowManipulator3D *)manipulator; + ArrowManipulator3D *arrow = (ArrowManipulator3D *)mpr; arrow->len = len; } /** * Define a custom property UI range * - * \note Needs to be called before WM_manipulator_set_property! + * \note Needs to be called before WM_manipulator_def_property! */ -void ED_manipulator_arrow3d_set_ui_range(wmManipulator *manipulator, const float min, const float max) +void ED_manipulator_arrow3d_set_ui_range(wmManipulator *mpr, const float min, const float max) { - ArrowManipulator3D *arrow = (ArrowManipulator3D *)manipulator; + ArrowManipulator3D *arrow = (ArrowManipulator3D *)mpr; BLI_assert(min < max); - BLI_assert(!(arrow->manipulator.props[0] && "Make sure this function " - "is called before WM_manipulator_set_property")); + BLI_assert(!(WM_manipulator_get_property(mpr, "offset") && "Make sure this function " + "is called before WM_manipulator_def_property")); arrow->data.range = max - min; arrow->data.min = min; @@ -502,14 +504,13 @@ void ED_manipulator_arrow3d_set_ui_range(wmManipulator *manipulator, const float /** * Define a custom factor for arrow min/max distance * - * \note Needs to be called before WM_manipulator_set_property! + * \note Needs to be called before WM_manipulator_def_property! */ -void ED_manipulator_arrow3d_set_range_fac(wmManipulator *manipulator, const float range_fac) +void ED_manipulator_arrow3d_set_range_fac(wmManipulator *mpr, const float range_fac) { - ArrowManipulator3D *arrow = (ArrowManipulator3D *)manipulator; - - BLI_assert(!(arrow->manipulator.props[0] && "Make sure this function " - "is called before WM_manipulator_set_property")); + ArrowManipulator3D *arrow = (ArrowManipulator3D *)mpr; + BLI_assert(!(WM_manipulator_get_property(mpr, "offset") && "Make sure this function " + "is called before WM_manipulator_def_property")); arrow->data.range_fac = range_fac; } @@ -517,9 +518,9 @@ void ED_manipulator_arrow3d_set_range_fac(wmManipulator *manipulator, const floa /** * Define xy-aspect for arrow cone */ -void ED_manipulator_arrow3d_cone_set_aspect(wmManipulator *manipulator, const float aspect[2]) +void ED_manipulator_arrow3d_cone_set_aspect(wmManipulator *mpr, const float aspect[2]) { - ArrowManipulator3D *arrow = (ArrowManipulator3D *)manipulator; + ArrowManipulator3D *arrow = (ArrowManipulator3D *)mpr; copy_v2_v2(arrow->aspect, aspect); } @@ -533,13 +534,12 @@ static void MANIPULATOR_WT_arrow_3d(wmManipulatorType *wt) wt->draw = manipulator_arrow_draw; wt->draw_select = manipulator_arrow_render_3d_intersect; wt->position_get = manipulator_arrow_get_final_pos; - wt->intersect = NULL; - wt->handler = manipulator_arrow_handler; + wt->modal = manipulator_arrow_modal; wt->invoke = manipulator_arrow_invoke; - wt->prop_data_update = manipulator_arrow_prop_data_update; + wt->property_update = manipulator_arrow_property_update; wt->exit = manipulator_arrow_exit; - wt->size = sizeof(ArrowManipulator3D); + wt->struct_size = sizeof(ArrowManipulator3D); } void ED_manipulatortypes_arrow_3d(void) diff --git a/source/blender/editors/manipulator_library/cage2d_manipulator.c b/source/blender/editors/manipulator_library/cage2d_manipulator.c index 97b4e451bc7..6bfa81e056b 100644 --- a/source/blender/editors/manipulator_library/cage2d_manipulator.c +++ b/source/blender/editors/manipulator_library/cage2d_manipulator.c @@ -62,7 +62,7 @@ //#include "wm_manipulator_intern.h" -/* wmManipulator->highlighted_part */ +/* wmManipulator->highlight_part */ enum { ED_MANIPULATOR_RECT_TRANSFORM_INTERSECT_TRANSLATE = 1, ED_MANIPULATOR_RECT_TRANSFORM_INTERSECT_SCALEX_LEFT = 2, @@ -203,9 +203,9 @@ static void rect_transform_draw_interaction( immUnbindProgram(); } -static void manipulator_rect_transform_draw(const bContext *UNUSED(C), wmManipulator *manipulator) +static void manipulator_rect_transform_draw(const bContext *UNUSED(C), wmManipulator *mpr) { - RectTransformManipulator *cage = (RectTransformManipulator *)manipulator; + RectTransformManipulator *cage = (RectTransformManipulator *)mpr; rctf r; float w = cage->w; float h = cage->h; @@ -219,8 +219,8 @@ static void manipulator_rect_transform_draw(const bContext *UNUSED(C), wmManipul r.ymax = half_h; gpuPushMatrix(); - gpuTranslate2f(manipulator->origin[0] + manipulator->offset[0], - manipulator->origin[1] + manipulator->offset[1]); + gpuTranslate2f(mpr->origin[0] + mpr->offset[0], + mpr->origin[1] + mpr->offset[1]); if (cage->style & ED_MANIPULATOR_RECT_TRANSFORM_STYLE_SCALE_UNIFORM) gpuScaleUniform(cage->scale[0]); else @@ -235,24 +235,25 @@ static void manipulator_rect_transform_draw(const bContext *UNUSED(C), wmManipul ((cage->style & ED_MANIPULATOR_RECT_TRANSFORM_STYLE_SCALE_UNIFORM) ? cage->scale[0] : cage->scale[1])); /* corner manipulators */ - glLineWidth(cage->manipulator.line_width + 3.0f); + glLineWidth(mpr->line_width + 3.0f); rect_transform_draw_corners(&r, w, h, (const float[3]){0, 0, 0}); /* corner manipulators */ - glLineWidth(cage->manipulator.line_width); - rect_transform_draw_corners(&r, w, h, manipulator->col); + glLineWidth(mpr->line_width); + rect_transform_draw_corners(&r, w, h, mpr->color); - rect_transform_draw_interaction(manipulator->col, manipulator->highlighted_part, half_w, half_h, - w, h, cage->manipulator.line_width); + rect_transform_draw_interaction( + mpr->color, mpr->highlight_part, half_w, half_h, + w, h, mpr->line_width); glLineWidth(1.0); gpuPopMatrix(); } -static int manipulator_rect_transform_get_cursor(wmManipulator *manipulator) +static int manipulator_rect_transform_get_cursor(wmManipulator *mpr) { - switch (manipulator->highlighted_part) { + switch (mpr->highlight_part) { case ED_MANIPULATOR_RECT_TRANSFORM_INTERSECT_TRANSLATE: return BC_HANDCURSOR; case ED_MANIPULATOR_RECT_TRANSFORM_INTERSECT_SCALEX_LEFT: @@ -266,10 +267,10 @@ static int manipulator_rect_transform_get_cursor(wmManipulator *manipulator) } } -static int manipulator_rect_transform_intersect( - bContext *UNUSED(C), wmManipulator *manipulator, const wmEvent *event) +static int manipulator_rect_transform_test_select( + bContext *UNUSED(C), wmManipulator *mpr, const wmEvent *event) { - RectTransformManipulator *cage = (RectTransformManipulator *)manipulator; + RectTransformManipulator *cage = (RectTransformManipulator *)mpr; const float mouse[2] = {event->mval[0], event->mval[1]}; //float matrot[2][2]; float point_local[2]; @@ -280,9 +281,9 @@ static int manipulator_rect_transform_intersect( float aspx = 1.0f, aspy = 1.0f; /* rotate mouse in relation to the center and relocate it */ - sub_v2_v2v2(point_local, mouse, manipulator->origin); - point_local[0] -= manipulator->offset[0]; - point_local[1] -= manipulator->offset[1]; + sub_v2_v2v2(point_local, mouse, mpr->origin); + point_local[0] -= mpr->offset[0]; + point_local[1] -= mpr->offset[1]; //rotate_m2(matrot, -cage->transform.rotation); if (cage->style & ED_MANIPULATOR_RECT_TRANSFORM_STYLE_SCALE_UNIFORM) @@ -365,82 +366,86 @@ typedef struct RectTransformInteraction { float orig_scale[2]; } RectTransformInteraction; -static bool manipulator_rect_transform_get_prop_value(wmManipulator *manipulator, const int slot, float *value) +static bool manipulator_rect_transform_get_prop_value( + wmManipulator *mnp, wmManipulatorProperty *mpr_prop, float *value) { - PropertyType type = RNA_property_type(manipulator->props[slot]); + PropertyType type = RNA_property_type(mpr_prop->prop); if (type != PROP_FLOAT) { fprintf(stderr, "Rect Transform manipulator can only be bound to float properties"); return false; } else { - if (slot == ED_MANIPULATOR_RECT_TX_SLOT_OFFSET) { - if (RNA_property_array_length(&manipulator->ptr[slot], manipulator->props[slot]) != 2) { + if (STREQ(mpr_prop->idname, "offset")) { + if (RNA_property_array_length(&mpr_prop->ptr, mpr_prop->prop) != 2) { fprintf(stderr, "Rect Transform manipulator offset not only be bound to array float property"); return false; } - RNA_property_float_get_array(&manipulator->ptr[slot], manipulator->props[slot], value); + RNA_property_float_get_array(&mpr_prop->ptr, mpr_prop->prop, value); } - else if (slot == ED_MANIPULATOR_RECT_TX_SLOT_SCALE) { - RectTransformManipulator *cage = (RectTransformManipulator *)manipulator; + else if (STREQ(mpr_prop->idname, "scale")) { + RectTransformManipulator *cage = (RectTransformManipulator *)mnp; if (cage->style & ED_MANIPULATOR_RECT_TRANSFORM_STYLE_SCALE_UNIFORM) { - *value = RNA_property_float_get(&manipulator->ptr[slot], manipulator->props[slot]); + *value = RNA_property_float_get(&mpr_prop->ptr, mpr_prop->prop); } else { - if (RNA_property_array_length(&manipulator->ptr[slot], manipulator->props[slot]) != 2) { + if (RNA_property_array_length(&mpr_prop->ptr, mpr_prop->prop) != 2) { fprintf(stderr, "Rect Transform manipulator scale not only be bound to array float property"); return false; } - RNA_property_float_get_array(&manipulator->ptr[slot], manipulator->props[slot], value); + RNA_property_float_get_array(&mpr_prop->ptr, mpr_prop->prop, value); } } + else { + BLI_assert(0); + } } return true; } static void manipulator_rect_transform_invoke( - bContext *UNUSED(C), wmManipulator *manipulator, const wmEvent *event) + bContext *UNUSED(C), wmManipulator *mpr, const wmEvent *event) { - RectTransformManipulator *cage = (RectTransformManipulator *)manipulator; + RectTransformManipulator *cage = (RectTransformManipulator *)mpr; RectTransformInteraction *data = MEM_callocN(sizeof(RectTransformInteraction), "cage_interaction"); - copy_v2_v2(data->orig_offset, manipulator->offset); + copy_v2_v2(data->orig_offset, mpr->offset); copy_v2_v2(data->orig_scale, cage->scale); data->orig_mouse[0] = event->mval[0]; data->orig_mouse[1] = event->mval[1]; - manipulator->interaction_data = data; + mpr->interaction_data = data; } -static void manipulator_rect_transform_handler( - bContext *C, wmManipulator *manipulator, const wmEvent *event, +static void manipulator_rect_transform_modal( + bContext *C, wmManipulator *mpr, const wmEvent *event, const int UNUSED(flag)) { - RectTransformManipulator *cage = (RectTransformManipulator *)manipulator; - RectTransformInteraction *data = manipulator->interaction_data; + RectTransformManipulator *cage = (RectTransformManipulator *)mpr; + RectTransformInteraction *data = mpr->interaction_data; /* needed here as well in case clamping occurs */ - const float orig_ofx = manipulator->offset[0], orig_ofy = manipulator->offset[1]; + const float orig_ofx = mpr->offset[0], orig_ofy = mpr->offset[1]; const float valuex = (event->mval[0] - data->orig_mouse[0]); const float valuey = (event->mval[1] - data->orig_mouse[1]); - if (manipulator->highlighted_part == ED_MANIPULATOR_RECT_TRANSFORM_INTERSECT_TRANSLATE) { - manipulator->offset[0] = data->orig_offset[0] + valuex; - manipulator->offset[1] = data->orig_offset[1] + valuey; + if (mpr->highlight_part == ED_MANIPULATOR_RECT_TRANSFORM_INTERSECT_TRANSLATE) { + mpr->offset[0] = data->orig_offset[0] + valuex; + mpr->offset[1] = data->orig_offset[1] + valuey; } - else if (manipulator->highlighted_part == ED_MANIPULATOR_RECT_TRANSFORM_INTERSECT_SCALEX_LEFT) { - manipulator->offset[0] = data->orig_offset[0] + valuex / 2.0; + else if (mpr->highlight_part == ED_MANIPULATOR_RECT_TRANSFORM_INTERSECT_SCALEX_LEFT) { + mpr->offset[0] = data->orig_offset[0] + valuex / 2.0; cage->scale[0] = (cage->w * data->orig_scale[0] - valuex) / cage->w; } - else if (manipulator->highlighted_part == ED_MANIPULATOR_RECT_TRANSFORM_INTERSECT_SCALEX_RIGHT) { - manipulator->offset[0] = data->orig_offset[0] + valuex / 2.0; + else if (mpr->highlight_part == ED_MANIPULATOR_RECT_TRANSFORM_INTERSECT_SCALEX_RIGHT) { + mpr->offset[0] = data->orig_offset[0] + valuex / 2.0; cage->scale[0] = (cage->w * data->orig_scale[0] + valuex) / cage->w; } - else if (manipulator->highlighted_part == ED_MANIPULATOR_RECT_TRANSFORM_INTERSECT_SCALEY_DOWN) { - manipulator->offset[1] = data->orig_offset[1] + valuey / 2.0; + else if (mpr->highlight_part == ED_MANIPULATOR_RECT_TRANSFORM_INTERSECT_SCALEY_DOWN) { + mpr->offset[1] = data->orig_offset[1] + valuey / 2.0; if (cage->style & ED_MANIPULATOR_RECT_TRANSFORM_STYLE_SCALE_UNIFORM) { cage->scale[0] = (cage->h * data->orig_scale[0] - valuey) / cage->h; @@ -449,8 +454,8 @@ static void manipulator_rect_transform_handler( cage->scale[1] = (cage->h * data->orig_scale[1] - valuey) / cage->h; } } - else if (manipulator->highlighted_part == ED_MANIPULATOR_RECT_TRANSFORM_INTERSECT_SCALEY_UP) { - manipulator->offset[1] = data->orig_offset[1] + valuey / 2.0; + else if (mpr->highlight_part == ED_MANIPULATOR_RECT_TRANSFORM_INTERSECT_SCALEY_UP) { + mpr->offset[1] = data->orig_offset[1] + valuey / 2.0; if (cage->style & ED_MANIPULATOR_RECT_TRANSFORM_STYLE_SCALE_UNIFORM) { cage->scale[0] = (cage->h * data->orig_scale[0] + valuey) / cage->h; @@ -466,83 +471,85 @@ static void manipulator_rect_transform_handler( cage->scale[0] < MANIPULATOR_RECT_MIN_WIDTH / cage->w) { cage->scale[0] = max_ff(MANIPULATOR_RECT_MIN_WIDTH / cage->h, MANIPULATOR_RECT_MIN_WIDTH / cage->w); - manipulator->offset[0] = orig_ofx; - manipulator->offset[1] = orig_ofy; + mpr->offset[0] = orig_ofx; + mpr->offset[1] = orig_ofy; } } else { if (cage->scale[0] < MANIPULATOR_RECT_MIN_WIDTH / cage->w) { cage->scale[0] = MANIPULATOR_RECT_MIN_WIDTH / cage->w; - manipulator->offset[0] = orig_ofx; + mpr->offset[0] = orig_ofx; } if (cage->scale[1] < MANIPULATOR_RECT_MIN_WIDTH / cage->h) { cage->scale[1] = MANIPULATOR_RECT_MIN_WIDTH / cage->h; - manipulator->offset[1] = orig_ofy; + mpr->offset[1] = orig_ofy; } } - if (manipulator->props[ED_MANIPULATOR_RECT_TX_SLOT_OFFSET]) { - PointerRNA ptr = manipulator->ptr[ED_MANIPULATOR_RECT_TX_SLOT_OFFSET]; - PropertyRNA *prop = manipulator->props[ED_MANIPULATOR_RECT_TX_SLOT_OFFSET]; + wmManipulatorProperty *mpr_prop; - RNA_property_float_set_array(&ptr, prop, manipulator->offset); - RNA_property_update(C, &ptr, prop); + mpr_prop = WM_manipulator_get_property(mpr, "offset"); + if (mpr_prop->prop != NULL) { + RNA_property_float_set_array(&mpr_prop->ptr, mpr_prop->prop, mpr->offset); + RNA_property_update(C, &mpr_prop->ptr, mpr_prop->prop); } - if (manipulator->props[ED_MANIPULATOR_RECT_TX_SLOT_SCALE]) { - PointerRNA ptr = manipulator->ptr[ED_MANIPULATOR_RECT_TX_SLOT_SCALE]; - PropertyRNA *prop = manipulator->props[ED_MANIPULATOR_RECT_TX_SLOT_SCALE]; - + mpr_prop = WM_manipulator_get_property(mpr, "scale"); + if (mpr_prop->prop != NULL) { if (cage->style & ED_MANIPULATOR_RECT_TRANSFORM_STYLE_SCALE_UNIFORM) { - RNA_property_float_set(&ptr, prop, cage->scale[0]); + RNA_property_float_set(&mpr_prop->ptr, mpr_prop->prop, cage->scale[0]); } else { - RNA_property_float_set_array(&ptr, prop, cage->scale); + RNA_property_float_set_array(&mpr_prop->ptr, mpr_prop->prop, cage->scale); } - RNA_property_update(C, &ptr, prop); + RNA_property_update(C, &mpr_prop->ptr, mpr_prop->prop); } /* tag the region for redraw */ ED_region_tag_redraw(CTX_wm_region(C)); } -static void manipulator_rect_transform_prop_data_update(wmManipulator *manipulator, const int slot) +static void manipulator_rect_transform_property_update(wmManipulator *mnp, wmManipulatorProperty *mpr_prop) { - RectTransformManipulator *cage = (RectTransformManipulator *)manipulator; + RectTransformManipulator *cage = (RectTransformManipulator *)mnp; - if (slot == ED_MANIPULATOR_RECT_TX_SLOT_OFFSET) - manipulator_rect_transform_get_prop_value(manipulator, ED_MANIPULATOR_RECT_TX_SLOT_OFFSET, manipulator->offset); - if (slot == ED_MANIPULATOR_RECT_TX_SLOT_SCALE) - manipulator_rect_transform_get_prop_value(manipulator, ED_MANIPULATOR_RECT_TX_SLOT_SCALE, cage->scale); + if (STREQ(mpr_prop->idname, "offset")) { + manipulator_rect_transform_get_prop_value(mnp, mpr_prop, mnp->offset); + } + else if (STREQ(mpr_prop->idname, "scale")) { + manipulator_rect_transform_get_prop_value(mnp, mpr_prop, cage->scale); + } + else { + BLI_assert(0); + } } -static void manipulator_rect_transform_exit(bContext *C, wmManipulator *manipulator, const bool cancel) +static void manipulator_rect_transform_exit(bContext *C, wmManipulator *mpr, const bool cancel) { - RectTransformManipulator *cage = (RectTransformManipulator *)manipulator; - RectTransformInteraction *data = manipulator->interaction_data; + RectTransformManipulator *cage = (RectTransformManipulator *)mpr; + RectTransformInteraction *data = mpr->interaction_data; if (!cancel) return; - /* reset properties */ - if (manipulator->props[ED_MANIPULATOR_RECT_TX_SLOT_OFFSET]) { - PointerRNA ptr = manipulator->ptr[ED_MANIPULATOR_RECT_TX_SLOT_OFFSET]; - PropertyRNA *prop = manipulator->props[ED_MANIPULATOR_RECT_TX_SLOT_OFFSET]; + wmManipulatorProperty *mpr_prop; - RNA_property_float_set_array(&ptr, prop, data->orig_offset); - RNA_property_update(C, &ptr, prop); + /* reset properties */ + mpr_prop = WM_manipulator_get_property(mpr, "offset"); + if (mpr_prop->prop != NULL) { + RNA_property_float_set_array(&mpr_prop->ptr, mpr_prop->prop, data->orig_offset); + RNA_property_update(C, &mpr_prop->ptr, mpr_prop->prop); } - if (manipulator->props[ED_MANIPULATOR_RECT_TX_SLOT_SCALE]) { - PointerRNA ptr = manipulator->ptr[ED_MANIPULATOR_RECT_TX_SLOT_SCALE]; - PropertyRNA *prop = manipulator->props[ED_MANIPULATOR_RECT_TX_SLOT_SCALE]; + mpr_prop = WM_manipulator_get_property(mpr, "scale"); + if (mpr_prop->prop != NULL) { if (cage->style & ED_MANIPULATOR_RECT_TRANSFORM_STYLE_SCALE_UNIFORM) { - RNA_property_float_set(&ptr, prop, data->orig_scale[0]); + RNA_property_float_set(&mpr_prop->ptr, mpr_prop->prop, data->orig_scale[0]); } else { - RNA_property_float_set_array(&ptr, prop, data->orig_scale); + RNA_property_float_set_array(&mpr_prop->ptr, mpr_prop->prop, data->orig_scale); } - RNA_property_update(C, &ptr, prop); + RNA_property_update(C, &mpr_prop->ptr, mpr_prop->prop); } } @@ -554,8 +561,8 @@ static void manipulator_rect_transform_exit(bContext *C, wmManipulator *manipula wmManipulator *ED_manipulator_rect_transform_new(wmManipulatorGroup *mgroup, const char *name, const int style) { - const wmManipulatorType *mpt = WM_manipulatortype_find("MANIPULATOR_WT_cage", false); - RectTransformManipulator *cage = (RectTransformManipulator *)WM_manipulator_new(mpt, mgroup, name); + RectTransformManipulator *cage = (RectTransformManipulator *)WM_manipulator_new( + "MANIPULATOR_WT_cage", mgroup, name); cage->manipulator.flag |= WM_MANIPULATOR_DRAW_ACTIVE; cage->scale[0] = cage->scale[1] = 1.0f; @@ -564,9 +571,9 @@ wmManipulator *ED_manipulator_rect_transform_new(wmManipulatorGroup *mgroup, con return &cage->manipulator; } -void ED_manipulator_rect_transform_set_dimensions(wmManipulator *manipulator, const float width, const float height) +void ED_manipulator_rect_transform_set_dimensions(wmManipulator *mpr, const float width, const float height) { - RectTransformManipulator *cage = (RectTransformManipulator *)manipulator; + RectTransformManipulator *cage = (RectTransformManipulator *)mpr; cage->w = width; cage->h = height; } @@ -579,15 +586,13 @@ static void MANIPULATOR_WT_cage(wmManipulatorType *wt) /* api callbacks */ wt->draw = manipulator_rect_transform_draw; wt->invoke = manipulator_rect_transform_invoke; - wt->prop_data_update = manipulator_rect_transform_prop_data_update; - wt->handler = manipulator_rect_transform_handler; - wt->intersect = manipulator_rect_transform_intersect; + wt->property_update = manipulator_rect_transform_property_update; + wt->modal = manipulator_rect_transform_modal; + wt->test_select = manipulator_rect_transform_test_select; wt->exit = manipulator_rect_transform_exit; wt->cursor_get = manipulator_rect_transform_get_cursor; - wt->prop_len_max = 2; - - wt->size = sizeof(RectTransformManipulator); + wt->struct_size = sizeof(RectTransformManipulator); } void ED_manipulatortypes_cage_2d(void) diff --git a/source/blender/editors/manipulator_library/dial3d_manipulator.c b/source/blender/editors/manipulator_library/dial3d_manipulator.c index 5097c8cab6f..2d5266647e0 100644 --- a/source/blender/editors/manipulator_library/dial3d_manipulator.c +++ b/source/blender/editors/manipulator_library/dial3d_manipulator.c @@ -259,9 +259,9 @@ static void dial_draw_intern( gpuPopMatrix(); } -static void manipulator_dial_render_3d_intersect(const bContext *C, wmManipulator *manipulator, int selectionbase) +static void manipulator_dial_render_3d_intersect(const bContext *C, wmManipulator *mpr, int selectionbase) { - DialManipulator *dial = (DialManipulator *)manipulator; + DialManipulator *dial = (DialManipulator *)mpr; float clip_plane_buf[4]; float *clip_plane = (dial->style == ED_MANIPULATOR_DIAL_STYLE_RING_CLIPPED) ? clip_plane_buf : NULL; @@ -271,7 +271,7 @@ static void manipulator_dial_render_3d_intersect(const bContext *C, wmManipulato RegionView3D *rv3d = ar->regiondata; copy_v3_v3(clip_plane, rv3d->viewinv[2]); - clip_plane[3] = -dot_v3v3(rv3d->viewinv[2], manipulator->origin); + clip_plane[3] = -dot_v3v3(rv3d->viewinv[2], mpr->origin); glEnable(GL_CLIP_DISTANCE0); } @@ -283,11 +283,11 @@ static void manipulator_dial_render_3d_intersect(const bContext *C, wmManipulato } } -static void manipulator_dial_draw(const bContext *C, wmManipulator *manipulator) +static void manipulator_dial_draw(const bContext *C, wmManipulator *mpr) { - DialManipulator *dial = (DialManipulator *)manipulator; - const bool active = manipulator->state & WM_MANIPULATOR_STATE_ACTIVE; - const bool highlight = (manipulator->state & WM_MANIPULATOR_STATE_HIGHLIGHT) != 0; + DialManipulator *dial = (DialManipulator *)mpr; + const bool active = mpr->state & WM_MANIPULATOR_STATE_ACTIVE; + const bool highlight = (mpr->state & WM_MANIPULATOR_STATE_HIGHLIGHT) != 0; float clip_plane_buf[4]; float *clip_plane = (!active && dial->style == ED_MANIPULATOR_DIAL_STYLE_RING_CLIPPED) ? clip_plane_buf : NULL; @@ -297,7 +297,7 @@ static void manipulator_dial_draw(const bContext *C, wmManipulator *manipulator) RegionView3D *rv3d = ar->regiondata; copy_v3_v3(clip_plane, rv3d->viewinv[2]); - clip_plane[3] = -dot_v3v3(rv3d->viewinv[2], manipulator->origin); + clip_plane[3] = -dot_v3v3(rv3d->viewinv[2], mpr->origin); clip_plane[3] -= 0.02 * dial->manipulator.scale; glEnable(GL_CLIP_DISTANCE0); @@ -313,14 +313,14 @@ static void manipulator_dial_draw(const bContext *C, wmManipulator *manipulator) } static void manipulator_dial_invoke( - bContext *UNUSED(C), wmManipulator *manipulator, const wmEvent *event) + bContext *UNUSED(C), wmManipulator *mpr, const wmEvent *event) { DialInteraction *inter = MEM_callocN(sizeof(DialInteraction), __func__); inter->init_mval[0] = event->mval[0]; inter->init_mval[1] = event->mval[1]; - manipulator->interaction_data = inter; + mpr->interaction_data = inter; } @@ -331,8 +331,8 @@ static void manipulator_dial_invoke( wmManipulator *ED_manipulator_dial3d_new(wmManipulatorGroup *mgroup, const char *name, const int style) { - const wmManipulatorType *mpt = WM_manipulatortype_find("MANIPULATOR_WT_dial", false); - DialManipulator *dial = (DialManipulator *)WM_manipulator_new(mpt, mgroup, name); + DialManipulator *dial = (DialManipulator *)WM_manipulator_new( + "MANIPULATOR_WT_dial", mgroup, name); const float dir_default[3] = {0.0f, 0.0f, 1.0f}; @@ -347,9 +347,9 @@ wmManipulator *ED_manipulator_dial3d_new(wmManipulatorGroup *mgroup, const char /** * Define up-direction of the dial manipulator */ -void ED_manipulator_dial3d_set_up_vector(wmManipulator *manipulator, const float direction[3]) +void ED_manipulator_dial3d_set_up_vector(wmManipulator *mpr, const float direction[3]) { - DialManipulator *dial = (DialManipulator *)manipulator; + DialManipulator *dial = (DialManipulator *)mpr; copy_v3_v3(dial->direction, direction); normalize_v3(dial->direction); @@ -365,7 +365,7 @@ static void MANIPULATOR_WT_dial_3d(wmManipulatorType *wt) wt->draw_select = manipulator_dial_render_3d_intersect; wt->invoke = manipulator_dial_invoke; - wt->size = sizeof(DialManipulator); + wt->struct_size = sizeof(DialManipulator); } void ED_manipulatortypes_dial_3d(void) diff --git a/source/blender/editors/manipulator_library/manipulator_geometry.h b/source/blender/editors/manipulator_library/manipulator_geometry.h index 0eff1ca89d8..2083f9d4d31 100644 --- a/source/blender/editors/manipulator_library/manipulator_geometry.h +++ b/source/blender/editors/manipulator_library/manipulator_geometry.h @@ -48,4 +48,7 @@ extern ManipulatorGeomInfo wm_manipulator_geom_data_arrow; /* cube manipulator */ extern ManipulatorGeomInfo wm_manipulator_geom_data_cube; +/* dial manipulator */ +extern ManipulatorGeomInfo wm_manipulator_geom_data_dial; + #endif /* __MANIPULATOR_GEOMETRY_H__ */ diff --git a/source/blender/editors/manipulator_library/manipulator_library_intern.h b/source/blender/editors/manipulator_library/manipulator_library_intern.h index c2d750deee0..8a187f5f9ba 100644 --- a/source/blender/editors/manipulator_library/manipulator_library_intern.h +++ b/source/blender/editors/manipulator_library/manipulator_library_intern.h @@ -76,23 +76,21 @@ float manipulator_value_from_offset( const bool constrained, const bool inverted, const bool use_precision); void manipulator_property_data_update( - struct wmManipulator *manipulator, ManipulatorCommonData *data, const int slot, + struct wmManipulator *mnp, ManipulatorCommonData *data, wmManipulatorProperty *mpr_prop, const bool constrained, const bool inverted); void manipulator_property_value_set( - bContext *C, const struct wmManipulator *manipulator, - const int slot, const float value); + bContext *C, const struct wmManipulator *mnp, wmManipulatorProperty *mpr_prop, const float value); float manipulator_property_value_get( - const struct wmManipulator *manipulator, const int slot); + const struct wmManipulator *mnp, wmManipulatorProperty *mpr_prop); void manipulator_property_value_reset( - bContext *C, const struct wmManipulator *manipulator, ManipulatorInteraction *inter, - const int slot); + bContext *C, const struct wmManipulator *mnp, ManipulatorInteraction *inter, wmManipulatorProperty *mpr_prop); /* -------------------------------------------------------------------- */ void manipulator_color_get( - const struct wmManipulator *manipulator, const bool highlight, + const struct wmManipulator *mpr, const bool highlight, float r_col[]); diff --git a/source/blender/editors/manipulator_library/manipulator_library_utils.c b/source/blender/editors/manipulator_library/manipulator_library_utils.c index 0950f27213d..be437c0acc1 100644 --- a/source/blender/editors/manipulator_library/manipulator_library_utils.c +++ b/source/blender/editors/manipulator_library/manipulator_library_utils.c @@ -34,6 +34,7 @@ #include "BKE_context.h" #include "BLI_math.h" +#include "BLI_listbase.h" #include "RNA_access.h" @@ -101,23 +102,21 @@ float manipulator_value_from_offset( } void manipulator_property_data_update( - wmManipulator *manipulator, ManipulatorCommonData *data, const int slot, + wmManipulator *mpr, ManipulatorCommonData *data, wmManipulatorProperty *mpr_prop, const bool constrained, const bool inverted) { - if (!manipulator->props[slot]) { + if (mpr_prop->prop == NULL) { data->offset = 0.0f; return; } - PointerRNA ptr = manipulator->ptr[slot]; - PropertyRNA *prop = manipulator->props[slot]; - float value = manipulator_property_value_get(manipulator, slot); + float value = manipulator_property_value_get(mpr, mpr_prop); if (constrained) { if ((data->flag & MANIPULATOR_CUSTOM_RANGE_SET) == 0) { float step, precision; float min, max; - RNA_property_float_ui_range(&ptr, prop, &min, &max, &step, &precision); + RNA_property_float_ui_range(&mpr_prop->ptr, mpr_prop->prop, &min, &max, &step, &precision); data->range = max - min; data->min = min; } @@ -129,41 +128,49 @@ void manipulator_property_data_update( } void manipulator_property_value_set( - bContext *C, const wmManipulator *manipulator, - const int slot, const float value) + bContext *C, const wmManipulator *UNUSED(mnp), + wmManipulatorProperty *mpr_prop, const float value) { - PointerRNA ptr = manipulator->ptr[slot]; - PropertyRNA *prop = manipulator->props[slot]; - /* reset property */ - RNA_property_float_set(&ptr, prop, value); - RNA_property_update(C, &ptr, prop); + if (mpr_prop->index == -1) { + RNA_property_float_set(&mpr_prop->ptr, mpr_prop->prop, value); + } + else { + RNA_property_float_set_index(&mpr_prop->ptr, mpr_prop->prop, mpr_prop->index, value); + } + RNA_property_update(C, &mpr_prop->ptr, mpr_prop->prop); } -float manipulator_property_value_get(const wmManipulator *manipulator, const int slot) +float manipulator_property_value_get( + const wmManipulator *UNUSED(mnp), + wmManipulatorProperty *mpr_prop) { - BLI_assert(RNA_property_type(manipulator->props[slot]) == PROP_FLOAT); - return RNA_property_float_get(&manipulator->ptr[slot], manipulator->props[slot]); + if (mpr_prop->index == -1) { + return RNA_property_float_get(&mpr_prop->ptr, mpr_prop->prop); + } + else { + return RNA_property_float_get_index(&mpr_prop->ptr, mpr_prop->prop, mpr_prop->index); + } } void manipulator_property_value_reset( - bContext *C, const wmManipulator *manipulator, ManipulatorInteraction *inter, - const int slot) + bContext *C, const wmManipulator *mnp, ManipulatorInteraction *inter, + wmManipulatorProperty *mpr_prop) { - manipulator_property_value_set(C, manipulator, slot, inter->init_value); + manipulator_property_value_set(C, mnp, mpr_prop, inter->init_value); } /* -------------------------------------------------------------------- */ void manipulator_color_get( - const wmManipulator *manipulator, const bool highlight, + const wmManipulator *mpr, const bool highlight, float r_col[4]) { - if (highlight && !(manipulator->flag & WM_MANIPULATOR_DRAW_HOVER)) { - copy_v4_v4(r_col, manipulator->col_hi); + if (highlight && !(mpr->flag & WM_MANIPULATOR_DRAW_HOVER)) { + copy_v4_v4(r_col, mpr->color_hi); } else { - copy_v4_v4(r_col, manipulator->col); + copy_v4_v4(r_col, mpr->color); } } diff --git a/source/blender/editors/manipulator_library/primitive3d_manipulator.c b/source/blender/editors/manipulator_library/primitive3d_manipulator.c index cc8fbeb17d2..63ed4ddf6b8 100644 --- a/source/blender/editors/manipulator_library/primitive3d_manipulator.c +++ b/source/blender/editors/manipulator_library/primitive3d_manipulator.c @@ -158,29 +158,29 @@ static void manipulator_primitive_draw_intern( } static void manipulator_primitive_render_3d_intersect( - const bContext *UNUSED(C), wmManipulator *manipulator, + const bContext *UNUSED(C), wmManipulator *mpr, int selectionbase) { GPU_select_load_id(selectionbase); - manipulator_primitive_draw_intern((PrimitiveManipulator *)manipulator, true, false); + manipulator_primitive_draw_intern((PrimitiveManipulator *)mpr, true, false); } -static void manipulator_primitive_draw(const bContext *UNUSED(C), wmManipulator *manipulator) +static void manipulator_primitive_draw(const bContext *UNUSED(C), wmManipulator *mpr) { manipulator_primitive_draw_intern( - (PrimitiveManipulator *)manipulator, false, - (manipulator->state & WM_MANIPULATOR_STATE_HIGHLIGHT)); + (PrimitiveManipulator *)mpr, false, + (mpr->state & WM_MANIPULATOR_STATE_HIGHLIGHT)); } static void manipulator_primitive_invoke( - bContext *UNUSED(C), wmManipulator *manipulator, const wmEvent *UNUSED(event)) + bContext *UNUSED(C), wmManipulator *mpr, const wmEvent *UNUSED(event)) { ManipulatorInteraction *inter = MEM_callocN(sizeof(ManipulatorInteraction), __func__); - copy_v3_v3(inter->init_origin, manipulator->origin); - inter->init_scale = manipulator->scale; + copy_v3_v3(inter->init_origin, mpr->origin); + inter->init_scale = mpr->scale; - manipulator->interaction_data = inter; + mpr->interaction_data = inter; } @@ -191,8 +191,8 @@ static void manipulator_primitive_invoke( wmManipulator *ED_manipulator_primitive3d_new(wmManipulatorGroup *mgroup, const char *name, const int style) { - const wmManipulatorType *mpt = WM_manipulatortype_find("MANIPULATOR_WT_primitive3d", false); - PrimitiveManipulator *prim = (PrimitiveManipulator *)WM_manipulator_new(mpt, mgroup, name); + PrimitiveManipulator *prim = (PrimitiveManipulator *)WM_manipulator_new( + "MANIPULATOR_WT_primitive3d", mgroup, name); const float dir_default[3] = {0.0f, 0.0f, 1.0f}; @@ -208,9 +208,9 @@ wmManipulator *ED_manipulator_primitive3d_new(wmManipulatorGroup *mgroup, const /** * Define direction the primitive will point towards */ -void ED_manipulator_primitive3d_set_direction(wmManipulator *manipulator, const float direction[3]) +void ED_manipulator_primitive3d_set_direction(wmManipulator *mpr, const float direction[3]) { - PrimitiveManipulator *prim = (PrimitiveManipulator *)manipulator; + PrimitiveManipulator *prim = (PrimitiveManipulator *)mpr; normalize_v3_v3(prim->direction, direction); } @@ -218,9 +218,9 @@ void ED_manipulator_primitive3d_set_direction(wmManipulator *manipulator, const /** * Define up-direction of the primitive manipulator */ -void ED_manipulator_primitive3d_set_up_vector(wmManipulator *manipulator, const float direction[3]) +void ED_manipulator_primitive3d_set_up_vector(wmManipulator *mpr, const float direction[3]) { - PrimitiveManipulator *prim = (PrimitiveManipulator *)manipulator; + PrimitiveManipulator *prim = (PrimitiveManipulator *)mpr; if (direction) { normalize_v3_v3(prim->up, direction); @@ -241,7 +241,7 @@ static void MANIPULATOR_WT_primitive3d(wmManipulatorType *wt) wt->draw_select = manipulator_primitive_render_3d_intersect; wt->invoke = manipulator_primitive_invoke; - wt->size = sizeof(PrimitiveManipulator); + wt->struct_size = sizeof(PrimitiveManipulator); } void ED_manipulatortypes_primitive_3d(void) diff --git a/source/blender/editors/space_node/node_widgets.c b/source/blender/editors/space_node/node_widgets.c index 2ff6472f8d0..0d0b17f1978 100644 --- a/source/blender/editors/space_node/node_widgets.c +++ b/source/blender/editors/space_node/node_widgets.c @@ -42,7 +42,7 @@ #include "node_intern.h" -static bool WIDGETGROUP_node_transform_poll(const bContext *C, wmManipulatorGroupType *UNUSED(wgrouptype)) +static bool WIDGETGROUP_node_transform_poll(const bContext *C, wmManipulatorGroupType *UNUSED(wgt)) { SpaceNode *snode = CTX_wm_space_node(C); @@ -61,20 +61,20 @@ static bool WIDGETGROUP_node_transform_poll(const bContext *C, wmManipulatorGrou return false; } -static void WIDGETGROUP_node_transform_init(const bContext *UNUSED(C), wmManipulatorGroup *wgroup) +static void WIDGETGROUP_node_transform_setup(const bContext *UNUSED(C), wmManipulatorGroup *mgroup) { wmManipulatorWrapper *wwrapper = MEM_mallocN(sizeof(wmManipulatorWrapper), __func__); wwrapper->manipulator = ED_manipulator_rect_transform_new( - wgroup, "backdrop_cage", + mgroup, "backdrop_cage", ED_MANIPULATOR_RECT_TRANSFORM_STYLE_TRANSLATE | ED_MANIPULATOR_RECT_TRANSFORM_STYLE_SCALE_UNIFORM); - wgroup->customdata = wwrapper; + mgroup->customdata = wwrapper; } -static void WIDGETGROUP_node_transform_refresh(const bContext *C, wmManipulatorGroup *wgroup) +static void WIDGETGROUP_node_transform_refresh(const bContext *C, wmManipulatorGroup *mgroup) { - wmManipulator *cage = ((wmManipulatorWrapper *)wgroup->customdata)->manipulator; + wmManipulator *cage = ((wmManipulatorWrapper *)mgroup->customdata)->manipulator; const ARegion *ar = CTX_wm_region(C); /* center is always at the origin */ const float origin[3] = {ar->winx / 2, ar->winy / 2}; @@ -95,8 +95,8 @@ static void WIDGETGROUP_node_transform_refresh(const bContext *C, wmManipulatorG SpaceNode *snode = CTX_wm_space_node(C); PointerRNA nodeptr; RNA_pointer_create(snode->id, &RNA_SpaceNodeEditor, snode, &nodeptr); - WM_manipulator_set_property(cage, ED_MANIPULATOR_RECT_TX_SLOT_OFFSET, &nodeptr, "backdrop_offset"); - WM_manipulator_set_property(cage, ED_MANIPULATOR_RECT_TX_SLOT_SCALE, &nodeptr, "backdrop_zoom"); + WM_manipulator_def_property(cage, "offset", &nodeptr, "backdrop_offset", -1); + WM_manipulator_def_property(cage, "scale", &nodeptr, "backdrop_zoom", -1); } else { WM_manipulator_set_flag(cage, WM_MANIPULATOR_HIDDEN, true); @@ -108,8 +108,9 @@ static void WIDGETGROUP_node_transform_refresh(const bContext *C, wmManipulatorG void NODE_WGT_backdrop_transform(wmManipulatorGroupType *wgt) { wgt->name = "Backdrop Transform Widgets"; + wgt->idname = "NODE_WGT_backdrop_transform"; wgt->poll = WIDGETGROUP_node_transform_poll; - wgt->init = WIDGETGROUP_node_transform_init; + wgt->setup = WIDGETGROUP_node_transform_setup; wgt->refresh = WIDGETGROUP_node_transform_refresh; } diff --git a/source/blender/editors/space_view3d/drawobject.c b/source/blender/editors/space_view3d/drawobject.c index a86614c52fd..126217057e5 100644 --- a/source/blender/editors/space_view3d/drawobject.c +++ b/source/blender/editors/space_view3d/drawobject.c @@ -9766,3 +9766,125 @@ void draw_object_instance(Scene *scene, SceneLayer *sl, View3D *v3d, RegionView3 break; } } + +void ED_draw_object_facemap(Scene *scene, Object *ob, const float col[4], const int facemap) +{ + DerivedMesh *dm = NULL; + + /* happens on undo */ + if (ob->type != OB_MESH || !ob->data) + return; + + dm = mesh_get_derived_final(scene, ob, CD_MASK_BAREMESH); + if (!dm || !CustomData_has_layer(&dm->polyData, CD_FACEMAP)) + return; + + + glFrontFace((ob->transflag & OB_NEG_SCALE) ? GL_CW : GL_CCW); + +#if 0 + DM_update_materials(dm, ob); + + /* add polygon offset so we draw above the original surface */ + glPolygonOffset(1.0, 1.0); + + GPU_facemap_setup(dm); + + glColor4fv(col); + + gpuPushAttrib(GL_ENABLE_BIT); + glEnable(GL_BLEND); + glDisable(GL_LIGHTING); + + /* always draw using backface culling */ + glEnable(GL_CULL_FACE); + glCullFace(GL_BACK); + + if (dm->drawObject->facemapindices) { + glDrawElements(GL_TRIANGLES, dm->drawObject->facemap_count[facemap] * 3, GL_UNSIGNED_INT, + (int *)NULL + dm->drawObject->facemap_start[facemap] * 3); + } + gpuPopAttrib(); + + GPU_buffers_unbind(); + + glPolygonOffset(0.0, 0.0); + +#else + + /* Just to create the data to pass to immediate mode, grr! */ + Mesh *me = ob->data; + const int *facemap_data = CustomData_get_layer(&me->pdata, CD_FACEMAP); + if (facemap_data) { + VertexFormat *format = immVertexFormat(); + unsigned int pos = VertexFormat_add_attrib(format, "pos", COMP_F32, 3, KEEP_FLOAT); + + immBindBuiltinProgram(GPU_SHADER_3D_UNIFORM_COLOR); + immUniformColor4fv(col); + + /* XXX, alpha isn't working yet, not sure why. */ + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + glEnable(GL_BLEND); + + MVert *mvert; + + MPoly *mpoly; + int mpoly_len; + + MLoop *mloop; + int mloop_len; + + if (dm && CustomData_has_layer(&dm->polyData, CD_FACEMAP)) { + mvert = dm->getVertArray(dm); + mpoly = dm->getPolyArray(dm); + mloop = dm->getLoopArray(dm); + + mpoly_len = dm->getNumPolys(dm); + mloop_len = dm->getNumLoops(dm); + + facemap_data = CustomData_get_layer(&dm->polyData, CD_FACEMAP); + } + else { + mvert = me->mvert; + mpoly = me->mpoly; + mloop = me->mloop; + + mpoly_len = me->totpoly; + mloop_len = me->totloop; + + facemap_data = CustomData_get_layer(&me->pdata, CD_FACEMAP); + } + + /* use gawain immediate mode fore now */ + const int looptris_len = poly_to_tri_count(mpoly_len, mloop_len); + immBeginAtMost(PRIM_TRIANGLES, looptris_len * 3); + + MPoly *mp; + int i; + for (mp = mpoly, i = 0; i < mpoly_len; i++, mp++) { + if (facemap_data[i] == facemap) { + /* Weak, fan-fill, use until we have derived-mesh replaced. */ + const MLoop *ml_start = &mloop[mp->loopstart]; + const MLoop *ml_a = ml_start + 1; + const MLoop *ml_b = ml_start + 2; + for (int j = 2; j < mp->totloop; j++) { + immVertex3fv(pos, mvert[ml_start->v].co); + immVertex3fv(pos, mvert[ml_a->v].co); + immVertex3fv(pos, mvert[ml_b->v].co); + + ml_a++; + ml_b++; + } + } + } + immEnd(); + + immUnbindProgram(); + + glDisable(GL_BLEND); + } +#endif + + dm->release(dm); +} + diff --git a/source/blender/editors/space_view3d/view3d_manipulators.c b/source/blender/editors/space_view3d/view3d_manipulators.c index 87513a6294b..7d8c855013b 100644 --- a/source/blender/editors/space_view3d/view3d_manipulators.c +++ b/source/blender/editors/space_view3d/view3d_manipulators.c @@ -59,7 +59,7 @@ /** \name Lamp Manipulators * \{ */ -static bool WIDGETGROUP_lamp_poll(const bContext *C, wmManipulatorGroupType *UNUSED(wgrouptype)) +static bool WIDGETGROUP_lamp_poll(const bContext *C, wmManipulatorGroupType *UNUSED(wgt)) { Object *ob = CTX_data_active_object(C); @@ -70,7 +70,7 @@ static bool WIDGETGROUP_lamp_poll(const bContext *C, wmManipulatorGroupType *UNU return false; } -static void WIDGETGROUP_lamp_init(const bContext *UNUSED(C), wmManipulatorGroup *wgroup) +static void WIDGETGROUP_lamp_setup(const bContext *UNUSED(C), wmManipulatorGroup *mgroup) { const char *propname = "spot_size"; @@ -79,17 +79,17 @@ static void WIDGETGROUP_lamp_init(const bContext *UNUSED(C), wmManipulatorGroup wmManipulatorWrapper *wwrapper = MEM_mallocN(sizeof(wmManipulatorWrapper), __func__); - wwrapper->manipulator = ED_manipulator_arrow3d_new(wgroup, propname, ED_MANIPULATOR_ARROW_STYLE_INVERTED); - wgroup->customdata = wwrapper; + wwrapper->manipulator = ED_manipulator_arrow3d_new(mgroup, propname, ED_MANIPULATOR_ARROW_STYLE_INVERTED); + mgroup->customdata = wwrapper; ED_manipulator_arrow3d_set_range_fac(wwrapper->manipulator, 4.0f); WM_manipulator_set_color(wwrapper->manipulator, color); WM_manipulator_set_color_highlight(wwrapper->manipulator, color_hi); } -static void WIDGETGROUP_lamp_refresh(const bContext *C, wmManipulatorGroup *wgroup) +static void WIDGETGROUP_lamp_refresh(const bContext *C, wmManipulatorGroup *mgroup) { - wmManipulatorWrapper *wwrapper = wgroup->customdata; + wmManipulatorWrapper *wwrapper = mgroup->customdata; Object *ob = CTX_data_active_object(C); Lamp *la = ob->data; float dir[3]; @@ -103,18 +103,19 @@ static void WIDGETGROUP_lamp_refresh(const bContext *C, wmManipulatorGroup *wgro PointerRNA lamp_ptr; const char *propname = "spot_size"; RNA_pointer_create(&la->id, &RNA_Lamp, la, &lamp_ptr); - WM_manipulator_set_property(wwrapper->manipulator, ED_MANIPULATOR_ARROW_SLOT_OFS_WORLD_SPACE, &lamp_ptr, propname); + WM_manipulator_def_property(wwrapper->manipulator, "offset", &lamp_ptr, propname, -1); } void VIEW3D_WGT_lamp(wmManipulatorGroupType *wgt) { wgt->name = "Lamp Widgets"; + wgt->idname = "VIEW3D_WGT_lamp"; wgt->poll = WIDGETGROUP_lamp_poll; - wgt->init = WIDGETGROUP_lamp_init; + wgt->setup = WIDGETGROUP_lamp_setup; wgt->refresh = WIDGETGROUP_lamp_refresh; - wgt->flag |= (WM_MANIPULATORGROUPTYPE_IS_3D | WM_MANIPULATORGROUPTYPE_SCALE_3D); + wgt->flag |= (WM_MANIPULATORGROUPTYPE_3D | WM_MANIPULATORGROUPTYPE_SCALE_3D); } /** \} */ @@ -131,7 +132,7 @@ struct CameraWidgetGroup { wmManipulator *ortho_scale; }; -static bool WIDGETGROUP_camera_poll(const bContext *C, wmManipulatorGroupType *UNUSED(wgrouptype)) +static bool WIDGETGROUP_camera_poll(const bContext *C, wmManipulatorGroupType *UNUSED(wgt)) { Object *ob = CTX_data_active_object(C); @@ -162,14 +163,14 @@ static void cameragroup_property_setup(wmManipulator *widget, Object *ob, Camera ED_manipulator_arrow3d_set_range_fac(widget, is_ortho ? (scale_fac * range) : (drawsize * range / half_sensor)); } -static void WIDGETGROUP_camera_init(const bContext *C, wmManipulatorGroup *wgroup) +static void WIDGETGROUP_camera_setup(const bContext *C, wmManipulatorGroup *mgroup) { Object *ob = CTX_data_active_object(C); Camera *ca = ob->data; float dir[3]; struct CameraWidgetGroup *camgroup = MEM_callocN(sizeof(struct CameraWidgetGroup), __func__); - wgroup->customdata = camgroup; + mgroup->customdata = camgroup; negate_v3_v3(dir, ob->obmat[2]); @@ -178,7 +179,7 @@ static void WIDGETGROUP_camera_init(const bContext *C, wmManipulatorGroup *wgrou const float color[4] = {1.0f, 0.3f, 0.0f, 1.0f}; const float color_hi[4] = {1.0f, 0.3f, 0.0f, 1.0f}; - camgroup->dop_dist = ED_manipulator_arrow3d_new(wgroup, "dof_distance", ED_MANIPULATOR_ARROW_STYLE_CROSS); + camgroup->dop_dist = ED_manipulator_arrow3d_new(mgroup, "dof_distance", ED_MANIPULATOR_ARROW_STYLE_CROSS); WM_manipulator_set_flag(camgroup->dop_dist, WM_MANIPULATOR_DRAW_HOVER, true); WM_manipulator_set_color(camgroup->dop_dist, color); WM_manipulator_set_color_highlight(camgroup->dop_dist, color_hi); @@ -191,14 +192,14 @@ static void WIDGETGROUP_camera_init(const bContext *C, wmManipulatorGroup *wgrou const float color_hi[4] = {1.0f, 1.0, 0.27f, 1.0f}; camgroup->focal_len = ED_manipulator_arrow3d_new( - wgroup, "focal_len", + mgroup, "focal_len", (ED_MANIPULATOR_ARROW_STYLE_CONE | ED_MANIPULATOR_ARROW_STYLE_CONSTRAINED)); WM_manipulator_set_color(camgroup->focal_len, color); WM_manipulator_set_color_highlight(camgroup->focal_len, color_hi); cameragroup_property_setup(camgroup->focal_len, ob, ca, false); camgroup->ortho_scale = ED_manipulator_arrow3d_new( - wgroup, "ortho_scale", + mgroup, "ortho_scale", (ED_MANIPULATOR_ARROW_STYLE_CONE | ED_MANIPULATOR_ARROW_STYLE_CONSTRAINED)); WM_manipulator_set_color(camgroup->ortho_scale, color); WM_manipulator_set_color_highlight(camgroup->ortho_scale, color_hi); @@ -206,12 +207,12 @@ static void WIDGETGROUP_camera_init(const bContext *C, wmManipulatorGroup *wgrou } } -static void WIDGETGROUP_camera_refresh(const bContext *C, wmManipulatorGroup *wgroup) +static void WIDGETGROUP_camera_refresh(const bContext *C, wmManipulatorGroup *mgroup) { - if (!wgroup->customdata) + if (!mgroup->customdata) return; - struct CameraWidgetGroup *camgroup = wgroup->customdata; + struct CameraWidgetGroup *camgroup = mgroup->customdata; Object *ob = CTX_data_active_object(C); Camera *ca = ob->data; PointerRNA camera_ptr; @@ -229,7 +230,7 @@ static void WIDGETGROUP_camera_refresh(const bContext *C, wmManipulatorGroup *wg WM_manipulator_set_flag(camgroup->dop_dist, WM_MANIPULATOR_HIDDEN, false); /* need to set property here for undo. TODO would prefer to do this in _init */ - WM_manipulator_set_property(camgroup->dop_dist, ED_MANIPULATOR_ARROW_SLOT_OFS_WORLD_SPACE, &camera_ptr, "dof_distance"); + WM_manipulator_def_property(camgroup->dop_dist, "offset", &camera_ptr, "dof_distance", -1); } else { WM_manipulator_set_flag(camgroup->dop_dist, WM_MANIPULATOR_HIDDEN, true); @@ -272,20 +273,21 @@ static void WIDGETGROUP_camera_refresh(const bContext *C, wmManipulatorGroup *wg WM_manipulator_set_scale(widget, drawsize); /* need to set property here for undo. TODO would prefer to do this in _init */ - WM_manipulator_set_property(camgroup->focal_len, ED_MANIPULATOR_ARROW_SLOT_OFS_WORLD_SPACE, &camera_ptr, "lens"); - WM_manipulator_set_property(camgroup->ortho_scale, ED_MANIPULATOR_ARROW_SLOT_OFS_WORLD_SPACE, &camera_ptr, "ortho_scale"); + WM_manipulator_def_property(camgroup->focal_len, "offset", &camera_ptr, "lens", -1); + WM_manipulator_def_property(camgroup->ortho_scale, "offset", &camera_ptr, "ortho_scale", -1); } } void VIEW3D_WGT_camera(wmManipulatorGroupType *wgt) { wgt->name = "Camera Widgets"; + wgt->idname = "VIEW3D_WGT_camera"; wgt->poll = WIDGETGROUP_camera_poll; - wgt->init = WIDGETGROUP_camera_init; + wgt->setup = WIDGETGROUP_camera_setup; wgt->refresh = WIDGETGROUP_camera_refresh; - wgt->flag |= WM_MANIPULATORGROUPTYPE_IS_3D; + wgt->flag |= WM_MANIPULATORGROUPTYPE_3D; } /** \} */ @@ -296,23 +298,23 @@ void VIEW3D_WGT_camera(wmManipulatorGroupType *wgt) /** \name Force Field Manipulators * \{ */ -static bool WIDGETGROUP_forcefield_poll(const bContext *C, wmManipulatorGroupType *UNUSED(wgrouptype)) +static bool WIDGETGROUP_forcefield_poll(const bContext *C, wmManipulatorGroupType *UNUSED(wgt)) { Object *ob = CTX_data_active_object(C); return (ob && ob->pd && ob->pd->forcefield); } -static void WIDGETGROUP_forcefield_init(const bContext *UNUSED(C), wmManipulatorGroup *wgroup) +static void WIDGETGROUP_forcefield_init(const bContext *UNUSED(C), wmManipulatorGroup *mgroup) { const float col[4] = {0.8f, 0.8f, 0.45f, 0.5f}; const float col_hi[4] = {0.8f, 0.8f, 0.45f, 1.0f}; /* only wind effector for now */ wmManipulatorWrapper *wwrapper = MEM_mallocN(sizeof(wmManipulatorWrapper), __func__); - wgroup->customdata = wwrapper; + mgroup->customdata = wwrapper; - wwrapper->manipulator = ED_manipulator_arrow3d_new(wgroup, "field_strength", ED_MANIPULATOR_ARROW_STYLE_CONSTRAINED); + wwrapper->manipulator = ED_manipulator_arrow3d_new(mgroup, "field_strength", ED_MANIPULATOR_ARROW_STYLE_CONSTRAINED); ED_manipulator_arrow3d_set_ui_range(wwrapper->manipulator, -200.0f, 200.0f); ED_manipulator_arrow3d_set_range_fac(wwrapper->manipulator, 6.0f); @@ -320,9 +322,9 @@ static void WIDGETGROUP_forcefield_init(const bContext *UNUSED(C), wmManipulator WM_manipulator_set_color_highlight(wwrapper->manipulator, col_hi); } -static void WIDGETGROUP_forcefield_refresh(const bContext *C, wmManipulatorGroup *wgroup) +static void WIDGETGROUP_forcefield_refresh(const bContext *C, wmManipulatorGroup *mgroup) { - wmManipulatorWrapper *wwrapper = wgroup->customdata; + wmManipulatorWrapper *wwrapper = mgroup->customdata; Object *ob = CTX_data_active_object(C); PartDeflect *pd = ob->pd; @@ -337,7 +339,7 @@ static void WIDGETGROUP_forcefield_refresh(const bContext *C, wmManipulatorGroup WM_manipulator_set_origin(wwrapper->manipulator, ob->obmat[3]); WM_manipulator_set_offset(wwrapper->manipulator, ofs); WM_manipulator_set_flag(wwrapper->manipulator, WM_MANIPULATOR_HIDDEN, false); - WM_manipulator_set_property(wwrapper->manipulator, ED_MANIPULATOR_ARROW_SLOT_OFS_WORLD_SPACE, &field_ptr, "strength"); + WM_manipulator_def_property(wwrapper->manipulator, "offset", &field_ptr, "strength", -1); } else { WM_manipulator_set_flag(wwrapper->manipulator, WM_MANIPULATOR_HIDDEN, true); @@ -347,12 +349,14 @@ static void WIDGETGROUP_forcefield_refresh(const bContext *C, wmManipulatorGroup void VIEW3D_WGT_force_field(wmManipulatorGroupType *wgt) { wgt->name = "Force Field Widgets"; + wgt->idname = "VIEW3D_WGT_force_field"; wgt->poll = WIDGETGROUP_forcefield_poll; - wgt->init = WIDGETGROUP_forcefield_init; + wgt->setup = WIDGETGROUP_forcefield_init; wgt->refresh = WIDGETGROUP_forcefield_refresh; - wgt->flag |= WM_MANIPULATORGROUPTYPE_IS_3D; + wgt->flag |= WM_MANIPULATORGROUPTYPE_3D; } /** \} */ + diff --git a/source/blender/editors/transform/transform_manipulator.c b/source/blender/editors/transform/transform_manipulator.c index 2b06eb34bcb..eee9919efd4 100644 --- a/source/blender/editors/transform/transform_manipulator.c +++ b/source/blender/editors/transform/transform_manipulator.c @@ -1081,36 +1081,36 @@ static void manipulator_line_range(const View3D *v3d, const short axis_type, flo /* **************** Actual Widget Stuff **************** */ -static ManipulatorGroup *manipulatorgroup_init(wmManipulatorGroup *wgroup) +static ManipulatorGroup *manipulatorgroup_init(wmManipulatorGroup *mgroup) { ManipulatorGroup *man; man = MEM_callocN(sizeof(ManipulatorGroup), "manipulator_data"); /* add/init widgets - order matters! */ - man->rotate_t = ED_manipulator_dial3d_new(wgroup, "rotate_t", ED_MANIPULATOR_DIAL_STYLE_RING_FILLED); - - man->scale_c = ED_manipulator_dial3d_new(wgroup, "scale_c", ED_MANIPULATOR_DIAL_STYLE_RING); - man->scale_x = ED_manipulator_arrow3d_new(wgroup, "scale_x", ED_MANIPULATOR_ARROW_STYLE_BOX); - man->scale_y = ED_manipulator_arrow3d_new(wgroup, "scale_y", ED_MANIPULATOR_ARROW_STYLE_BOX); - man->scale_z = ED_manipulator_arrow3d_new(wgroup, "scale_z", ED_MANIPULATOR_ARROW_STYLE_BOX); - man->scale_xy = ED_manipulator_primitive3d_new(wgroup, "scale_xy", ED_MANIPULATOR_PRIMITIVE_STYLE_PLANE); - man->scale_yz = ED_manipulator_primitive3d_new(wgroup, "scale_yz", ED_MANIPULATOR_PRIMITIVE_STYLE_PLANE); - man->scale_zx = ED_manipulator_primitive3d_new(wgroup, "scale_zx", ED_MANIPULATOR_PRIMITIVE_STYLE_PLANE); - - man->rotate_x = ED_manipulator_dial3d_new(wgroup, "rotate_x", ED_MANIPULATOR_DIAL_STYLE_RING_CLIPPED); - man->rotate_y = ED_manipulator_dial3d_new(wgroup, "rotate_y", ED_MANIPULATOR_DIAL_STYLE_RING_CLIPPED); - man->rotate_z = ED_manipulator_dial3d_new(wgroup, "rotate_z", ED_MANIPULATOR_DIAL_STYLE_RING_CLIPPED); + man->rotate_t = ED_manipulator_dial3d_new(mgroup, "rotate_t", ED_MANIPULATOR_DIAL_STYLE_RING_FILLED); + + man->scale_c = ED_manipulator_dial3d_new(mgroup, "scale_c", ED_MANIPULATOR_DIAL_STYLE_RING); + man->scale_x = ED_manipulator_arrow3d_new(mgroup, "scale_x", ED_MANIPULATOR_ARROW_STYLE_BOX); + man->scale_y = ED_manipulator_arrow3d_new(mgroup, "scale_y", ED_MANIPULATOR_ARROW_STYLE_BOX); + man->scale_z = ED_manipulator_arrow3d_new(mgroup, "scale_z", ED_MANIPULATOR_ARROW_STYLE_BOX); + man->scale_xy = ED_manipulator_primitive3d_new(mgroup, "scale_xy", ED_MANIPULATOR_PRIMITIVE_STYLE_PLANE); + man->scale_yz = ED_manipulator_primitive3d_new(mgroup, "scale_yz", ED_MANIPULATOR_PRIMITIVE_STYLE_PLANE); + man->scale_zx = ED_manipulator_primitive3d_new(mgroup, "scale_zx", ED_MANIPULATOR_PRIMITIVE_STYLE_PLANE); + + man->rotate_x = ED_manipulator_dial3d_new(mgroup, "rotate_x", ED_MANIPULATOR_DIAL_STYLE_RING_CLIPPED); + man->rotate_y = ED_manipulator_dial3d_new(mgroup, "rotate_y", ED_MANIPULATOR_DIAL_STYLE_RING_CLIPPED); + man->rotate_z = ED_manipulator_dial3d_new(mgroup, "rotate_z", ED_MANIPULATOR_DIAL_STYLE_RING_CLIPPED); /* init screen aligned widget last here, looks better, behaves better */ - man->rotate_c = ED_manipulator_dial3d_new(wgroup, "rotate_c", ED_MANIPULATOR_DIAL_STYLE_RING); + man->rotate_c = ED_manipulator_dial3d_new(mgroup, "rotate_c", ED_MANIPULATOR_DIAL_STYLE_RING); - man->translate_c = ED_manipulator_dial3d_new(wgroup, "translate_c", ED_MANIPULATOR_DIAL_STYLE_RING); - man->translate_x = ED_manipulator_arrow3d_new(wgroup, "translate_x", ED_MANIPULATOR_ARROW_STYLE_NORMAL); - man->translate_y = ED_manipulator_arrow3d_new(wgroup, "translate_y", ED_MANIPULATOR_ARROW_STYLE_NORMAL); - man->translate_z = ED_manipulator_arrow3d_new(wgroup, "translate_z", ED_MANIPULATOR_ARROW_STYLE_NORMAL); - man->translate_xy = ED_manipulator_primitive3d_new(wgroup, "translate_xy", ED_MANIPULATOR_PRIMITIVE_STYLE_PLANE); - man->translate_yz = ED_manipulator_primitive3d_new(wgroup, "translate_yz", ED_MANIPULATOR_PRIMITIVE_STYLE_PLANE); - man->translate_zx = ED_manipulator_primitive3d_new(wgroup, "translate_zx", ED_MANIPULATOR_PRIMITIVE_STYLE_PLANE); + man->translate_c = ED_manipulator_dial3d_new(mgroup, "translate_c", ED_MANIPULATOR_DIAL_STYLE_RING); + man->translate_x = ED_manipulator_arrow3d_new(mgroup, "translate_x", ED_MANIPULATOR_ARROW_STYLE_NORMAL); + man->translate_y = ED_manipulator_arrow3d_new(mgroup, "translate_y", ED_MANIPULATOR_ARROW_STYLE_NORMAL); + man->translate_z = ED_manipulator_arrow3d_new(mgroup, "translate_z", ED_MANIPULATOR_ARROW_STYLE_NORMAL); + man->translate_xy = ED_manipulator_primitive3d_new(mgroup, "translate_xy", ED_MANIPULATOR_PRIMITIVE_STYLE_PLANE); + man->translate_yz = ED_manipulator_primitive3d_new(mgroup, "translate_yz", ED_MANIPULATOR_PRIMITIVE_STYLE_PLANE); + man->translate_zx = ED_manipulator_primitive3d_new(mgroup, "translate_zx", ED_MANIPULATOR_PRIMITIVE_STYLE_PLANE); return man; } @@ -1118,7 +1118,7 @@ static ManipulatorGroup *manipulatorgroup_init(wmManipulatorGroup *wgroup) /** * Custom handler for manipulator widgets */ -static void manipulator_handler( +static void manipulator_modal( bContext *C, wmManipulator *widget, const wmEvent *UNUSED(event), const int UNUSED(flag)) { const ScrArea *sa = CTX_wm_area(C); @@ -1134,10 +1134,10 @@ static void manipulator_handler( ED_region_tag_redraw(ar); } -static void WIDGETGROUP_manipulator_init(const bContext *UNUSED(C), wmManipulatorGroup *wgroup) +static void WIDGETGROUP_manipulator_init(const bContext *UNUSED(C), wmManipulatorGroup *mgroup) { - ManipulatorGroup *man = manipulatorgroup_init(wgroup); - wgroup->customdata = man; + ManipulatorGroup *man = manipulatorgroup_init(mgroup); + mgroup->customdata = man; /* *** set properties for axes *** */ @@ -1150,7 +1150,7 @@ static void WIDGETGROUP_manipulator_init(const bContext *UNUSED(C), wmManipulato manipulator_get_axis_constraint(axis_idx, constraint_axis); /* custom handler! */ - WM_manipulator_set_fn_custom_handler(axis, manipulator_handler); + WM_manipulator_set_fn_custom_modal(axis, manipulator_modal); switch(axis_idx) { case MAN_AXIS_TRANS_X: @@ -1218,9 +1218,9 @@ static void WIDGETGROUP_manipulator_init(const bContext *UNUSED(C), wmManipulato MAN_ITER_AXES_END; } -static void WIDGETGROUP_manipulator_refresh(const bContext *C, wmManipulatorGroup *wgroup) +static void WIDGETGROUP_manipulator_refresh(const bContext *C, wmManipulatorGroup *mgroup) { - ManipulatorGroup *man = wgroup->customdata; + ManipulatorGroup *man = mgroup->customdata; ScrArea *sa = CTX_wm_area(C); ARegion *ar = CTX_wm_region(C); View3D *v3d = sa->spacedata.first; @@ -1278,9 +1278,9 @@ static void WIDGETGROUP_manipulator_refresh(const bContext *C, wmManipulatorGrou MAN_ITER_AXES_END; } -static void WIDGETGROUP_manipulator_draw_prepare(const bContext *C, wmManipulatorGroup *wgroup) +static void WIDGETGROUP_manipulator_draw_prepare(const bContext *C, wmManipulatorGroup *mgroup) { - ManipulatorGroup *man = wgroup->customdata; + ManipulatorGroup *man = mgroup->customdata; ScrArea *sa = CTX_wm_area(C); ARegion *ar = CTX_wm_region(C); View3D *v3d = sa->spacedata.first; @@ -1330,7 +1330,7 @@ static void WIDGETGROUP_manipulator_draw_prepare(const bContext *C, wmManipulato MAN_ITER_AXES_END; } -static bool WIDGETGROUP_manipulator_poll(const struct bContext *C, struct wmManipulatorGroupType *UNUSED(wgrouptype)) +static bool WIDGETGROUP_manipulator_poll(const struct bContext *C, struct wmManipulatorGroupType *UNUSED(wgt)) { /* it's a given we only use this in 3D view */ const ScrArea *sa = CTX_wm_area(C); @@ -1343,36 +1343,37 @@ static bool WIDGETGROUP_manipulator_poll(const struct bContext *C, struct wmMani void TRANSFORM_WGT_manipulator(wmManipulatorGroupType *wgt) { wgt->name = "Transform Manipulator"; + wgt->idname = "TRANSFORM_WGT_manipulator"; wgt->poll = WIDGETGROUP_manipulator_poll; - wgt->init = WIDGETGROUP_manipulator_init; + wgt->setup = WIDGETGROUP_manipulator_init; wgt->refresh = WIDGETGROUP_manipulator_refresh; wgt->draw_prepare = WIDGETGROUP_manipulator_draw_prepare; - wgt->flag |= (WM_MANIPULATORGROUPTYPE_IS_3D | WM_MANIPULATORGROUPTYPE_SCALE_3D); + wgt->flag |= (WM_MANIPULATORGROUPTYPE_3D | WM_MANIPULATORGROUPTYPE_SCALE_3D); } /* -------------------------------------------------------------------- */ /* Custom Object Manipulator (unfinished - unsure if this will stay) */ #if 0 -static void WIDGETGROUP_object_manipulator_init(const bContext *C, wmManipulatorGroup *wgroup) +static void WIDGETGROUP_object_manipulator_init(const bContext *C, wmManipulatorGroup *mgroup) { Object *ob = ED_object_active_context((bContext *)C); - if (ob->wgroup == NULL) { - ob->wgroup = wgroup; + if (ob->mgroup == NULL) { + ob->mgroup = mgroup; } - WIDGETGROUP_manipulator_init(C, wgroup); + WIDGETGROUP_manipulator_init(C, mgroup); } -static bool WIDGETGROUP_object_manipulator_poll(const bContext *C, wmManipulatorGroupType *wgrouptype) +static bool WIDGETGROUP_object_manipulator_poll(const bContext *C, wmManipulatorGroupType *wgt) { Object *ob = ED_object_active_context((bContext *)C); if (ED_operator_object_active((bContext *)C)) { - if (STREQ(wgrouptype->idname, ob->id.name)) { + if (STREQ(wgt->idname, ob->id.name)) { return true; } } @@ -1385,10 +1386,10 @@ void TRANSFORM_WGT_object(wmManipulatorGroupType *wgt) wgt->name = "Object Widgets"; wgt->poll = WIDGETGROUP_object_manipulator_poll; - wgt->init = WIDGETGROUP_object_manipulator_init; + wgt->setup = WIDGETGROUP_object_manipulator_init; wgt->refresh = WIDGETGROUP_manipulator_refresh; wgt->draw_prepare = WIDGETGROUP_manipulator_draw_prepare; - wgt->flag |= (WM_MANIPULATORGROUPTYPE_IS_3D | WM_MANIPULATORGROUPTYPE_SCALE_3D); + wgt->flag |= (WM_MANIPULATORGROUPTYPE_3D | WM_MANIPULATORGROUPTYPE_SCALE_3D); } #endif |