Welcome to mirror list, hosted at ThFree Co, Russian Federation.

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