From 11d90f0f3b65abb6689ca66731ab54f2f38e905f Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Sat, 10 Jun 2017 10:42:35 +1000 Subject: 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). --- .../editors/include/ED_manipulator_library.h | 55 +-- source/blender/editors/include/ED_view3d.h | 2 + .../editors/manipulator_library/CMakeLists.txt | 1 + .../manipulator_library/arrow2d_manipulator.c | 46 +-- .../manipulator_library/arrow3d_manipulator.c | 108 +++--- .../manipulator_library/cage2d_manipulator.c | 195 ++++++----- .../manipulator_library/dial3d_manipulator.c | 30 +- .../manipulator_library/manipulator_geometry.h | 3 + .../manipulator_library_intern.h | 12 +- .../manipulator_library_utils.c | 53 +-- .../manipulator_library/primitive3d_manipulator.c | 32 +- source/blender/editors/space_node/node_widgets.c | 19 +- source/blender/editors/space_view3d/drawobject.c | 122 +++++++ .../editors/space_view3d/view3d_manipulators.c | 68 ++-- .../editors/transform/transform_manipulator.c | 85 ++--- source/blender/windowmanager/CMakeLists.txt | 1 - source/blender/windowmanager/WM_types.h | 3 - .../blender/windowmanager/intern/wm_event_system.c | 21 +- source/blender/windowmanager/intern/wm_init_exit.c | 2 +- source/blender/windowmanager/intern/wm_operators.c | 7 - .../manipulators/WM_manipulator_api.h | 55 +-- .../manipulators/WM_manipulator_types.h | 78 +++-- .../manipulators/intern/wm_manipulator.c | 385 +++++++++++---------- .../manipulators/intern/wm_manipulator_intern.h | 28 +- .../manipulators/intern/wm_manipulatorgroup.c | 237 +++++++------ .../manipulators/intern/wm_manipulatormap.c | 249 +++++++------ .../windowmanager/manipulators/wm_manipulator_fn.h | 9 +- .../manipulators/wm_manipulator_wmapi.h | 29 +- source/blenderplayer/bad_level_call_stubs/stubs.c | 11 +- 29 files changed, 1053 insertions(+), 893 deletions(-) (limited to 'source') 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 diff --git a/source/blender/windowmanager/CMakeLists.txt b/source/blender/windowmanager/CMakeLists.txt index a7f8a783078..a0efe7502c4 100644 --- a/source/blender/windowmanager/CMakeLists.txt +++ b/source/blender/windowmanager/CMakeLists.txt @@ -75,7 +75,6 @@ set(SRC manipulators/intern/wm_manipulatorgroup.c manipulators/intern/wm_manipulatormap.c - WM_api.h WM_keymap.h WM_types.h diff --git a/source/blender/windowmanager/WM_types.h b/source/blender/windowmanager/WM_types.h index 756a9d6a1d1..ad8df014902 100644 --- a/source/blender/windowmanager/WM_types.h +++ b/source/blender/windowmanager/WM_types.h @@ -578,9 +578,6 @@ typedef struct wmOperatorType { /* pointer to modal keymap, do not free! */ struct wmKeyMap *modalkeymap; - /* manipulator-group that is accessible while operator runs */ - wmManipulatorGroupType *mgrouptype; - /* python needs the operator type as well */ int (*pyop_poll)(struct bContext *, struct wmOperatorType *ot) ATTR_WARN_UNUSED_RESULT; diff --git a/source/blender/windowmanager/intern/wm_event_system.c b/source/blender/windowmanager/intern/wm_event_system.c index c4776f53f42..7ef36c3bd48 100644 --- a/source/blender/windowmanager/intern/wm_event_system.c +++ b/source/blender/windowmanager/intern/wm_event_system.c @@ -1723,11 +1723,6 @@ static int wm_handler_operator_call(bContext *C, ListBase *handlers, wmEventHand wm_region_mouse_co(C, event); wm_event_modalkeymap(C, op, event, &dbl_click_disabled); - /* attach manipulator-map to handler if not there yet */ - if (ot->mgrouptype && !handler->manipulator_map) { - wm_manipulatorgroup_attach_to_modal_handler(C, handler, ot->mgrouptype, op); - } - if (ot->flag & OPTYPE_UNDO) wm->op_undo_depth++; @@ -1777,7 +1772,7 @@ static int wm_handler_operator_call(bContext *C, ListBase *handlers, wmEventHand } /* update manipulators during modal handlers */ - wm_manipulatormaps_handled_modal_update(C, event, handler, ot); + wm_manipulatormaps_handled_modal_update(C, event, handler); /* remove modal handler, operator itself should have been canceled and freed */ if (retval & (OPERATOR_CANCELLED | OPERATOR_FINISHED)) { @@ -2155,21 +2150,21 @@ static int wm_handlers_do_intern(bContext *C, wmEvent *event, ListBase *handlers ScrArea *area = CTX_wm_area(C); ARegion *region = CTX_wm_region(C); wmManipulatorMap *mmap = handler->manipulator_map; - wmManipulator *manipulator = wm_manipulatormap_get_highlighted_manipulator(mmap); - unsigned char part; + wmManipulator *mpr = wm_manipulatormap_highlight_get(mmap); wm_manipulatormap_handler_context(C, handler); wm_region_mouse_co(C, event); /* handle manipulator highlighting */ - if (event->type == MOUSEMOVE && !wm_manipulatormap_get_active_manipulator(mmap)) { - manipulator = wm_manipulatormap_find_highlighted_manipulator(mmap, C, event, &part); - wm_manipulatormap_set_highlighted_manipulator(mmap, C, manipulator, part); + if (event->type == MOUSEMOVE && !wm_manipulatormap_active_get(mmap)) { + int part; + mpr = wm_manipulatormap_highlight_find(mmap, C, event, &part); + wm_manipulatormap_highlight_set(mmap, C, mpr, part); } /* handle user configurable manipulator-map keymap */ - else if (manipulator) { + else if (mpr) { /* get user customized keymap from default one */ - const wmManipulatorGroup *highlightgroup = wm_manipulator_get_parent_group(manipulator); + const wmManipulatorGroup *highlightgroup = wm_manipulator_get_parent_group(mpr); const wmKeyMap *keymap = WM_keymap_active(wm, highlightgroup->type->keymap); wmKeyMapItem *kmi; diff --git a/source/blender/windowmanager/intern/wm_init_exit.c b/source/blender/windowmanager/intern/wm_init_exit.c index 6cf27094e67..7d729f22cfe 100644 --- a/source/blender/windowmanager/intern/wm_init_exit.c +++ b/source/blender/windowmanager/intern/wm_init_exit.c @@ -171,7 +171,7 @@ void WM_init(bContext *C, int argc, const char **argv) BKE_library_callback_free_window_manager_set(wm_close_and_free); /* library.c */ BKE_library_callback_free_notifier_reference_set(WM_main_remove_notifier_reference); /* library.c */ - BKE_region_callback_free_manipulatormap_set(wm_manipulatormap_delete); /* screen.c */ + BKE_region_callback_free_manipulatormap_set(wm_manipulatormap_remove); /* screen.c */ BKE_library_callback_remap_editor_id_reference_set(WM_main_remap_editor_id_reference); /* library.c */ BKE_blender_callback_test_break_set(wm_window_testbreak); /* blender.c */ BKE_spacedata_callback_id_remap_set(ED_spacedata_id_remap); /* screen.c */ diff --git a/source/blender/windowmanager/intern/wm_operators.c b/source/blender/windowmanager/intern/wm_operators.c index 429e35c7043..f925f22e878 100644 --- a/source/blender/windowmanager/intern/wm_operators.c +++ b/source/blender/windowmanager/intern/wm_operators.c @@ -177,10 +177,6 @@ static void wm_operatortype_append__end(wmOperatorType *ot) ot->name = N_("Dummy Name"); } - if (ot->mgrouptype) { - ot->mgrouptype->flag |= WM_MANIPULATORGROUPTYPE_OP; - } - /* XXX All ops should have a description but for now allow them not to. */ RNA_def_struct_ui_text(ot->srna, ot->name, ot->description ? ot->description : UNDOCUMENTED_OPERATOR_TIP); RNA_def_struct_identifier(ot->srna, ot->idname); @@ -498,9 +494,6 @@ void WM_operatortype_remove_ptr(wmOperatorType *ot) BLI_ghash_remove(global_ops_hash, ot->idname, NULL, NULL); WM_keyconfig_update_operatortype(); - if (ot->mgrouptype) { - WM_manipulatorgrouptype_unregister(NULL, G.main, ot->mgrouptype); - } MEM_freeN(ot); } diff --git a/source/blender/windowmanager/manipulators/WM_manipulator_api.h b/source/blender/windowmanager/manipulators/WM_manipulator_api.h index f43c47005a9..a72830e19d4 100644 --- a/source/blender/windowmanager/manipulators/WM_manipulator_api.h +++ b/source/blender/windowmanager/manipulators/WM_manipulator_api.h @@ -41,6 +41,7 @@ struct GHashIterator; struct Main; struct wmKeyConfig; struct wmManipulator; +struct wmManipulatorProperty; struct wmManipulatorType; struct wmManipulatorGroup; struct wmManipulatorGroupType; @@ -53,38 +54,45 @@ struct wmManipulatorMapType_Params; /* -------------------------------------------------------------------- */ /* wmManipulator */ +struct wmManipulator *WM_manipulator_new_ptr( + const struct wmManipulatorType *wt, + struct wmManipulatorGroup *mgroup, const char *name); struct wmManipulator *WM_manipulator_new( - const struct wmManipulatorType *mpt, + const char *idname, struct wmManipulatorGroup *mgroup, const char *name); -void WM_manipulator_delete( - ListBase *manipulatorlist, struct wmManipulatorMap *mmap, struct wmManipulator *manipulator, +void WM_manipulator_free( + ListBase *manipulatorlist, struct wmManipulatorMap *mmap, struct wmManipulator *mpr, struct bContext *C); -struct wmManipulatorGroup *WM_manipulator_get_parent_group(struct wmManipulator *manipulator); +struct wmManipulatorGroup *WM_manipulator_get_parent_group(struct wmManipulator *mpr); + +struct wmManipulatorProperty *WM_manipulator_get_property( + struct wmManipulator *mpr, const char *idname); +void WM_manipulator_def_property( + struct wmManipulator *mpr, const char *idname, + struct PointerRNA *ptr, const char *propname, int index); -void WM_manipulator_set_property(struct wmManipulator *, int slot, struct PointerRNA *ptr, const char *propname); struct PointerRNA *WM_manipulator_set_operator(struct wmManipulator *, const char *opname); /* callbacks */ -void WM_manipulator_set_fn_custom_handler(struct wmManipulator *manipulator, wmManipulatorFnHandler fn); - -void WM_manipulator_set_origin(struct wmManipulator *manipulator, const float origin[3]); -void WM_manipulator_set_offset(struct wmManipulator *manipulator, const float offset[3]); -void WM_manipulator_set_flag(struct wmManipulator *manipulator, const int flag, const bool enable); -void WM_manipulator_set_scale(struct wmManipulator *manipulator, float scale); -void WM_manipulator_set_line_width(struct wmManipulator *manipulator, const float line_width); +void WM_manipulator_set_fn_custom_modal(struct wmManipulator *mpr, wmManipulatorFnModal fn); -void WM_manipulator_get_color(const struct wmManipulator *manipulator, float col[4]); -void WM_manipulator_set_color(struct wmManipulator *manipulator, const float col[4]); -void WM_manipulator_get_color_highlight(const struct wmManipulator *manipulator, float col_hi[4]); -void WM_manipulator_set_color_highlight(struct wmManipulator *manipulator, const float col[4]); +void WM_manipulator_set_origin(struct wmManipulator *mpr, const float origin[3]); +void WM_manipulator_set_offset(struct wmManipulator *mpr, const float offset[3]); +void WM_manipulator_set_flag(struct wmManipulator *mpr, const int flag, const bool enable); +void WM_manipulator_set_scale(struct wmManipulator *mpr, float scale); +void WM_manipulator_set_line_width(struct wmManipulator *mpr, const float line_width); -/* manipulator_library_presets.c */ -void WM_manipulator_draw_preset_box(const struct wmManipulator *manipulator, float mat[4][4], int select_id); +void WM_manipulator_get_color(const struct wmManipulator *mpr, float col[4]); +void WM_manipulator_set_color(struct wmManipulator *mpr, const float col[4]); +void WM_manipulator_get_color_highlight(const struct wmManipulator *mpr, float col_hi[4]); +void WM_manipulator_set_color_highlight(struct wmManipulator *mpr, const float col[4]); /* wm_manipulator.c */ const struct wmManipulatorType *WM_manipulatortype_find(const char *idname, bool quiet); -void WM_manipulatortype_append(void (*mnpfunc)(struct wmManipulatorType *)); +void WM_manipulatortype_append(void (*wtfunc)(struct wmManipulatorType *)); void WM_manipulatortype_append_ptr(void (*mnpfunc)(struct wmManipulatorType *, void *), void *userdata); +bool WM_manipulatortype_remove(const char *idname); +void WM_manipulatortype_remove_ptr(struct wmManipulatorType *wt); void WM_manipulatortype_iter(struct GHashIterator *ghi); /* -------------------------------------------------------------------- */ @@ -110,14 +118,15 @@ struct wmManipulatorGroupType *WM_manipulatorgrouptype_append_ptr_runtime( void WM_manipulatorgrouptype_init_runtime( const struct Main *bmain, struct wmManipulatorMapType *mmaptype, - struct wmManipulatorGroupType *mgrouptype); -void WM_manipulatorgrouptype_unregister( + struct wmManipulatorGroupType *wgt); +void WM_manipulatorgrouptype_free(struct wmManipulatorGroupType *wgt); +void WM_manipulatorgrouptype_remove_ptr( struct bContext *C, struct Main *bmain, struct wmManipulatorGroupType *mgroup); struct wmKeyMap *WM_manipulatorgroup_keymap_common( - const struct wmManipulatorGroupType *mgrouptype, struct wmKeyConfig *config); + const struct wmManipulatorGroupType *wgt, struct wmKeyConfig *config); struct wmKeyMap *WM_manipulatorgroup_keymap_common_sel( - const struct wmManipulatorGroupType *mgrouptype, struct wmKeyConfig *config); + const struct wmManipulatorGroupType *wgt, struct wmKeyConfig *config); /* -------------------------------------------------------------------- */ diff --git a/source/blender/windowmanager/manipulators/WM_manipulator_types.h b/source/blender/windowmanager/manipulators/WM_manipulator_types.h index fbbbffd18b0..d0abcb7ee3c 100644 --- a/source/blender/windowmanager/manipulators/WM_manipulator_types.h +++ b/source/blender/windowmanager/manipulators/WM_manipulator_types.h @@ -41,10 +41,14 @@ struct wmManipulatorGroupType; struct wmManipulatorGroup; struct wmManipulator; +struct wmManipulatorProperty; struct wmKeyConfig; +struct PropertyElemRNA; #include "wm_manipulator_fn.h" +#include "DNA_listBase.h" + /* -------------------------------------------------------------------- */ /* wmManipulator */ @@ -52,23 +56,23 @@ struct wmKeyConfig; struct wmManipulator { struct wmManipulator *next, *prev; - char idname[64 + 4]; /* MAX_NAME + 4 for unique '.001', '.002', etc suffix */ + char name[64 + 4]; /* MAX_NAME + 4 for unique '.001', '.002', etc suffix */ /* While we don't have a real type, use this to put type-like vars. */ const struct wmManipulatorType *type; /* Overrides 'type->handler' when set. */ - wmManipulatorFnHandler custom_handler; - - void *custom_data; + wmManipulatorFnModal custom_modal; /* pointer back to group this manipulator is in (just for quick access) */ struct wmManipulatorGroup *parent_mgroup; + void *py_instance; + int flag; /* flags that influence the behavior or how the manipulators are drawn */ short state; /* state flags (active, highlighted, selected) */ - unsigned char highlighted_part; + int highlight_part; /* center of manipulator in space, 2d or 3d */ float origin[3]; @@ -81,7 +85,7 @@ struct wmManipulator { /* user defined width for line drawing */ float line_width; /* manipulator colors (uses default fallbacks if not defined) */ - float col[4], col_hi[4]; + float color[4], color_hi[4]; /* data used during interaction */ void *interaction_data; @@ -92,12 +96,25 @@ struct wmManipulator { * or owner pointer if manipulator spawns and controls a property */ PointerRNA opptr; - /* arrays of properties attached to various manipulator parameters. As - * the manipulator is interacted with, those properties get updated */ - PointerRNA *ptr; - PropertyRNA **props; + /* Properties 'wmManipulatorProperty' attached to various manipulator parameters. + * As the manipulator is interacted with, those properties get updated. + * + * Public API's should use string names, + * private API's can pass 'wmManipulatorProperty' directly. + */ + ListBase properties; }; +/* Similar to PropertyElemRNA, but has an identifier. */ +typedef struct wmManipulatorProperty { + struct wmManipulatorProperty *next, *prev; + PointerRNA ptr; + PropertyRNA *prop; + int index; + /* over alloc */ + char idname[0]; +} wmManipulatorProperty; + /** * Simple utility wrapper for storing a single manipulator as wmManipulatorGroup.customdata (which gets freed). */ @@ -132,13 +149,13 @@ enum { }; typedef struct wmManipulatorType { - struct wmManipulatorGroupType *next, *prev; const char *idname; /* MAX_NAME */ - uint size; + /* Set to 'sizeof(wmManipulator)' or larger for instances of this type, + * use so we can cant to other types without the hassle of a custom-data pointer. */ + uint struct_size; - /* could become wmManipulatorType */ /* draw manipulator */ wmManipulatorFnDraw draw; @@ -146,17 +163,17 @@ typedef struct wmManipulatorType { wmManipulatorFnDrawSelect draw_select; /* determine if the mouse intersects with the manipulator. The calculation should be done in the callback itself */ - wmManipulatorFnIntersect intersect; + wmManipulatorFnTestSelect test_select; /* handler used by the manipulator. Usually handles interaction tied to a manipulator type */ - wmManipulatorFnHandler handler; + wmManipulatorFnModal modal; /* manipulator-specific handler to update manipulator attributes based on the property value */ - wmManipulatorFnPropDataUpdate prop_data_update; + wmManipulatorFnPropertyUpdate property_update; /* returns the final position which may be different from the origin, depending on the manipulator. * used in calculations of scale */ - wmManipulatorFnFinalPositionGet position_get; + wmManipulatorFnPositionGet position_get; /* activate a manipulator state when the user clicks on it */ wmManipulatorFnInvoke invoke; @@ -169,9 +186,6 @@ typedef struct wmManipulatorType { /* called when manipulator selection state changes */ wmManipulatorFnSelect select; - /* maximum number of properties attached to the manipulator */ - int prop_len_max; - /* RNA integration */ ExtensionRNA ext; } wmManipulatorType; @@ -184,20 +198,21 @@ typedef struct wmManipulatorType { typedef struct wmManipulatorGroupType { struct wmManipulatorGroupType *next, *prev; - char idname[64]; /* MAX_NAME */ + const char *idname; /* MAX_NAME */ const char *name; /* manipulator-group name - displayed in UI (keymap editor) */ /* poll if manipulator-map should be visible */ wmManipulatorGroupFnPoll poll; /* initially create manipulators and set permanent data - stuff you only need to do once */ - wmManipulatorGroupFnInit init; + wmManipulatorGroupFnInit setup; /* refresh data, only called if recreate flag is set (WM_manipulatormap_tag_refresh) */ wmManipulatorGroupFnRefresh refresh; /* refresh data for drawing, called before each redraw */ wmManipulatorGroupFnDrawPrepare draw_prepare; - /* keymap init callback for this manipulator-group */ - struct wmKeyMap *(*keymap_init)(const struct wmManipulatorGroupType *, struct wmKeyConfig *); + /* Keymap init callback for this manipulator-group (optional), + * will fall back to default tweak keymap when left NULL. */ + struct wmKeyMap *(*setup_keymap)(const struct wmManipulatorGroupType *, struct wmKeyConfig *); /* keymap created with callback from above */ struct wmKeyMap *keymap; @@ -212,12 +227,6 @@ typedef struct wmManipulatorGroupType { int flag; - /* Weak, but needed to store which functions we have. */ - int rna_func_flag; - - /* if type is spawned from operator this is set here */ - void *op; - /* same as manipulator-maps, so registering/unregistering goes to the correct region */ short spaceid, regionid; char mapidname[64]; @@ -229,15 +238,13 @@ typedef struct wmManipulatorGroupType { */ enum { /* Mark manipulator-group as being 3D */ - WM_MANIPULATORGROUPTYPE_IS_3D = (1 << 0), + WM_MANIPULATORGROUPTYPE_3D = (1 << 0), /* Scale manipulators as 3D object that respects zoom (otherwise zoom independent draw size) */ WM_MANIPULATORGROUPTYPE_SCALE_3D = (1 << 1), /* Manipulators can be depth culled with scene objects (covered by other geometry - TODO) */ - WM_MANIPULATORGROUPTYPE_SCENE_DEPTH = (1 << 2), + WM_MANIPULATORGROUPTYPE_DEPTH_3D = (1 << 2), /* Manipulators can be selected */ - WM_MANIPULATORGROUPTYPE_SELECTABLE = (1 << 3), - /* manipulator group is attached to operator, and is only accessible as long as this runs */ - WM_MANIPULATORGROUPTYPE_OP = (1 << 4), + WM_MANIPULATORGROUPTYPE_SELECT = (1 << 3), }; @@ -264,4 +271,3 @@ enum { }; #endif /* __WM_MANIPULATOR_TYPES_H__ */ - diff --git a/source/blender/windowmanager/manipulators/intern/wm_manipulator.c b/source/blender/windowmanager/manipulators/intern/wm_manipulator.c index d70822e8c56..3dba5ab55e2 100644 --- a/source/blender/windowmanager/manipulators/intern/wm_manipulator.c +++ b/source/blender/windowmanager/manipulators/intern/wm_manipulator.c @@ -51,6 +51,10 @@ #include "WM_api.h" #include "WM_types.h" +#ifdef WITH_PYTHON +#include "BPY_extern.h" +#endif + /* only for own init/exit calls (wm_manipulatortype_init/wm_manipulatortype_free) */ #include "wm.h" @@ -59,7 +63,7 @@ #include "wm_manipulator_intern.h" static void wm_manipulator_register( - wmManipulatorGroup *mgroup, wmManipulator *manipulator, const char *name); + wmManipulatorGroup *mgroup, wmManipulator *mpr, const char *name); /** \name Manipulator Type Append * @@ -71,11 +75,11 @@ static GHash *global_manipulatortype_hash = NULL; const wmManipulatorType *WM_manipulatortype_find(const char *idname, bool quiet) { if (idname[0]) { - wmManipulatorType *mt; + wmManipulatorType *wt; - mt = BLI_ghash_lookup(global_manipulatortype_hash, idname); - if (mt) { - return mt; + wt = BLI_ghash_lookup(global_manipulatortype_hash, idname); + if (wt) { + return wt; } if (!quiet) { @@ -99,42 +103,68 @@ void WM_manipulatortype_iter(GHashIterator *ghi) static wmManipulatorType *wm_manipulatortype_append__begin(void) { - wmManipulatorType *mt = MEM_callocN(sizeof(wmManipulatorType), "manipulatortype"); - return mt; + wmManipulatorType *wt = MEM_callocN(sizeof(wmManipulatorType), "manipulatortype"); + return wt; } -static void wm_manipulatortype_append__end(wmManipulatorType *mt) +static void wm_manipulatortype_append__end(wmManipulatorType *wt) { - /* Create at least one property for interaction, - * note: we could enforce each type sets this it's self. */ - if (mt->prop_len_max == 0) { - mt->prop_len_max = 1; - } + BLI_assert(wt->struct_size >= sizeof(wmManipulator)); - BLI_ghash_insert(global_manipulatortype_hash, (void *)mt->idname, mt); + BLI_ghash_insert(global_manipulatortype_hash, (void *)wt->idname, wt); } -void WM_manipulatortype_append(void (*mtfunc)(struct wmManipulatorType *)) +void WM_manipulatortype_append(void (*wtfunc)(struct wmManipulatorType *)) { - wmManipulatorType *mt = wm_manipulatortype_append__begin(); - mtfunc(mt); - wm_manipulatortype_append__end(mt); + wmManipulatorType *wt = wm_manipulatortype_append__begin(); + wtfunc(wt); + wm_manipulatortype_append__end(wt); } -void WM_manipulatortype_append_ptr(void (*mtfunc)(struct wmManipulatorType *, void *), void *userdata) +void WM_manipulatortype_append_ptr(void (*wtfunc)(struct wmManipulatorType *, void *), void *userdata) { wmManipulatorType *mt = wm_manipulatortype_append__begin(); - mtfunc(mt, userdata); + wtfunc(mt, userdata); wm_manipulatortype_append__end(mt); } -static void manipulatortype_ghash_free_cb(wmManipulatorType *mt) +/** + * Free but don't remove from ghash. + */ +static void manipulatortype_free(wmManipulatorType *wt) { - MEM_freeN(mt); + MEM_freeN(wt); +} + +void WM_manipulatortype_remove_ptr(wmManipulatorType *wt) +{ + BLI_assert(wt == WM_manipulatortype_find(wt->idname, false)); + + BLI_ghash_remove(global_manipulatortype_hash, wt->idname, NULL, NULL); + + manipulatortype_free(wt); +} + +bool WM_manipulatortype_remove(const char *idname) +{ + wmManipulatorType *wt = BLI_ghash_lookup(global_manipulatortype_hash, idname); + + if (wt == NULL) { + return false; + } + + WM_manipulatortype_remove_ptr(wt); + + return true; +} + +static void wm_manipulatortype_ghash_free_cb(wmManipulatorType *mt) +{ + manipulatortype_free(mt); } void wm_manipulatortype_free(void) { - BLI_ghash_free(global_manipulatortype_hash, NULL, (GHashValFreeFP)manipulatortype_ghash_free_cb); + BLI_ghash_free(global_manipulatortype_hash, NULL, (GHashValFreeFP)wm_manipulatortype_ghash_free_cb); global_manipulatortype_hash = NULL; } @@ -154,14 +184,14 @@ static wmManipulator *wm_manipulator_create( const wmManipulatorType *mpt) { BLI_assert(mpt != NULL); - BLI_assert(mpt->size >= sizeof(wmManipulator)); + BLI_assert(mpt->struct_size >= sizeof(wmManipulator)); - wmManipulator *mpr = MEM_callocN(mpt->size, __func__); + wmManipulator *mpr = MEM_callocN(mpt->struct_size, __func__); mpr->type = mpt; return mpr; } -wmManipulator *WM_manipulator_new(const wmManipulatorType *mpt, wmManipulatorGroup *mgroup, const char *name) +wmManipulator *WM_manipulator_new_ptr(const wmManipulatorType *mpt, wmManipulatorGroup *mgroup, const char *name) { wmManipulator *mpr = wm_manipulator_create(mpt); @@ -170,9 +200,24 @@ wmManipulator *WM_manipulator_new(const wmManipulatorType *mpt, wmManipulatorGro return mpr; } -wmManipulatorGroup *WM_manipulator_get_parent_group(wmManipulator *manipulator) +/** + * \param wt: Must be valid, + * if you need to check it exists use #WM_manipulator_new_ptr + * because callers of this function don't NULL check the return value. + */ +wmManipulator *WM_manipulator_new(const char *idname, wmManipulatorGroup *mgroup, const char *name) +{ + const wmManipulatorType *wt = WM_manipulatortype_find(idname, false); + wmManipulator *mpr = wm_manipulator_create(wt); + + wm_manipulator_register(mgroup, mpr, name); + + return mpr; +} + +wmManipulatorGroup *WM_manipulator_get_parent_group(wmManipulator *mpr) { - return manipulator->parent_mgroup; + return mpr->parent_mgroup; } /** @@ -180,18 +225,13 @@ wmManipulatorGroup *WM_manipulator_get_parent_group(wmManipulator *manipulator) * * \param rawname: Name used as basis to define final unique idname. */ -static void manipulator_unique_idname_set(wmManipulatorGroup *mgroup, wmManipulator *manipulator, const char *rawname) +static void manipulator_unique_idname_set(wmManipulatorGroup *mgroup, wmManipulator *mpr, const char *rawname) { - if (mgroup->type->idname[0]) { - BLI_snprintf(manipulator->idname, sizeof(manipulator->idname), "%s_%s", mgroup->type->idname, rawname); - } - else { - BLI_strncpy(manipulator->idname, rawname, sizeof(manipulator->idname)); - } + BLI_snprintf(mpr->name, sizeof(mpr->name), "%s_%s", mgroup->type->idname, rawname); /* ensure name is unique, append '.001', '.002', etc if not */ - BLI_uniquename(&mgroup->manipulators, manipulator, "Manipulator", '.', - offsetof(wmManipulator, idname), sizeof(manipulator->idname)); + BLI_uniquename(&mgroup->manipulators, mpr, "Manipulator", '.', + offsetof(wmManipulator, name), sizeof(mpr->name)); } /** @@ -199,61 +239,67 @@ static void manipulator_unique_idname_set(wmManipulatorGroup *mgroup, wmManipula */ static void manipulator_init(wmManipulator *mpr) { - const float col_default[4] = {1.0f, 1.0f, 1.0f, 1.0f}; + const float color_default[4] = {1.0f, 1.0f, 1.0f, 1.0f}; mpr->user_scale = 1.0f; mpr->line_width = 1.0f; /* defaults */ - copy_v4_v4(mpr->col, col_default); - copy_v4_v4(mpr->col_hi, col_default); - - mpr->props = MEM_callocN(sizeof(PropertyRNA *) * mpr->type->prop_len_max, "manipulator->props"); - mpr->ptr = MEM_callocN(sizeof(PointerRNA) * mpr->type->prop_len_max, "manipulator->ptr"); + copy_v4_v4(mpr->color, color_default); + copy_v4_v4(mpr->color_hi, color_default); } /** * Register \a manipulator. * * \param name: name used to create a unique idname for \a manipulator in \a mgroup + * + * \note Not to be confused with type registration from RNA. */ -static void wm_manipulator_register(wmManipulatorGroup *mgroup, wmManipulator *manipulator, const char *name) +static void wm_manipulator_register(wmManipulatorGroup *mgroup, wmManipulator *mpr, const char *name) { - manipulator_init(manipulator); - manipulator_unique_idname_set(mgroup, manipulator, name); - wm_manipulatorgroup_manipulator_register(mgroup, manipulator); + manipulator_init(mpr); + manipulator_unique_idname_set(mgroup, mpr, name); + wm_manipulatorgroup_manipulator_register(mgroup, mpr); } /** * Free \a manipulator and unlink from \a manipulatorlist. * \a manipulatorlist is allowed to be NULL. */ -void WM_manipulator_delete(ListBase *manipulatorlist, wmManipulatorMap *mmap, wmManipulator *manipulator, bContext *C) +void WM_manipulator_free(ListBase *manipulatorlist, wmManipulatorMap *mmap, wmManipulator *mpr, bContext *C) { - if (manipulator->state & WM_MANIPULATOR_STATE_HIGHLIGHT) { - wm_manipulatormap_set_highlighted_manipulator(mmap, C, NULL, 0); +#ifdef WITH_PYTHON + if (mpr->py_instance) { + /* do this first in case there are any __del__ functions or + * similar that use properties */ + BPY_DECREF_RNA_INVALIDATE(mpr->py_instance); + } +#endif + + if (mpr->state & WM_MANIPULATOR_STATE_HIGHLIGHT) { + wm_manipulatormap_highlight_set(mmap, C, NULL, 0); } - if (manipulator->state & WM_MANIPULATOR_STATE_ACTIVE) { - wm_manipulatormap_set_active_manipulator(mmap, C, NULL, NULL); + if (mpr->state & WM_MANIPULATOR_STATE_ACTIVE) { + wm_manipulatormap_active_set(mmap, C, NULL, NULL); } - if (manipulator->state & WM_MANIPULATOR_STATE_SELECT) { - wm_manipulator_deselect(mmap, manipulator); + if (mpr->state & WM_MANIPULATOR_STATE_SELECT) { + wm_manipulator_deselect(mmap, mpr); } - if (manipulator->opptr.data) { - WM_operator_properties_free(&manipulator->opptr); + if (mpr->opptr.data) { + WM_operator_properties_free(&mpr->opptr); } - MEM_freeN(manipulator->props); - MEM_freeN(manipulator->ptr); + BLI_freelistN(&mpr->properties); if (manipulatorlist) - BLI_remlink(manipulatorlist, manipulator); - MEM_freeN(manipulator); + BLI_remlink(manipulatorlist, mpr); + MEM_freeN(mpr); } -wmManipulatorGroup *wm_manipulator_get_parent_group(const wmManipulator *manipulator) +wmManipulatorGroup *wm_manipulator_get_parent_group(const wmManipulator *mpr) { - return manipulator->parent_mgroup; + return mpr->parent_mgroup; } @@ -264,36 +310,48 @@ wmManipulatorGroup *wm_manipulator_get_parent_group(const wmManipulator *manipul * * \{ */ -void WM_manipulator_set_property(wmManipulator *manipulator, const int slot, PointerRNA *ptr, const char *propname) +struct wmManipulatorProperty *WM_manipulator_get_property(wmManipulator *mpr, const char *idname) { - if (slot < 0 || slot >= manipulator->type->prop_len_max) { - fprintf(stderr, "invalid index %d when binding property for manipulator type %s\n", slot, manipulator->idname); - return; + return BLI_findstring(&mpr->properties, idname, offsetof(wmManipulatorProperty, idname)); +} + +void WM_manipulator_def_property( + wmManipulator *mpr, const char *idname, + PointerRNA *ptr, const char *propname, int index) +{ + wmManipulatorProperty *mpr_prop = WM_manipulator_get_property(mpr, idname); + + if (mpr_prop == NULL) { + const uint idname_size = strlen(idname) + 1; + mpr_prop = MEM_callocN(sizeof(wmManipulatorProperty) + idname_size, __func__); + memcpy(mpr_prop->idname, idname, idname_size); + BLI_addtail(&mpr->properties, mpr_prop); } /* if manipulator evokes an operator we cannot use it for property manipulation */ - manipulator->opname = NULL; - manipulator->ptr[slot] = *ptr; - manipulator->props[slot] = RNA_struct_find_property(ptr, propname); + mpr->opname = NULL; + mpr_prop->ptr = *ptr; + mpr_prop->prop = RNA_struct_find_property(ptr, propname); + mpr_prop->index = index; - if (manipulator->type->prop_data_update) { - manipulator->type->prop_data_update(manipulator, slot); + if (mpr->type->property_update) { + mpr->type->property_update(mpr, mpr_prop); } } -PointerRNA *WM_manipulator_set_operator(wmManipulator *manipulator, const char *opname) +PointerRNA *WM_manipulator_set_operator(wmManipulator *mpr, const char *opname) { wmOperatorType *ot = WM_operatortype_find(opname, 0); if (ot) { - manipulator->opname = opname; + mpr->opname = opname; - if (manipulator->opptr.data) { - WM_operator_properties_free(&manipulator->opptr); + if (mpr->opptr.data) { + WM_operator_properties_free(&mpr->opptr); } - WM_operator_properties_create_ptr(&manipulator->opptr, ot); + WM_operator_properties_create_ptr(&mpr->opptr, ot); - return &manipulator->opptr; + return &mpr->opptr; } else { fprintf(stderr, "Error binding operator to manipulator: operator %s not found!\n", opname); @@ -302,34 +360,34 @@ PointerRNA *WM_manipulator_set_operator(wmManipulator *manipulator, const char * return NULL; } -void WM_manipulator_set_origin(wmManipulator *manipulator, const float origin[3]) +void WM_manipulator_set_origin(wmManipulator *mpr, const float origin[3]) { - copy_v3_v3(manipulator->origin, origin); + copy_v3_v3(mpr->origin, origin); } -void WM_manipulator_set_offset(wmManipulator *manipulator, const float offset[3]) +void WM_manipulator_set_offset(wmManipulator *mpr, const float offset[3]) { - copy_v3_v3(manipulator->offset, offset); + copy_v3_v3(mpr->offset, offset); } -void WM_manipulator_set_flag(wmManipulator *manipulator, const int flag, const bool enable) +void WM_manipulator_set_flag(wmManipulator *mpr, const int flag, const bool enable) { if (enable) { - manipulator->flag |= flag; + mpr->flag |= flag; } else { - manipulator->flag &= ~flag; + mpr->flag &= ~flag; } } -void WM_manipulator_set_scale(wmManipulator *manipulator, const float scale) +void WM_manipulator_set_scale(wmManipulator *mpr, const float scale) { - manipulator->user_scale = scale; + mpr->user_scale = scale; } -void WM_manipulator_set_line_width(wmManipulator *manipulator, const float line_width) +void WM_manipulator_set_line_width(wmManipulator *mpr, const float line_width) { - manipulator->line_width = line_width; + mpr->line_width = line_width; } /** @@ -338,22 +396,22 @@ void WM_manipulator_set_line_width(wmManipulator *manipulator, const float line_ * \param col Normal state color. * \param col_hi Highlighted state color. */ -void WM_manipulator_get_color(const wmManipulator *manipulator, float col[4]) +void WM_manipulator_get_color(const wmManipulator *mpr, float col[4]) { - copy_v4_v4(col, manipulator->col); + copy_v4_v4(col, mpr->color); } -void WM_manipulator_set_color(wmManipulator *manipulator, const float col[4]) +void WM_manipulator_set_color(wmManipulator *mpr, const float col[4]) { - copy_v4_v4(manipulator->col, col); + copy_v4_v4(mpr->color, col); } -void WM_manipulator_get_color_highlight(const wmManipulator *manipulator, float col_hi[4]) +void WM_manipulator_get_color_highlight(const wmManipulator *mpr, float color_hi[4]) { - copy_v4_v4(col_hi, manipulator->col_hi); + copy_v4_v4(color_hi, mpr->color_hi); } -void WM_manipulator_set_color_highlight(wmManipulator *manipulator, const float col_hi[4]) +void WM_manipulator_set_color_highlight(wmManipulator *mpr, const float color_hi[4]) { - copy_v4_v4(manipulator->col_hi, col_hi); + copy_v4_v4(mpr->color_hi, color_hi); } @@ -365,51 +423,10 @@ void WM_manipulator_set_color_highlight(wmManipulator *manipulator, const float * * \{ */ -#if 0 -void WM_manipulator_set_fn_draw(wmManipulator *mpr, wmManipulatorFnDraw draw_fn) -{ - mpr->type->draw = draw_fn; -} -void WM_manipulator_set_fn_draw_select(struct wmManipulator *mpr, wmManipulatorFnDrawSelect fn) -{ - mpr->type->draw_select = fn; -} -void WM_manipulator_set_fn_intersect(wmManipulator *mpr, wmManipulatorFnIntersect fn) +void WM_manipulator_set_fn_custom_modal(struct wmManipulator *mpr, wmManipulatorFnModal fn) { - mpr->type->intersect = fn; + mpr->custom_modal = fn; } -#endif -void WM_manipulator_set_fn_custom_handler(struct wmManipulator *mpr, wmManipulatorFnHandler fn) -{ - mpr->custom_handler = fn; -} -#if 0 -void WM_manipulator_set_fn_prop_data_update(struct wmManipulator *mpr, wmManipulatorFnPropDataUpdate fn) -{ - mpr->type->prop_data_update = fn; -} -void WM_manipulator_set_fn_final_position_get(struct wmManipulator *mpr, wmManipulatorFnFinalPositionGet fn) -{ - mpr->type->final_position_get = fn; -} -void WM_manipulator_set_fn_invoke(struct wmManipulator *mpr, wmManipulatorFnInvoke fn) -{ - mpr->type->invoke = fn; -} -void WM_manipulator_set_fn_exit(struct wmManipulator *mpr, wmManipulatorFnExit fn) -{ - mpr->type->exit = fn; -} -void WM_manipulator_set_fn_cursor_get(struct wmManipulator *mpr, wmManipulatorFnCursorGet fn) -{ - mpr->type->cursor_get = fn; -} -void WM_manipulator_set_fn_select(wmManipulator *mpr, wmManipulatorFnSelect fn) -{ - BLI_assert(mpr->parent_mgroup->type->flag & WM_MANIPULATORGROUPTYPE_SELECTABLE); - mpr->type->select = fn; -} -#endif /** \} */ @@ -422,22 +439,22 @@ void WM_manipulator_set_fn_select(wmManipulator *mpr, wmManipulatorFnSelect fn) * * \return if the selection has changed. */ -bool wm_manipulator_deselect(wmManipulatorMap *mmap, wmManipulator *manipulator) +bool wm_manipulator_deselect(wmManipulatorMap *mmap, wmManipulator *mpr) { - if (!mmap->mmap_context.selected_manipulator) + if (!mmap->mmap_context.selected) return false; - wmManipulator ***sel = &mmap->mmap_context.selected_manipulator; - int *tot_selected = &mmap->mmap_context.tot_selected; + wmManipulator ***sel = &mmap->mmap_context.selected; + int *selected_len = &mmap->mmap_context.selected_len; bool changed = false; /* caller should check! */ - BLI_assert(manipulator->state & WM_MANIPULATOR_STATE_SELECT); + BLI_assert(mpr->state & WM_MANIPULATOR_STATE_SELECT); /* remove manipulator from selected_manipulators array */ - for (int i = 0; i < (*tot_selected); i++) { - if ((*sel)[i] == manipulator) { - for (int j = i; j < ((*tot_selected) - 1); j++) { + for (int i = 0; i < (*selected_len); i++) { + if ((*sel)[i] == mpr) { + for (int j = i; j < ((*selected_len) - 1); j++) { (*sel)[j] = (*sel)[j + 1]; } changed = true; @@ -446,15 +463,15 @@ bool wm_manipulator_deselect(wmManipulatorMap *mmap, wmManipulator *manipulator) } /* update array data */ - if ((*tot_selected) <= 1) { - wm_manipulatormap_selected_delete(mmap); + if ((*selected_len) <= 1) { + wm_manipulatormap_selected_clear(mmap); } else { - *sel = MEM_reallocN(*sel, sizeof(**sel) * (*tot_selected)); - (*tot_selected)--; + *sel = MEM_reallocN(*sel, sizeof(**sel) * (*selected_len)); + (*selected_len)--; } - manipulator->state &= ~WM_MANIPULATOR_STATE_SELECT; + mpr->state &= ~WM_MANIPULATOR_STATE_SELECT; return changed; } @@ -464,43 +481,43 @@ bool wm_manipulator_deselect(wmManipulatorMap *mmap, wmManipulator *manipulator) * * \return if the selection has changed. */ -bool wm_manipulator_select(bContext *C, wmManipulatorMap *mmap, wmManipulator *manipulator) +bool wm_manipulator_select(bContext *C, wmManipulatorMap *mmap, wmManipulator *mpr) { - wmManipulator ***sel = &mmap->mmap_context.selected_manipulator; - int *tot_selected = &mmap->mmap_context.tot_selected; + wmManipulator ***sel = &mmap->mmap_context.selected; + int *selected_len = &mmap->mmap_context.selected_len; - if (!manipulator || (manipulator->state & WM_MANIPULATOR_STATE_SELECT)) + if (!mpr || (mpr->state & WM_MANIPULATOR_STATE_SELECT)) return false; - (*tot_selected)++; + (*selected_len)++; - *sel = MEM_reallocN(*sel, sizeof(wmManipulator *) * (*tot_selected)); - (*sel)[(*tot_selected) - 1] = manipulator; + *sel = MEM_reallocN(*sel, sizeof(wmManipulator *) * (*selected_len)); + (*sel)[(*selected_len) - 1] = mpr; - manipulator->state |= WM_MANIPULATOR_STATE_SELECT; - if (manipulator->type->select) { - manipulator->type->select(C, manipulator, SEL_SELECT); + mpr->state |= WM_MANIPULATOR_STATE_SELECT; + if (mpr->type->select) { + mpr->type->select(C, mpr, SEL_SELECT); } - wm_manipulatormap_set_highlighted_manipulator(mmap, C, manipulator, manipulator->highlighted_part); + wm_manipulatormap_highlight_set(mmap, C, mpr, mpr->highlight_part); return true; } -void wm_manipulator_calculate_scale(wmManipulator *manipulator, const bContext *C) +void wm_manipulator_calculate_scale(wmManipulator *mpr, const bContext *C) { const RegionView3D *rv3d = CTX_wm_region_view3d(C); float scale = 1.0f; - if (manipulator->parent_mgroup->type->flag & WM_MANIPULATORGROUPTYPE_SCALE_3D) { + if (mpr->parent_mgroup->type->flag & WM_MANIPULATORGROUPTYPE_SCALE_3D) { if (rv3d /*&& (U.manipulator_flag & V3D_DRAW_MANIPULATOR) == 0*/) { /* UserPref flag might be useful for later */ - if (manipulator->type->position_get) { + if (mpr->type->position_get) { float position[3]; - manipulator->type->position_get(manipulator, position); + mpr->type->position_get(mpr, position); scale = ED_view3d_pixel_size(rv3d, position) * (float)U.manipulator_scale; } else { - scale = ED_view3d_pixel_size(rv3d, manipulator->origin) * (float)U.manipulator_scale; + scale = ED_view3d_pixel_size(rv3d, mpr->origin) * (float)U.manipulator_scale; } } else { @@ -508,43 +525,43 @@ void wm_manipulator_calculate_scale(wmManipulator *manipulator, const bContext * } } - manipulator->scale = scale * manipulator->user_scale; + mpr->scale = scale * mpr->user_scale; } -static void manipulator_update_prop_data(wmManipulator *manipulator) +static void manipulator_update_prop_data(wmManipulator *mpr) { /* manipulator property might have been changed, so update manipulator */ - if (manipulator->props && manipulator->type->prop_data_update) { - for (int i = 0; i < manipulator->type->prop_len_max; i++) { - if (manipulator->props[i]) { - manipulator->type->prop_data_update(manipulator, i); + if (mpr->type->property_update && !BLI_listbase_is_empty(&mpr->properties)) { + for (wmManipulatorProperty *mpr_prop = mpr->properties.first; mpr_prop; mpr_prop = mpr_prop->next) { + if (mpr_prop->prop != NULL) { + mpr->type->property_update(mpr, mpr_prop); } } } } -void wm_manipulator_update(wmManipulator *manipulator, const bContext *C, const bool refresh_map) +void wm_manipulator_update(wmManipulator *mpr, const bContext *C, const bool refresh_map) { if (refresh_map) { - manipulator_update_prop_data(manipulator); + manipulator_update_prop_data(mpr); } - wm_manipulator_calculate_scale(manipulator, C); + wm_manipulator_calculate_scale(mpr, C); } -bool wm_manipulator_is_visible(wmManipulator *manipulator) +bool wm_manipulator_is_visible(wmManipulator *mpr) { - if (manipulator->flag & WM_MANIPULATOR_HIDDEN) { + if (mpr->flag & WM_MANIPULATOR_HIDDEN) { return false; } - if ((manipulator->state & WM_MANIPULATOR_STATE_ACTIVE) && - !(manipulator->flag & (WM_MANIPULATOR_DRAW_ACTIVE | WM_MANIPULATOR_DRAW_VALUE))) + if ((mpr->state & WM_MANIPULATOR_STATE_ACTIVE) && + !(mpr->flag & (WM_MANIPULATOR_DRAW_ACTIVE | WM_MANIPULATOR_DRAW_VALUE))) { /* don't draw while active (while dragging) */ return false; } - if ((manipulator->flag & WM_MANIPULATOR_DRAW_HOVER) && - !(manipulator->state & WM_MANIPULATOR_STATE_HIGHLIGHT) && - !(manipulator->state & WM_MANIPULATOR_STATE_SELECT)) /* still draw selected manipulators */ + if ((mpr->flag & WM_MANIPULATOR_DRAW_HOVER) && + !(mpr->state & WM_MANIPULATOR_STATE_HIGHLIGHT) && + !(mpr->state & WM_MANIPULATOR_STATE_SELECT)) /* still draw selected manipulators */ { /* only draw on mouse hover */ return false; diff --git a/source/blender/windowmanager/manipulators/intern/wm_manipulator_intern.h b/source/blender/windowmanager/manipulators/intern/wm_manipulator_intern.h index bf2240e7219..0692b1830db 100644 --- a/source/blender/windowmanager/manipulators/intern/wm_manipulator_intern.h +++ b/source/blender/windowmanager/manipulators/intern/wm_manipulator_intern.h @@ -38,12 +38,12 @@ struct GHashIterator; /* -------------------------------------------------------------------- */ /* wmManipulator */ -bool wm_manipulator_deselect(struct wmManipulatorMap *mmap, struct wmManipulator *manipulator); -bool wm_manipulator_select(bContext *C, struct wmManipulatorMap *mmap, struct wmManipulator *manipulator); +bool wm_manipulator_deselect(struct wmManipulatorMap *mmap, struct wmManipulator *mpr); +bool wm_manipulator_select(bContext *C, struct wmManipulatorMap *mmap, struct wmManipulator *mpr); -void wm_manipulator_calculate_scale(struct wmManipulator *manipulator, const bContext *C); -void wm_manipulator_update(struct wmManipulator *manipulator, const bContext *C, const bool refresh_map); -bool wm_manipulator_is_visible(struct wmManipulator *manipulator); +void wm_manipulator_calculate_scale(struct wmManipulator *mpr, const bContext *C); +void wm_manipulator_update(struct wmManipulator *mpr, const bContext *C, const bool refresh_map); +bool wm_manipulator_is_visible(struct wmManipulator *mpr); /* -------------------------------------------------------------------- */ /* wmManipulatorGroup */ @@ -56,19 +56,19 @@ enum { }; struct wmManipulatorGroup *wm_manipulatorgroup_new_from_type( - struct wmManipulatorMap *mmap, struct wmManipulatorGroupType *mgrouptype); + struct wmManipulatorMap *mmap, struct wmManipulatorGroupType *mgroup_type); void wm_manipulatorgroup_free(bContext *C, struct wmManipulatorGroup *mgroup); -void wm_manipulatorgroup_manipulator_register(struct wmManipulatorGroup *mgroup, struct wmManipulator *manipulator); +void wm_manipulatorgroup_manipulator_register(struct wmManipulatorGroup *mgroup, struct wmManipulator *mpr); struct wmManipulator *wm_manipulatorgroup_find_intersected_mainpulator( const struct wmManipulatorGroup *mgroup, struct bContext *C, const struct wmEvent *event, - unsigned char *part); + int *r_part); void wm_manipulatorgroup_intersectable_manipulators_to_list( const struct wmManipulatorGroup *mgroup, struct ListBase *listbase); void wm_manipulatorgroup_ensure_initialized(struct wmManipulatorGroup *mgroup, const struct bContext *C); bool wm_manipulatorgroup_is_visible(const struct wmManipulatorGroup *mgroup, const struct bContext *C); bool wm_manipulatorgroup_is_visible_in_drawstep(const struct wmManipulatorGroup *mgroup, const int drawstep); -void wm_manipulatorgrouptype_keymap_init(struct wmManipulatorGroupType *mgrouptype, struct wmKeyConfig *keyconf); +void wm_manipulatorgrouptype_setup_keymap(struct wmManipulatorGroupType *wgt, struct wmKeyConfig *keyconf); /* -------------------------------------------------------------------- */ @@ -90,13 +90,13 @@ struct wmManipulatorMap { */ struct { /* we redraw the manipulator-map when this changes */ - struct wmManipulator *highlighted_manipulator; + struct wmManipulator *highlight; /* user has clicked this manipulator and it gets all input */ - struct wmManipulator *active_manipulator; + struct wmManipulator *active; /* array for all selected manipulators * TODO check on using BLI_array */ - struct wmManipulator **selected_manipulator; - int tot_selected; + struct wmManipulator **selected; + int selected_len; } mmap_context; }; @@ -114,7 +114,7 @@ struct wmManipulatorMapType { ListBase manipulator_grouptypes; }; -void wm_manipulatormap_selected_delete(struct wmManipulatorMap *mmap); +void wm_manipulatormap_selected_clear(struct wmManipulatorMap *mmap); bool wm_manipulatormap_deselect_all(struct wmManipulatorMap *mmap, struct wmManipulator ***sel); #endif \ No newline at end of file diff --git a/source/blender/windowmanager/manipulators/intern/wm_manipulatorgroup.c b/source/blender/windowmanager/manipulators/intern/wm_manipulatorgroup.c index 94e12b88dcd..ac478fe5e95 100644 --- a/source/blender/windowmanager/manipulators/intern/wm_manipulatorgroup.c +++ b/source/blender/windowmanager/manipulators/intern/wm_manipulatorgroup.c @@ -73,13 +73,13 @@ enum { }; /** - * Create a new manipulator-group from \a mgrouptype. + * Create a new manipulator-group from \a wgt. */ wmManipulatorGroup *wm_manipulatorgroup_new_from_type( - wmManipulatorMap *mmap, wmManipulatorGroupType *mgrouptype) + wmManipulatorMap *mmap, wmManipulatorGroupType *wgt) { wmManipulatorGroup *mgroup = MEM_callocN(sizeof(*mgroup), "manipulator-group"); - mgroup->type = mgrouptype; + mgroup->type = wgt; /* keep back-link */ mgroup->parent_mmap = mmap; @@ -92,10 +92,9 @@ wmManipulatorGroup *wm_manipulatorgroup_new_from_type( void wm_manipulatorgroup_free(bContext *C, wmManipulatorGroup *mgroup) { wmManipulatorMap *mmap = mgroup->parent_mmap; - for (wmManipulator *manipulator = mgroup->manipulators.first; manipulator;) { - wmManipulator *manipulator_next = manipulator->next; - WM_manipulator_delete(&mgroup->manipulators, mmap, manipulator, C); - manipulator = manipulator_next; + for (wmManipulator *mpr = mgroup->manipulators.first, *mpr_next; mpr; mpr = mpr_next) { + mpr_next = mpr->next; + WM_manipulator_free(&mgroup->manipulators, mmap, mpr, C); } BLI_assert(BLI_listbase_is_empty(&mgroup->manipulators)); @@ -120,48 +119,28 @@ void wm_manipulatorgroup_free(bContext *C, wmManipulatorGroup *mgroup) } BLI_remlink(&mmap->manipulator_groups, mgroup); + MEM_freeN(mgroup); } /** * Add \a manipulator to \a mgroup and make sure its name is unique within the group. */ -void wm_manipulatorgroup_manipulator_register(wmManipulatorGroup *mgroup, wmManipulator *manipulator) +void wm_manipulatorgroup_manipulator_register(wmManipulatorGroup *mgroup, wmManipulator *mpr) { - BLI_assert(!BLI_findstring(&mgroup->manipulators, manipulator->idname, offsetof(wmManipulator, idname))); - BLI_addtail(&mgroup->manipulators, manipulator); - manipulator->parent_mgroup = mgroup; -} - -void wm_manipulatorgroup_attach_to_modal_handler( - bContext *C, wmEventHandler *handler, - wmManipulatorGroupType *mgrouptype, wmOperator *op) -{ - /* maybe overly careful, but manipulator-grouptype could come from a failed creation */ - if (!mgrouptype) { - return; - } - - /* now instantiate the manipulator-map */ - mgrouptype->op = op; - - /* try to find map in handler region that contains mgrouptype */ - if (handler->op_region && handler->op_region->manipulator_map) { - handler->manipulator_map = handler->op_region->manipulator_map; - ED_region_tag_redraw(handler->op_region); - } - - WM_event_add_mousemove(C); + BLI_assert(!BLI_findstring(&mgroup->manipulators, mpr->name, offsetof(wmManipulator, name))); + BLI_addtail(&mgroup->manipulators, mpr); + mpr->parent_mgroup = mgroup; } wmManipulator *wm_manipulatorgroup_find_intersected_mainpulator( const wmManipulatorGroup *mgroup, bContext *C, const wmEvent *event, - unsigned char *part) + int *r_part) { - for (wmManipulator *manipulator = mgroup->manipulators.first; manipulator; manipulator = manipulator->next) { - if (manipulator->type->intersect && (manipulator->flag & WM_MANIPULATOR_HIDDEN) == 0) { - if ((*part = manipulator->type->intersect(C, manipulator, event))) { - return manipulator; + for (wmManipulator *mpr = mgroup->manipulators.first; mpr; mpr = mpr->next) { + if (mpr->type->test_select && (mpr->flag & WM_MANIPULATOR_HIDDEN) == 0) { + if ((*r_part = mpr->type->test_select(C, mpr, event))) { + return mpr; } } } @@ -174,12 +153,12 @@ wmManipulator *wm_manipulatorgroup_find_intersected_mainpulator( */ void wm_manipulatorgroup_intersectable_manipulators_to_list(const wmManipulatorGroup *mgroup, ListBase *listbase) { - for (wmManipulator *manipulator = mgroup->manipulators.first; manipulator; manipulator = manipulator->next) { - if ((manipulator->flag & WM_MANIPULATOR_HIDDEN) == 0) { - if (((mgroup->type->flag & WM_MANIPULATORGROUPTYPE_IS_3D) && manipulator->type->draw_select) || - ((mgroup->type->flag & WM_MANIPULATORGROUPTYPE_IS_3D) == 0 && manipulator->type->intersect)) + for (wmManipulator *mpr = mgroup->manipulators.first; mpr; mpr = mpr->next) { + if ((mpr->flag & WM_MANIPULATOR_HIDDEN) == 0) { + if (((mgroup->type->flag & WM_MANIPULATORGROUPTYPE_3D) && mpr->type->draw_select) || + ((mgroup->type->flag & WM_MANIPULATORGROUPTYPE_3D) == 0 && mpr->type->test_select)) { - BLI_addhead(listbase, BLI_genericNodeN(manipulator)); + BLI_addhead(listbase, BLI_genericNodeN(mpr)); } } } @@ -189,7 +168,16 @@ void wm_manipulatorgroup_ensure_initialized(wmManipulatorGroup *mgroup, const bC { /* prepare for first draw */ if (UNLIKELY((mgroup->flag & WM_MANIPULATORGROUP_INITIALIZED) == 0)) { - mgroup->type->init(C, mgroup); + mgroup->type->setup(C, mgroup); + + /* Not ideal, initialize keymap here, needed for RNA runtime generated manipulators. */ + wmManipulatorGroupType *wgt = mgroup->type; + if (wgt->keymap == NULL) { + wmWindowManager *wm = CTX_wm_manager(C); + wm_manipulatorgrouptype_setup_keymap(wgt, wm->defaultconf); + BLI_assert(wgt->keymap != NULL); + } + mgroup->flag |= WM_MANIPULATORGROUP_INITIALIZED; } } @@ -197,19 +185,18 @@ void wm_manipulatorgroup_ensure_initialized(wmManipulatorGroup *mgroup, const bC bool wm_manipulatorgroup_is_visible(const wmManipulatorGroup *mgroup, const bContext *C) { /* Check for poll function, if manipulator-group belongs to an operator, also check if the operator is running. */ - return ((mgroup->type->flag & WM_MANIPULATORGROUPTYPE_OP) == 0 || mgroup->type->op) && - (!mgroup->type->poll || mgroup->type->poll(C, mgroup->type)); + return (!mgroup->type->poll || mgroup->type->poll(C, mgroup->type)); } bool wm_manipulatorgroup_is_visible_in_drawstep(const wmManipulatorGroup *mgroup, const int drawstep) { switch (drawstep) { case WM_MANIPULATORMAP_DRAWSTEP_2D: - return (mgroup->type->flag & WM_MANIPULATORGROUPTYPE_IS_3D) == 0; + return (mgroup->type->flag & WM_MANIPULATORGROUPTYPE_3D) == 0; case WM_MANIPULATORMAP_DRAWSTEP_3D: - return (mgroup->type->flag & WM_MANIPULATORGROUPTYPE_IS_3D); + return (mgroup->type->flag & WM_MANIPULATORGROUPTYPE_3D); case WM_MANIPULATORMAP_DRAWSTEP_IN_SCENE: - return (mgroup->type->flag & WM_MANIPULATORGROUPTYPE_SCENE_DEPTH); + return (mgroup->type->flag & WM_MANIPULATORGROUPTYPE_DEPTH_3D); default: BLI_assert(0); return false; @@ -226,8 +213,8 @@ static int manipulator_select_invoke(bContext *C, wmOperator *op, const wmEvent { ARegion *ar = CTX_wm_region(C); wmManipulatorMap *mmap = ar->manipulator_map; - wmManipulator ***sel = &mmap->mmap_context.selected_manipulator; - wmManipulator *highlighted = mmap->mmap_context.highlighted_manipulator; + wmManipulator ***sel = &mmap->mmap_context.selected; + wmManipulator *highlight = mmap->mmap_context.highlight; bool extend = RNA_boolean_get(op->ptr, "extend"); bool deselect = RNA_boolean_get(op->ptr, "deselect"); @@ -236,11 +223,11 @@ static int manipulator_select_invoke(bContext *C, wmOperator *op, const wmEvent /* deselect all first */ if (extend == false && deselect == false && toggle == false) { wm_manipulatormap_deselect_all(mmap, sel); - BLI_assert(*sel == NULL && mmap->mmap_context.tot_selected == 0); + BLI_assert(*sel == NULL && mmap->mmap_context.selected_len == 0); } - if (highlighted) { - const bool is_selected = (highlighted->state & WM_MANIPULATOR_STATE_SELECT); + if (highlight) { + const bool is_selected = (highlight->state & WM_MANIPULATOR_STATE_SELECT); bool redraw = false; if (toggle) { @@ -249,11 +236,11 @@ static int manipulator_select_invoke(bContext *C, wmOperator *op, const wmEvent } if (deselect) { - if (is_selected && wm_manipulator_deselect(mmap, highlighted)) { + if (is_selected && wm_manipulator_deselect(mmap, highlight)) { redraw = true; } } - else if (wm_manipulator_select(C, mmap, highlighted)) { + else if (wm_manipulator_select(C, mmap, highlight)) { redraw = true; } @@ -300,16 +287,16 @@ static void manipulator_tweak_finish(bContext *C, wmOperator *op, const bool can if (mtweak->active->type->exit) { mtweak->active->type->exit(C, mtweak->active, cancel); } - wm_manipulatormap_set_active_manipulator(mtweak->mmap, C, NULL, NULL); + wm_manipulatormap_active_set(mtweak->mmap, C, NULL, NULL); MEM_freeN(mtweak); } static int manipulator_tweak_modal(bContext *C, wmOperator *op, const wmEvent *event) { ManipulatorTweakData *mtweak = op->customdata; - wmManipulator *manipulator = mtweak->active; + wmManipulator *mpr = mtweak->active; - if (!manipulator) { + if (mpr == NULL) { BLI_assert(0); return (OPERATOR_CANCELLED | OPERATOR_PASS_THROUGH); } @@ -338,11 +325,11 @@ static int manipulator_tweak_modal(bContext *C, wmOperator *op, const wmEvent *e } /* handle manipulator */ - if (manipulator->custom_handler) { - manipulator->custom_handler(C, manipulator, event, mtweak->flag); + if (mpr->custom_modal) { + mpr->custom_modal(C, mpr, event, mtweak->flag); } - else if (manipulator->type->handler) { - manipulator->type->handler(C, manipulator, event, mtweak->flag); + else if (mpr->type->modal) { + mpr->type->modal(C, mpr, event, mtweak->flag); } /* Ugly hack to send manipulator events */ @@ -357,9 +344,9 @@ static int manipulator_tweak_invoke(bContext *C, wmOperator *op, const wmEvent * { ARegion *ar = CTX_wm_region(C); wmManipulatorMap *mmap = ar->manipulator_map; - wmManipulator *manipulator = mmap->mmap_context.highlighted_manipulator; + wmManipulator *mpr = mmap->mmap_context.highlight; - if (!manipulator) { + if (!mpr) { /* wm_handlers_do_intern shouldn't let this happen */ BLI_assert(0); return (OPERATOR_CANCELLED | OPERATOR_PASS_THROUGH); @@ -367,12 +354,12 @@ static int manipulator_tweak_invoke(bContext *C, wmOperator *op, const wmEvent * /* activate highlighted manipulator */ - wm_manipulatormap_set_active_manipulator(mmap, C, event, manipulator); + wm_manipulatormap_active_set(mmap, C, event, mpr); /* XXX temporary workaround for modal manipulator operator * conflicting with modal operator attached to manipulator */ - if (manipulator->opname) { - wmOperatorType *ot = WM_operatortype_find(manipulator->opname, true); + if (mpr->opname) { + wmOperatorType *ot = WM_operatortype_find(mpr->opname, true); if (ot->modal) { return OPERATOR_FINISHED; } @@ -382,7 +369,7 @@ static int manipulator_tweak_invoke(bContext *C, wmOperator *op, const wmEvent * ManipulatorTweakData *mtweak = MEM_mallocN(sizeof(ManipulatorTweakData), __func__); mtweak->init_event = event->type; - mtweak->active = mmap->mmap_context.highlighted_manipulator; + mtweak->active = mmap->mmap_context.highlight; mtweak->mmap = mmap; mtweak->flag = 0; @@ -455,13 +442,13 @@ static wmKeyMap *manipulatorgroup_tweak_modal_keymap(wmKeyConfig *keyconf, const /** * Common default keymap for manipulator groups */ -wmKeyMap *WM_manipulatorgroup_keymap_common(const struct wmManipulatorGroupType *mgrouptype, wmKeyConfig *config) +wmKeyMap *WM_manipulatorgroup_keymap_common(const struct wmManipulatorGroupType *wgt, wmKeyConfig *config) { /* Use area and region id since we might have multiple manipulators with the same name in different areas/regions */ - wmKeyMap *km = WM_keymap_find(config, mgrouptype->name, mgrouptype->spaceid, mgrouptype->regionid); + wmKeyMap *km = WM_keymap_find(config, wgt->name, wgt->spaceid, wgt->regionid); WM_keymap_add_item(km, "MANIPULATORGROUP_OT_manipulator_tweak", ACTIONMOUSE, KM_PRESS, KM_ANY, 0); - manipulatorgroup_tweak_modal_keymap(config, mgrouptype->name); + manipulatorgroup_tweak_modal_keymap(config, wgt->name); return km; } @@ -469,13 +456,13 @@ wmKeyMap *WM_manipulatorgroup_keymap_common(const struct wmManipulatorGroupType /** * Variation of #WM_manipulatorgroup_keymap_common but with keymap items for selection */ -wmKeyMap *WM_manipulatorgroup_keymap_common_sel(const struct wmManipulatorGroupType *mgrouptype, wmKeyConfig *config) +wmKeyMap *WM_manipulatorgroup_keymap_common_sel(const struct wmManipulatorGroupType *wgt, wmKeyConfig *config) { /* Use area and region id since we might have multiple manipulators with the same name in different areas/regions */ - wmKeyMap *km = WM_keymap_find(config, mgrouptype->name, mgrouptype->spaceid, mgrouptype->regionid); + wmKeyMap *km = WM_keymap_find(config, wgt->name, wgt->spaceid, wgt->regionid); WM_keymap_add_item(km, "MANIPULATORGROUP_OT_manipulator_tweak", ACTIONMOUSE, KM_PRESS, KM_ANY, 0); - manipulatorgroup_tweak_modal_keymap(config, mgrouptype->name); + manipulatorgroup_tweak_modal_keymap(config, wgt->name); wmKeyMapItem *kmi = WM_keymap_add_item(km, "MANIPULATORGROUP_OT_manipulator_select", SELECTMOUSE, KM_PRESS, 0, 0); RNA_boolean_set(kmi->ptr, "extend", false); @@ -501,12 +488,12 @@ struct wmManipulatorGroupType *WM_manipulatorgrouptype_find( const char *idname) { /* could use hash lookups as operator types do, for now simple search. */ - for (wmManipulatorGroupType *mgrouptype = mmaptype->manipulator_grouptypes.first; - mgrouptype; - mgrouptype = mgrouptype->next) + for (wmManipulatorGroupType *wgt = mmaptype->manipulator_grouptypes.first; + wgt; + wgt = wgt->next) { - if (STREQ(idname, mgrouptype->idname)) { - return mgrouptype; + if (STREQ(idname, wgt->idname)) { + return wgt; } } return NULL; @@ -515,44 +502,47 @@ struct wmManipulatorGroupType *WM_manipulatorgrouptype_find( static wmManipulatorGroupType *wm_manipulatorgrouptype_append__begin(void) { - wmManipulatorGroupType *mgrouptype = MEM_callocN(sizeof(wmManipulatorGroupType), "manipulator-group"); - return mgrouptype; + wmManipulatorGroupType *wgt = MEM_callocN(sizeof(wmManipulatorGroupType), "manipulator-group"); + return wgt; } static void wm_manipulatorgrouptype_append__end( - wmManipulatorMapType *mmaptype, wmManipulatorGroupType *mgrouptype) + wmManipulatorMapType *mmaptype, wmManipulatorGroupType *wgt) { - mgrouptype->spaceid = mmaptype->spaceid; - mgrouptype->regionid = mmaptype->regionid; - BLI_strncpy(mgrouptype->mapidname, mmaptype->idname, MAX_NAME); + BLI_assert(wgt->name != NULL); + BLI_assert(wgt->idname != NULL); + + wgt->spaceid = mmaptype->spaceid; + wgt->regionid = mmaptype->regionid; + BLI_strncpy(wgt->mapidname, mmaptype->idname, MAX_NAME); /* if not set, use default */ - if (!mgrouptype->keymap_init) { - mgrouptype->keymap_init = WM_manipulatorgroup_keymap_common; + if (!wgt->setup_keymap) { + wgt->setup_keymap = WM_manipulatorgroup_keymap_common; } /* add the type for future created areas of the same type */ - BLI_addtail(&mmaptype->manipulator_grouptypes, mgrouptype); + BLI_addtail(&mmaptype->manipulator_grouptypes, wgt); } /** * Use this for registering manipulators on startup. For runtime, use #WM_manipulatorgrouptype_append_runtime. */ wmManipulatorGroupType *WM_manipulatorgrouptype_append( - wmManipulatorMapType *mmaptype, void (*mgrouptype_func)(wmManipulatorGroupType *)) + wmManipulatorMapType *mmaptype, void (*wgt_func)(wmManipulatorGroupType *)) { - wmManipulatorGroupType *mgrouptype = wm_manipulatorgrouptype_append__begin(); - mgrouptype_func(mgrouptype); - wm_manipulatorgrouptype_append__end(mmaptype, mgrouptype); - return mgrouptype; + wmManipulatorGroupType *wgt = wm_manipulatorgrouptype_append__begin(); + wgt_func(wgt); + wm_manipulatorgrouptype_append__end(mmaptype, wgt); + return wgt; } wmManipulatorGroupType *WM_manipulatorgrouptype_append_ptr( - wmManipulatorMapType *mmaptype, void (*mgrouptype_func)(wmManipulatorGroupType *, void *), + wmManipulatorMapType *mmaptype, void (*wgt_func)(wmManipulatorGroupType *, void *), void *userdata) { - wmManipulatorGroupType *mgrouptype = wm_manipulatorgrouptype_append__begin(); - mgrouptype_func(mgrouptype, userdata); - wm_manipulatorgrouptype_append__end(mmaptype, mgrouptype); - return mgrouptype; + wmManipulatorGroupType *wgt = wm_manipulatorgrouptype_append__begin(); + wgt_func(wgt, userdata); + wm_manipulatorgrouptype_append__end(mmaptype, wgt); + return wgt; } /** @@ -560,36 +550,36 @@ wmManipulatorGroupType *WM_manipulatorgrouptype_append_ptr( */ wmManipulatorGroupType *WM_manipulatorgrouptype_append_runtime( const Main *main, wmManipulatorMapType *mmaptype, - void (*mgrouptype_func)(wmManipulatorGroupType *)) + void (*wgt_func)(wmManipulatorGroupType *)) { - wmManipulatorGroupType *mgrouptype = WM_manipulatorgrouptype_append(mmaptype, mgrouptype_func); + wmManipulatorGroupType *wgt = WM_manipulatorgrouptype_append(mmaptype, wgt_func); /* Main is missing on startup when we create new areas. * So this is only called for manipulators initialized on runtime */ - WM_manipulatorgrouptype_init_runtime(main, mmaptype, mgrouptype); + WM_manipulatorgrouptype_init_runtime(main, mmaptype, wgt); - return mgrouptype; + return wgt; } wmManipulatorGroupType *WM_manipulatorgrouptype_append_ptr_runtime( const Main *main, wmManipulatorMapType *mmaptype, - void (*mgrouptype_func)(wmManipulatorGroupType *, void *), + void (*wgt_func)(wmManipulatorGroupType *, void *), void *userdata) { - wmManipulatorGroupType *mgrouptype = WM_manipulatorgrouptype_append_ptr(mmaptype, mgrouptype_func, userdata); + wmManipulatorGroupType *wgt = WM_manipulatorgrouptype_append_ptr(mmaptype, wgt_func, userdata); /* Main is missing on startup when we create new areas. * So this is only called for manipulators initialized on runtime */ - WM_manipulatorgrouptype_init_runtime(main, mmaptype, mgrouptype); + WM_manipulatorgrouptype_init_runtime(main, mmaptype, wgt); - return mgrouptype; + return wgt; } void WM_manipulatorgrouptype_init_runtime( const Main *bmain, wmManipulatorMapType *mmaptype, - wmManipulatorGroupType *mgrouptype) + wmManipulatorGroupType *wgt) { /* init keymap - on startup there's an extra call to init keymaps for 'permanent' manipulator-groups */ - wm_manipulatorgrouptype_keymap_init(mgrouptype, ((wmWindowManager *)bmain->wm.first)->defaultconf); + wm_manipulatorgrouptype_setup_keymap(wgt, ((wmWindowManager *)bmain->wm.first)->defaultconf); /* now create a manipulator for all existing areas */ for (bScreen *sc = bmain->screen.first; sc; sc = sc->id.next) { @@ -599,10 +589,10 @@ void WM_manipulatorgrouptype_init_runtime( for (ARegion *ar = lb->first; ar; ar = ar->next) { wmManipulatorMap *mmap = ar->manipulator_map; if (mmap && mmap->type == mmaptype) { - wm_manipulatorgroup_new_from_type(mmap, mgrouptype); + wm_manipulatorgroup_new_from_type(mmap, wgt); /* just add here, drawing will occur on next update */ - wm_manipulatormap_set_highlighted_manipulator(mmap, NULL, NULL, 0); + wm_manipulatormap_highlight_set(mmap, NULL, NULL, 0); ED_region_tag_redraw(ar); } } @@ -611,7 +601,16 @@ void WM_manipulatorgrouptype_init_runtime( } } -void WM_manipulatorgrouptype_unregister(bContext *C, Main *bmain, wmManipulatorGroupType *mgrouptype) + +/** + * Unlike #WM_manipulatorgrouptype_remove_ptr this doesn't maintain correct state, simply free. + */ +void WM_manipulatorgrouptype_free(wmManipulatorGroupType *wgt) +{ + MEM_freeN(wgt); +} + +void WM_manipulatorgrouptype_remove_ptr(bContext *C, Main *bmain, wmManipulatorGroupType *wgt) { for (bScreen *sc = bmain->screen.first; sc; sc = sc->id.next) { for (ScrArea *sa = sc->areabase.first; sa; sa = sa->next) { @@ -623,7 +622,7 @@ void WM_manipulatorgrouptype_unregister(bContext *C, Main *bmain, wmManipulatorG wmManipulatorGroup *mgroup, *mgroup_next; for (mgroup = mmap->manipulator_groups.first; mgroup; mgroup = mgroup_next) { mgroup_next = mgroup->next; - if (mgroup->type == mgrouptype) { + if (mgroup->type == wgt) { BLI_assert(mgroup->parent_mmap == mmap); wm_manipulatorgroup_free(C, mgroup); ED_region_tag_redraw(ar); @@ -636,18 +635,18 @@ void WM_manipulatorgrouptype_unregister(bContext *C, Main *bmain, wmManipulatorG } wmManipulatorMapType *mmaptype = WM_manipulatormaptype_find(&(const struct wmManipulatorMapType_Params) { - mgrouptype->mapidname, mgrouptype->spaceid, - mgrouptype->regionid}); + wgt->mapidname, wgt->spaceid, + wgt->regionid}); - BLI_remlink(&mmaptype->manipulator_grouptypes, mgrouptype); - mgrouptype->prev = mgrouptype->next = NULL; + BLI_remlink(&mmaptype->manipulator_grouptypes, wgt); + wgt->prev = wgt->next = NULL; - MEM_freeN(mgrouptype); + WM_manipulatorgrouptype_free(wgt); } -void wm_manipulatorgrouptype_keymap_init(wmManipulatorGroupType *mgrouptype, wmKeyConfig *keyconf) +void wm_manipulatorgrouptype_setup_keymap(wmManipulatorGroupType *wgt, wmKeyConfig *keyconf) { - mgrouptype->keymap = mgrouptype->keymap_init(mgrouptype, keyconf); + wgt->keymap = wgt->setup_keymap(wgt, keyconf); } /** \} */ /* wmManipulatorGroupType */ diff --git a/source/blender/windowmanager/manipulators/intern/wm_manipulatormap.c b/source/blender/windowmanager/manipulators/intern/wm_manipulatormap.c index 13900ed8545..6732a4cfee9 100644 --- a/source/blender/windowmanager/manipulators/intern/wm_manipulatormap.c +++ b/source/blender/windowmanager/manipulators/intern/wm_manipulatormap.c @@ -89,23 +89,20 @@ wmManipulatorMap *WM_manipulatormap_new_from_type(const struct wmManipulatorMapT /* create all manipulator-groups for this manipulator-map. We may create an empty one * too in anticipation of manipulators from operators etc */ - for (wmManipulatorGroupType *mgrouptype = mmaptype->manipulator_grouptypes.first; - mgrouptype; - mgrouptype = mgrouptype->next) - { - wm_manipulatorgroup_new_from_type(mmap, mgrouptype); + for (wmManipulatorGroupType *wgt = mmaptype->manipulator_grouptypes.first; wgt; wgt = wgt->next) { + wm_manipulatorgroup_new_from_type(mmap, wgt); } return mmap; } -void wm_manipulatormap_selected_delete(wmManipulatorMap *mmap) +void wm_manipulatormap_selected_clear(wmManipulatorMap *mmap) { - MEM_SAFE_FREE(mmap->mmap_context.selected_manipulator); - mmap->mmap_context.tot_selected = 0; + MEM_SAFE_FREE(mmap->mmap_context.selected); + mmap->mmap_context.selected_len = 0; } -void wm_manipulatormap_delete(wmManipulatorMap *mmap) +void wm_manipulatormap_remove(wmManipulatorMap *mmap) { if (!mmap) return; @@ -117,7 +114,7 @@ void wm_manipulatormap_delete(wmManipulatorMap *mmap) } BLI_assert(BLI_listbase_is_empty(&mmap->manipulator_groups)); - wm_manipulatormap_selected_delete(mmap); + wm_manipulatormap_selected_clear(mmap); MEM_freeN(mmap); } @@ -138,14 +135,11 @@ static GHash *WM_manipulatormap_manipulator_hash_new( /* collect manipulators */ for (wmManipulatorGroup *mgroup = mmap->manipulator_groups.first; mgroup; mgroup = mgroup->next) { if (!mgroup->type->poll || mgroup->type->poll(C, mgroup->type)) { - for (wmManipulator *manipulator = mgroup->manipulators.first; - manipulator; - manipulator = manipulator->next) - { - if ((include_hidden || (manipulator->flag & WM_MANIPULATOR_HIDDEN) == 0) && - (!poll || poll(manipulator, data))) + for (wmManipulator *mpr = mgroup->manipulators.first; mpr; mpr = mpr->next) { + if ((include_hidden || (mpr->flag & WM_MANIPULATOR_HIDDEN) == 0) && + (!poll || poll(mpr, data))) { - BLI_ghash_insert(hash, manipulator->idname, manipulator); + BLI_ghash_insert(hash, mpr->name, mpr); } } } @@ -167,15 +161,15 @@ static void manipulatormap_tag_updated(wmManipulatorMap *mmap) } static bool manipulator_prepare_drawing( - wmManipulatorMap *mmap, wmManipulator *manipulator, + wmManipulatorMap *mmap, wmManipulator *mpr, const bContext *C, ListBase *draw_manipulators) { - if (!wm_manipulator_is_visible(manipulator)) { + if (!wm_manipulator_is_visible(mpr)) { /* skip */ } else { - wm_manipulator_update(manipulator, C, (mmap->update_flag & MANIPULATORMAP_REFRESH) != 0); - BLI_addhead(draw_manipulators, BLI_genericNodeN(manipulator)); + wm_manipulator_update(mpr, C, (mmap->update_flag & MANIPULATORMAP_REFRESH) != 0); + BLI_addhead(draw_manipulators, BLI_genericNodeN(mpr)); return true; } @@ -191,7 +185,7 @@ static void manipulatormap_prepare_drawing( { if (!mmap || BLI_listbase_is_empty(&mmap->manipulator_groups)) return; - wmManipulator *active_manipulator = mmap->mmap_context.active_manipulator; + wmManipulator *active_manipulator = mmap->mmap_context.active; /* only active manipulator needs updating */ if (active_manipulator) { @@ -222,8 +216,8 @@ static void manipulatormap_prepare_drawing( mgroup->type->draw_prepare(C, mgroup); } - for (wmManipulator *manipulator = mgroup->manipulators.first; manipulator; manipulator = manipulator->next) { - manipulator_prepare_drawing(mmap, manipulator, C, draw_manipulators); + for (wmManipulator *mpr = mgroup->manipulators.first; mpr; mpr = mpr->next) { + manipulator_prepare_drawing(mmap, mpr, C, draw_manipulators); } } @@ -252,10 +246,10 @@ static void manipulators_draw_list(const wmManipulatorMap *mmap, const bContext /* draw_manipulators contains all visible manipulators - draw them */ for (LinkData *link = draw_manipulators->first, *link_next; link; link = link_next) { - wmManipulator *manipulator = link->data; + wmManipulator *mpr = link->data; link_next = link->next; - manipulator->type->draw(C, manipulator); + mpr->type->draw(C, mpr); /* free/remove manipulator link after drawing */ BLI_freelinkN(draw_manipulators, link); } @@ -277,12 +271,12 @@ void WM_manipulatormap_draw(wmManipulatorMap *mmap, const bContext *C, const int static void manipulator_find_active_3D_loop(const bContext *C, ListBase *visible_manipulators) { int selectionbase = 0; - wmManipulator *manipulator; + wmManipulator *mpr; for (LinkData *link = visible_manipulators->first; link; link = link->next) { - manipulator = link->data; + mpr = link->data; /* pass the selection id shifted by 8 bits. Last 8 bits are used for selected manipulator part id */ - manipulator->type->draw_select(C, manipulator, selectionbase << 8); + mpr->type->draw_select(C, mpr, selectionbase << 8); selectionbase++; } @@ -332,13 +326,13 @@ static int manipulator_find_intersected_3d_intern( */ static wmManipulator *manipulator_find_intersected_3d( bContext *C, const int co[2], ListBase *visible_manipulators, - unsigned char *part) + int *r_part) { wmManipulator *result = NULL; const float hotspot = 14.0f; int ret; - *part = 0; + *r_part = 0; /* set up view matrices */ view3d_operator_needs_opengl(C); @@ -353,7 +347,7 @@ static wmManipulator *manipulator_find_intersected_3d( ret = retsec; link = BLI_findlink(visible_manipulators, ret >> 8); - *part = ret & 255; + *r_part = ret & 255; result = link->data; } @@ -364,30 +358,30 @@ static wmManipulator *manipulator_find_intersected_3d( * Try to find a manipulator under the mouse position. 2D intersections have priority over * 3D ones (could check for smallest screen-space distance but not needed right now). */ -wmManipulator *wm_manipulatormap_find_highlighted_manipulator( +wmManipulator *wm_manipulatormap_highlight_find( wmManipulatorMap *mmap, bContext *C, const wmEvent *event, - unsigned char *part) + int *r_part) { - wmManipulator *manipulator = NULL; + wmManipulator *mpr = NULL; ListBase visible_3d_manipulators = {NULL}; for (wmManipulatorGroup *mgroup = mmap->manipulator_groups.first; mgroup; mgroup = mgroup->next) { if (wm_manipulatorgroup_is_visible(mgroup, C)) { - if (mgroup->type->flag & WM_MANIPULATORGROUPTYPE_IS_3D) { + if (mgroup->type->flag & WM_MANIPULATORGROUPTYPE_3D) { wm_manipulatorgroup_intersectable_manipulators_to_list(mgroup, &visible_3d_manipulators); } - else if ((manipulator = wm_manipulatorgroup_find_intersected_mainpulator(mgroup, C, event, part))) { + else if ((mpr = wm_manipulatorgroup_find_intersected_mainpulator(mgroup, C, event, r_part))) { break; } } } if (!BLI_listbase_is_empty(&visible_3d_manipulators)) { - manipulator = manipulator_find_intersected_3d(C, event->mval, &visible_3d_manipulators, part); + mpr = manipulator_find_intersected_3d(C, event->mval, &visible_3d_manipulators, r_part); BLI_freelistN(&visible_3d_manipulators); } - return manipulator; + return mpr; } void WM_manipulatormap_add_handlers(ARegion *ar, wmManipulatorMap *mmap) @@ -400,22 +394,17 @@ void WM_manipulatormap_add_handlers(ARegion *ar, wmManipulatorMap *mmap) } void wm_manipulatormaps_handled_modal_update( - bContext *C, wmEvent *event, wmEventHandler *handler, - const wmOperatorType *ot) + bContext *C, wmEvent *event, wmEventHandler *handler) { const bool modal_running = (handler->op != NULL); /* happens on render or when joining areas */ - if (!handler->op_region || !handler->op_region->manipulator_map) + if (!handler->op_region || !handler->op_region->manipulator_map) { return; - - /* hide operator manipulators */ - if (!modal_running && ot->mgrouptype) { - ot->mgrouptype->op = NULL; } wmManipulatorMap *mmap = handler->op_region->manipulator_map; - wmManipulator *manipulator = wm_manipulatormap_get_active_manipulator(mmap); + wmManipulator *mpr = wm_manipulatormap_active_get(mmap); ScrArea *area = CTX_wm_area(C); ARegion *region = CTX_wm_region(C); @@ -423,21 +412,21 @@ void wm_manipulatormaps_handled_modal_update( /* regular update for running operator */ if (modal_running) { - if (manipulator && manipulator->opname && - STREQ(manipulator->opname, handler->op->idname)) + if (mpr && mpr->opname && + STREQ(mpr->opname, handler->op->idname)) { - if (manipulator->custom_handler) { - manipulator->custom_handler(C, manipulator, event, 0); + if (mpr->custom_modal) { + mpr->custom_modal(C, mpr, event, 0); } - else if (manipulator->type->handler) { - manipulator->type->handler(C, manipulator, event, 0); + else if (mpr->type->modal) { + mpr->type->modal(C, mpr, event, 0); } } } /* operator not running anymore */ else { - wm_manipulatormap_set_highlighted_manipulator(mmap, C, NULL, 0); - wm_manipulatormap_set_active_manipulator(mmap, C, event, NULL); + wm_manipulatormap_highlight_set(mmap, C, NULL, 0); + wm_manipulatormap_active_set(mmap, C, event, NULL); } /* restore the area */ @@ -451,23 +440,23 @@ void wm_manipulatormaps_handled_modal_update( */ bool wm_manipulatormap_deselect_all(wmManipulatorMap *mmap, wmManipulator ***sel) { - if (*sel == NULL || mmap->mmap_context.tot_selected == 0) + if (*sel == NULL || mmap->mmap_context.selected_len == 0) return false; - for (int i = 0; i < mmap->mmap_context.tot_selected; i++) { + for (int i = 0; i < mmap->mmap_context.selected_len; i++) { (*sel)[i]->state &= ~WM_MANIPULATOR_STATE_SELECT; (*sel)[i] = NULL; } - wm_manipulatormap_selected_delete(mmap); + wm_manipulatormap_selected_clear(mmap); /* always return true, we already checked * if there's anything to deselect */ return true; } -BLI_INLINE bool manipulator_selectable_poll(const wmManipulator *manipulator, void *UNUSED(data)) +BLI_INLINE bool manipulator_selectable_poll(const wmManipulator *mpr, void *UNUSED(data)) { - return (manipulator->parent_mgroup->type->flag & WM_MANIPULATORGROUPTYPE_SELECTABLE); + return (mpr->parent_mgroup->type->flag & WM_MANIPULATORGROUPTYPE_SELECT); } /** @@ -484,27 +473,27 @@ static bool wm_manipulatormap_select_all_intern( GHash *hash = WM_manipulatormap_manipulator_hash_new(C, mmap, manipulator_selectable_poll, NULL, true); GHashIterator gh_iter; - int i, *tot_sel = &mmap->mmap_context.tot_selected; + int i, *selected_len = &mmap->mmap_context.selected_len; bool changed = false; - *tot_sel = BLI_ghash_size(hash); - *sel = MEM_reallocN(*sel, sizeof(**sel) * (*tot_sel)); + *selected_len = BLI_ghash_size(hash); + *sel = MEM_reallocN(*sel, sizeof(**sel) * (*selected_len)); GHASH_ITER_INDEX (gh_iter, hash, i) { - wmManipulator *manipulator_iter = BLI_ghashIterator_getValue(&gh_iter); + wmManipulator *mpr_iter = BLI_ghashIterator_getValue(&gh_iter); - if ((manipulator_iter->state & WM_MANIPULATOR_STATE_SELECT) == 0) { + if ((mpr_iter->state & WM_MANIPULATOR_STATE_SELECT) == 0) { changed = true; } - manipulator_iter->state |= WM_MANIPULATOR_STATE_SELECT; - if (manipulator_iter->type->select) { - manipulator_iter->type->select(C, manipulator_iter, action); + mpr_iter->state |= WM_MANIPULATOR_STATE_SELECT; + if (mpr_iter->type->select) { + mpr_iter->type->select(C, mpr_iter, action); } - (*sel)[i] = manipulator_iter; - BLI_assert(i < (*tot_sel)); + (*sel)[i] = mpr_iter; + BLI_assert(i < (*selected_len)); } /* highlight first manipulator */ - wm_manipulatormap_set_highlighted_manipulator(mmap, C, (*sel)[0], (*sel)[0]->highlighted_part); + wm_manipulatormap_highlight_set(mmap, C, (*sel)[0], (*sel)[0]->highlight_part); BLI_ghash_free(hash, NULL, NULL); return changed; @@ -518,7 +507,7 @@ static bool wm_manipulatormap_select_all_intern( */ bool WM_manipulatormap_select_all(bContext *C, wmManipulatorMap *mmap, const int action) { - wmManipulator ***sel = &mmap->mmap_context.selected_manipulator; + wmManipulator ***sel = &mmap->mmap_context.selected; bool changed = false; switch (action) { @@ -580,9 +569,9 @@ void wm_manipulatormap_handler_context(bContext *C, wmEventHandler *handler) bool WM_manipulatormap_cursor_set(const wmManipulatorMap *mmap, wmWindow *win) { for (; mmap; mmap = mmap->next) { - wmManipulator *manipulator = mmap->mmap_context.highlighted_manipulator; - if (manipulator && manipulator->type->cursor_get) { - WM_cursor_set(win, manipulator->type->cursor_get(manipulator)); + wmManipulator *mpr = mmap->mmap_context.highlight; + if (mpr && mpr->type->cursor_get) { + WM_cursor_set(win, mpr->type->cursor_get(mpr)); return true; } } @@ -590,27 +579,26 @@ bool WM_manipulatormap_cursor_set(const wmManipulatorMap *mmap, wmWindow *win) return false; } -void wm_manipulatormap_set_highlighted_manipulator( - wmManipulatorMap *mmap, const bContext *C, wmManipulator *manipulator, - unsigned char part) +void wm_manipulatormap_highlight_set( + wmManipulatorMap *mmap, const bContext *C, wmManipulator *mpr, int part) { - if ((manipulator != mmap->mmap_context.highlighted_manipulator) || - (manipulator && part != manipulator->highlighted_part)) + if ((mpr != mmap->mmap_context.highlight) || + (mpr && part != mpr->highlight_part)) { - if (mmap->mmap_context.highlighted_manipulator) { - mmap->mmap_context.highlighted_manipulator->state &= ~WM_MANIPULATOR_STATE_HIGHLIGHT; - mmap->mmap_context.highlighted_manipulator->highlighted_part = 0; + if (mmap->mmap_context.highlight) { + mmap->mmap_context.highlight->state &= ~WM_MANIPULATOR_STATE_HIGHLIGHT; + mmap->mmap_context.highlight->highlight_part = 0; } - mmap->mmap_context.highlighted_manipulator = manipulator; + mmap->mmap_context.highlight = mpr; - if (manipulator) { - manipulator->state |= WM_MANIPULATOR_STATE_HIGHLIGHT; - manipulator->highlighted_part = part; + if (mpr) { + mpr->state |= WM_MANIPULATOR_STATE_HIGHLIGHT; + mpr->highlight_part = part; - if (C && manipulator->type->cursor_get) { + if (C && mpr->type->cursor_get) { wmWindow *win = CTX_wm_window(C); - WM_cursor_set(win, manipulator->type->cursor_get(manipulator)); + WM_cursor_set(win, mpr->type->cursor_get(mpr)); } } else { @@ -628,71 +616,64 @@ void wm_manipulatormap_set_highlighted_manipulator( } } -wmManipulator *wm_manipulatormap_get_highlighted_manipulator(wmManipulatorMap *mmap) +wmManipulator *wm_manipulatormap_highlight_get(wmManipulatorMap *mmap) { - return mmap->mmap_context.highlighted_manipulator; + return mmap->mmap_context.highlight; } -void wm_manipulatormap_set_active_manipulator( - wmManipulatorMap *mmap, bContext *C, const wmEvent *event, wmManipulator *manipulator) +void wm_manipulatormap_active_set( + wmManipulatorMap *mmap, bContext *C, const wmEvent *event, wmManipulator *mpr) { - if (manipulator && C) { - manipulator->state |= WM_MANIPULATOR_STATE_ACTIVE; - mmap->mmap_context.active_manipulator = manipulator; + if (mpr && C) { + mpr->state |= WM_MANIPULATOR_STATE_ACTIVE; + mmap->mmap_context.active = mpr; - if (manipulator->opname) { - wmOperatorType *ot = WM_operatortype_find(manipulator->opname, 0); + if (mpr->opname) { + wmOperatorType *ot = WM_operatortype_find(mpr->opname, 0); if (ot) { /* first activate the manipulator itself */ - if (manipulator->type->invoke && - (manipulator->type->handler || manipulator->custom_handler)) + if (mpr->type->invoke && + (mpr->type->modal || mpr->custom_modal)) { - manipulator->type->invoke(C, manipulator, event); + mpr->type->invoke(C, mpr, event); } - WM_operator_name_call_ptr(C, ot, WM_OP_INVOKE_DEFAULT, &manipulator->opptr); + WM_operator_name_call_ptr(C, ot, WM_OP_INVOKE_DEFAULT, &mpr->opptr); /* we failed to hook the manipulator to the operator handler or operator was cancelled, return */ - if (!mmap->mmap_context.active_manipulator) { - manipulator->state &= ~WM_MANIPULATOR_STATE_ACTIVE; + if (!mmap->mmap_context.active) { + mpr->state &= ~WM_MANIPULATOR_STATE_ACTIVE; /* first activate the manipulator itself */ - if (manipulator->interaction_data) { - MEM_freeN(manipulator->interaction_data); - manipulator->interaction_data = NULL; - } + MEM_SAFE_FREE(mpr->interaction_data); } return; } else { printf("Manipulator error: operator not found"); - mmap->mmap_context.active_manipulator = NULL; + mmap->mmap_context.active = NULL; return; } } else { - if (manipulator->type->invoke && - (manipulator->type->handler || manipulator->custom_handler)) + if (mpr->type->invoke && + (mpr->type->modal || mpr->custom_modal)) { - manipulator->type->invoke(C, manipulator, event); + mpr->type->invoke(C, mpr, event); } } WM_cursor_grab_enable(CTX_wm_window(C), true, true, NULL); } else { - manipulator = mmap->mmap_context.active_manipulator; - + mpr = mmap->mmap_context.active; /* deactivate, manipulator but first take care of some stuff */ - if (manipulator) { - manipulator->state &= ~WM_MANIPULATOR_STATE_ACTIVE; + if (mpr) { + mpr->state &= ~WM_MANIPULATOR_STATE_ACTIVE; /* first activate the manipulator itself */ - if (manipulator->interaction_data) { - MEM_freeN(manipulator->interaction_data); - manipulator->interaction_data = NULL; - } + MEM_SAFE_FREE(mpr->interaction_data); } - mmap->mmap_context.active_manipulator = NULL; + mmap->mmap_context.active = NULL; if (C) { WM_cursor_grab_disable(CTX_wm_window(C), NULL); @@ -702,9 +683,9 @@ void wm_manipulatormap_set_active_manipulator( } } -wmManipulator *wm_manipulatormap_get_active_manipulator(wmManipulatorMap *mmap) +wmManipulator *wm_manipulatormap_active_get(wmManipulatorMap *mmap) { - return mmap->mmap_context.active_manipulator; + return mmap->mmap_context.active; } /** \} */ /* wmManipulatorMap */ @@ -750,10 +731,20 @@ wmManipulatorMapType *WM_manipulatormaptype_ensure( void wm_manipulatormaptypes_free(void) { - for (wmManipulatorMapType *mmaptype = manipulatormaptypes.first; mmaptype; mmaptype = mmaptype->next) { - BLI_freelistN(&mmaptype->manipulator_grouptypes); + for (wmManipulatorMapType *mmaptype = manipulatormaptypes.first, *mmaptype_next; + mmaptype; + mmaptype = mmaptype_next) + { + mmaptype_next = mmaptype->next; + for (wmManipulatorGroupType *wgt = mmaptype->manipulator_grouptypes.first, *wgt_next; + wgt; + wgt = wgt_next) + { + wgt_next = wgt->next; + WM_manipulatorgrouptype_free(wgt); + } + MEM_freeN(mmaptype); } - BLI_freelistN(&manipulatormaptypes); } /** @@ -762,14 +753,14 @@ void wm_manipulatormaptypes_free(void) void wm_manipulators_keymap(wmKeyConfig *keyconf) { wmManipulatorMapType *mmaptype; - wmManipulatorGroupType *mgrouptype; + wmManipulatorGroupType *wgt; /* we add this item-less keymap once and use it to group manipulator-group keymaps into it */ WM_keymap_find(keyconf, "Manipulators", 0, 0); for (mmaptype = manipulatormaptypes.first; mmaptype; mmaptype = mmaptype->next) { - for (mgrouptype = mmaptype->manipulator_grouptypes.first; mgrouptype; mgrouptype = mgrouptype->next) { - wm_manipulatorgrouptype_keymap_init(mgrouptype, keyconf); + for (wgt = mmaptype->manipulator_grouptypes.first; wgt; wgt = wgt->next) { + wm_manipulatorgrouptype_setup_keymap(wgt, keyconf); } } } diff --git a/source/blender/windowmanager/manipulators/wm_manipulator_fn.h b/source/blender/windowmanager/manipulators/wm_manipulator_fn.h index 308ba09ee71..ce21c90195d 100644 --- a/source/blender/windowmanager/manipulators/wm_manipulator_fn.h +++ b/source/blender/windowmanager/manipulators/wm_manipulator_fn.h @@ -36,12 +36,13 @@ typedef void (*wmManipulatorGroupFnRefresh)(const struct bContext *, struct wmMa typedef void (*wmManipulatorGroupFnDrawPrepare)(const struct bContext *, struct wmManipulatorGroup *); /* wmManipulator */ +/* See: wmManipulatorType for docs on each type. */ typedef void (*wmManipulatorFnDraw)(const struct bContext *, struct wmManipulator *); typedef void (*wmManipulatorFnDrawSelect)(const struct bContext *, struct wmManipulator *, int); -typedef int (*wmManipulatorFnIntersect)(struct bContext *, struct wmManipulator *, const struct wmEvent *); -typedef void (*wmManipulatorFnHandler)(struct bContext *, struct wmManipulator *, const struct wmEvent *, const int); -typedef void (*wmManipulatorFnPropDataUpdate)(struct wmManipulator *, int); -typedef void (*wmManipulatorFnFinalPositionGet)(struct wmManipulator *, float[]); +typedef int (*wmManipulatorFnTestSelect)(struct bContext *, struct wmManipulator *, const struct wmEvent *); +typedef void (*wmManipulatorFnModal)(struct bContext *, struct wmManipulator *, const struct wmEvent *, const int); +typedef void (*wmManipulatorFnPropertyUpdate)(struct wmManipulator *, struct wmManipulatorProperty *); +typedef void (*wmManipulatorFnPositionGet)(struct wmManipulator *, float[]); typedef void (*wmManipulatorFnInvoke)(struct bContext *, struct wmManipulator *, const struct wmEvent *); typedef void (*wmManipulatorFnExit)(struct bContext *, struct wmManipulator *, const bool); typedef int (*wmManipulatorFnCursorGet)(struct wmManipulator *); diff --git a/source/blender/windowmanager/manipulators/wm_manipulator_wmapi.h b/source/blender/windowmanager/manipulators/wm_manipulator_wmapi.h index 008e44c5f97..d14d4e169b1 100644 --- a/source/blender/windowmanager/manipulators/wm_manipulator_wmapi.h +++ b/source/blender/windowmanager/manipulators/wm_manipulator_wmapi.h @@ -47,7 +47,7 @@ struct wmOperator; /* -------------------------------------------------------------------- */ /* wmManipulator */ -struct wmManipulatorGroup *wm_manipulator_get_parent_group(const struct wmManipulator *manipulator); +struct wmManipulatorGroup *wm_manipulator_get_parent_group(const struct wmManipulator *mpr); /* wm_manipulator.c, for init/exit */ void wm_manipulatortype_free(void); @@ -59,34 +59,29 @@ void wm_manipulatortype_init(void); void MANIPULATORGROUP_OT_manipulator_select(struct wmOperatorType *ot); void MANIPULATORGROUP_OT_manipulator_tweak(struct wmOperatorType *ot); -void wm_manipulatorgroup_attach_to_modal_handler( - struct bContext *C, struct wmEventHandler *handler, - struct wmManipulatorGroupType *mgrouptype, struct wmOperator *op); - /* -------------------------------------------------------------------- */ /* wmManipulatorMap */ -void wm_manipulatormap_delete(struct wmManipulatorMap *mmap); +void wm_manipulatormap_remove(struct wmManipulatorMap *mmap); void wm_manipulatormaptypes_free(void); void wm_manipulators_keymap(struct wmKeyConfig *keyconf); void wm_manipulatormaps_handled_modal_update( - bContext *C, struct wmEvent *event, struct wmEventHandler *handler, - const struct wmOperatorType *ot); + bContext *C, struct wmEvent *event, struct wmEventHandler *handler); void wm_manipulatormap_handler_context(bContext *C, struct wmEventHandler *handler); -struct wmManipulator *wm_manipulatormap_find_highlighted_manipulator( - struct wmManipulatorMap *mmap, bContext *C, - const struct wmEvent *event, unsigned char *part); -void wm_manipulatormap_set_highlighted_manipulator( +struct wmManipulator *wm_manipulatormap_highlight_find( + struct wmManipulatorMap *mmap, bContext *C, const struct wmEvent *event, + int *r_part); +void wm_manipulatormap_highlight_set( struct wmManipulatorMap *mmap, const bContext *C, - struct wmManipulator *manipulator, unsigned char part); -struct wmManipulator *wm_manipulatormap_get_highlighted_manipulator(struct wmManipulatorMap *mmap); -void wm_manipulatormap_set_active_manipulator( + struct wmManipulator *mpr, int part); +struct wmManipulator *wm_manipulatormap_highlight_get(struct wmManipulatorMap *mmap); +void wm_manipulatormap_active_set( struct wmManipulatorMap *mmap, bContext *C, - const struct wmEvent *event, struct wmManipulator *manipulator); -struct wmManipulator *wm_manipulatormap_get_active_manipulator(struct wmManipulatorMap *mmap); + const struct wmEvent *event, struct wmManipulator *mpr); +struct wmManipulator *wm_manipulatormap_active_get(struct wmManipulatorMap *mmap); #endif /* __WM_MANIPULATOR_WMAPI_H__ */ diff --git a/source/blenderplayer/bad_level_call_stubs/stubs.c b/source/blenderplayer/bad_level_call_stubs/stubs.c index 1a15344718d..7ddeabe9f30 100644 --- a/source/blenderplayer/bad_level_call_stubs/stubs.c +++ b/source/blenderplayer/bad_level_call_stubs/stubs.c @@ -199,7 +199,11 @@ struct wmWindowManager; /* bpy_operator_wrap.h */ extern void macro_wrapper(struct wmOperatorType *ot, void *userdata); -extern void operator_wrapper(struct wmOperatorType *ot, void *userdata); +extern void operator_wrapper(struct wmManipulatorGroupType *wgt, void *userdata); + +/* bpy_widgetgroup_wrap.h */ +extern void widgetgroup_wrapper(struct wmOperatorType *ot, void *userdata); + /* bpy_rna.h */ extern bool pyrna_id_FromPyObject(struct PyObject *obj, struct ID **id); extern const char *BPY_app_translations_py_pgettext(const char *msgctxt, const char *msgid); @@ -355,8 +359,9 @@ void WM_report(ReportType type, const char *message) RET_NONE struct wmManipulatorMapType *WM_manipulatormaptype_find(const struct wmManipulatorMapType_Params *wmap_params) RET_NULL struct wmManipulatorMapType *WM_manipulatormaptype_ensure(const struct wmManipulatorMapType_Params *wmap_params) RET_NULL struct wmManipulatorMap *WM_manipulatormap_new_from_type(const struct wmManipulatorMapType_Params *wmap_params) RET_NULL -void WM_manipulatorgrouptype_init_runtime(const struct Main *bmain, struct wmManipulatorMapType *wmaptype, struct wmManipulatorGroupType *wgrouptype) RET_NONE -void WM_manipulatorgrouptype_unregister(struct bContext *C, struct Main *bmain, struct wmManipulatorGroupType *wgroup) RET_NONE +void WM_manipulatorgrouptype_init_runtime( + const struct Main *bmain, struct wmManipulatorMapType *wmaptype, struct wmManipulatorGroupType *wgt) RET_NONE +void WM_manipulatorgrouptype_unregister(struct bContext *C, struct Main *bmain, struct wmManipulatorGroupType *wgt) RET_NONE #ifdef WITH_INPUT_NDOF void WM_ndof_deadzone_set(float deadzone) RET_NONE -- cgit v1.2.3