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
diff options
context:
space:
mode:
authorCampbell Barton <ideasman42@gmail.com>2017-06-15 13:48:24 +0300
committerCampbell Barton <ideasman42@gmail.com>2017-06-15 13:56:22 +0300
commit830df9b33d3e2afdf3bb23b469378899c34fda78 (patch)
tree4f2fad8cdd48937e28d2c45115476c9045e4525b /source/blender/editors/manipulator_library/arrow3d_manipulator.c
parent1a7099f3ecf52fa8a54c2ba3f652d5827ca9103c (diff)
Updates to manipulator API
While this is work-in-progress from custom-manipulators branch its stable so adding into 2.8 so we don't get too much out of sync. - ManipulatorGroupType's are moved out of the manipulator-map and are now global (like operators, panels etc) and added into spaces as needed. Without this all operators that might ever use a manipulator in the 3D view would be polling the viewport. - Add optional get/set callbacks for non-RNA properties Needed so re-usable manipulators can control values that don't correspond to a single properly or need conversion. - Fix divide by zero bug in arrow manipulator (when moving zero pixels).
Diffstat (limited to 'source/blender/editors/manipulator_library/arrow3d_manipulator.c')
-rw-r--r--source/blender/editors/manipulator_library/arrow3d_manipulator.c56
1 files changed, 29 insertions, 27 deletions
diff --git a/source/blender/editors/manipulator_library/arrow3d_manipulator.c b/source/blender/editors/manipulator_library/arrow3d_manipulator.c
index a2a2feb811c..c856374661f 100644
--- a/source/blender/editors/manipulator_library/arrow3d_manipulator.c
+++ b/source/blender/editors/manipulator_library/arrow3d_manipulator.c
@@ -40,7 +40,6 @@
#include "BLI_math.h"
-#include "DNA_manipulator_types.h"
#include "DNA_view3d_types.h"
#include "ED_view3d.h"
@@ -90,7 +89,7 @@ typedef struct ArrowManipulator3D {
/* -------------------------------------------------------------------- */
-static void manipulator_arrow_get_final_pos(wmManipulator *mpr, float r_pos[3])
+static void manipulator_arrow_position_get(wmManipulator *mpr, float r_pos[3])
{
ArrowManipulator3D *arrow = (ArrowManipulator3D *)mpr;
@@ -194,7 +193,7 @@ static void arrow_draw_intern(ArrowManipulator3D *arrow, const bool select, cons
float final_pos[3];
manipulator_color_get(&arrow->manipulator, highlight, col);
- manipulator_arrow_get_final_pos(&arrow->manipulator, final_pos);
+ manipulator_arrow_position_get(&arrow->manipulator, final_pos);
if (arrow->flag & ARROW_UP_VECTOR_SET) {
copy_v3_v3(rot[2], arrow->direction);
@@ -238,7 +237,7 @@ static void arrow_draw_intern(ArrowManipulator3D *arrow, const bool select, cons
}
}
-static void manipulator_arrow_render_3d_intersect(
+static void manipulator_arrow_draw_select(
const bContext *UNUSED(C), wmManipulator *mpr,
int selectionbase)
{
@@ -327,14 +326,17 @@ static void manipulator_arrow_modal(bContext *C, wmManipulator *mpr, const wmEve
normalize_v3(viewvec);
if (!use_vertical) {
- float fac;
/* now find a plane parallel to the view vector so we can intersect with the arrow direction */
cross_v3_v3v3(tangent, viewvec, offset);
cross_v3_v3v3(plane, tangent, viewvec);
- fac = dot_v3v3(plane, offset) / dot_v3v3(arrow->direction, plane);
+ const float plane_offset = dot_v3v3(plane, offset);
+ const float plane_dir = dot_v3v3(plane, arrow->direction);
+ const float fac = (plane_dir != 0.0f) ? (plane_offset / plane_dir) : 0.0f;
facdir = (fac < 0.0) ? -1.0 : 1.0;
- mul_v3_v3fl(offset, arrow->direction, fac);
+ if (isfinite(fac)) {
+ mul_v3_v3fl(offset, arrow->direction, fac);
+ }
}
else {
facdir = (m_diff[1] < 0.0) ? -1.0 : 1.0;
@@ -344,18 +346,18 @@ static void manipulator_arrow_modal(bContext *C, wmManipulator *mpr, const wmEve
ManipulatorCommonData *data = &arrow->data;
const float ofs_new = facdir * len_v3(offset);
- wmManipulatorProperty *mpr_prop = WM_manipulator_get_property(mpr, "offset");
+ wmManipulatorProperty *mpr_prop = WM_manipulator_property_find(mpr, "offset");
/* set the property for the operator and call its modal function */
- if (mpr_prop->prop != NULL) {
+ if (WM_manipulator_property_is_valid(mpr_prop)) {
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, mpr, mpr_prop, value);
+ WM_manipulator_property_value_set(C, mpr, mpr_prop, value);
/* get clamped value */
- value = manipulator_property_value_get(mpr, mpr_prop);
+ value = WM_manipulator_property_value_get(mpr, mpr_prop);
data->offset = manipulator_offset_from_value(data, value, constrained, inverted);
}
@@ -374,11 +376,11 @@ static void manipulator_arrow_invoke(
{
ArrowManipulator3D *arrow = (ArrowManipulator3D *)mpr;
ManipulatorInteraction *inter = MEM_callocN(sizeof(ManipulatorInteraction), __func__);
- wmManipulatorProperty *mpr_prop = WM_manipulator_get_property(mpr, "offset");
+ wmManipulatorProperty *mpr_prop = WM_manipulator_property_find(mpr, "offset");
/* 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);
+ if (mpr_prop && WM_manipulator_property_is_valid(mpr_prop)) {
+ inter->init_value = WM_manipulator_property_value_get(mpr, mpr_prop);
}
inter->init_offset = arrow->data.offset;
@@ -388,16 +390,16 @@ static void manipulator_arrow_invoke(
inter->init_scale = mpr->scale;
- manipulator_arrow_get_final_pos(mpr, inter->init_origin);
+ manipulator_arrow_position_get(mpr, inter->init_origin);
mpr->interaction_data = inter;
}
-static void manipulator_arrow_property_update(wmManipulator *mnp, wmManipulatorProperty *mpr_prop)
+static void manipulator_arrow_property_update(wmManipulator *mpr, wmManipulatorProperty *mpr_prop)
{
- ArrowManipulator3D *arrow = (ArrowManipulator3D *)mnp;
+ ArrowManipulator3D *arrow = (ArrowManipulator3D *)mpr;
manipulator_property_data_update(
- mnp, &arrow->data, mpr_prop,
+ mpr, &arrow->data, mpr_prop,
(arrow->style & ED_MANIPULATOR_ARROW_STYLE_CONSTRAINED) != 0,
(arrow->style & ED_MANIPULATOR_ARROW_STYLE_INVERTED) != 0);
}
@@ -411,7 +413,7 @@ static void manipulator_arrow_exit(bContext *C, wmManipulator *mpr, const bool c
ManipulatorCommonData *data = &arrow->data;
ManipulatorInteraction *inter = mpr->interaction_data;
- wmManipulatorProperty *mpr_prop = WM_manipulator_get_property(mpr, "offset");
+ wmManipulatorProperty *mpr_prop = WM_manipulator_property_find(mpr, "offset");
manipulator_property_value_reset(C, mpr, inter, mpr_prop);
data->offset = inter->init_offset;
}
@@ -486,15 +488,15 @@ void ED_manipulator_arrow3d_set_line_len(wmManipulator *mpr, const float len)
/**
* Define a custom property UI range
*
- * \note Needs to be called before WM_manipulator_def_property!
+ * \note Needs to be called before WM_manipulator_property_def_rna!
*/
void ED_manipulator_arrow3d_set_ui_range(wmManipulator *mpr, const float min, const float max)
{
ArrowManipulator3D *arrow = (ArrowManipulator3D *)mpr;
BLI_assert(min < max);
- BLI_assert(!(WM_manipulator_get_property(mpr, "offset") && "Make sure this function "
- "is called before WM_manipulator_def_property"));
+ BLI_assert(!(WM_manipulator_property_find(mpr, "offset") && "Make sure this function "
+ "is called before WM_manipulator_property_def_rna"));
arrow->data.range = max - min;
arrow->data.min = min;
@@ -504,13 +506,13 @@ void ED_manipulator_arrow3d_set_ui_range(wmManipulator *mpr, const float min, co
/**
* Define a custom factor for arrow min/max distance
*
- * \note Needs to be called before WM_manipulator_def_property!
+ * \note Needs to be called before WM_manipulator_property_def_rna!
*/
void ED_manipulator_arrow3d_set_range_fac(wmManipulator *mpr, const float range_fac)
{
ArrowManipulator3D *arrow = (ArrowManipulator3D *)mpr;
- BLI_assert(!(WM_manipulator_get_property(mpr, "offset") && "Make sure this function "
- "is called before WM_manipulator_def_property"));
+ BLI_assert(!(WM_manipulator_property_find(mpr, "offset") && "Make sure this function "
+ "is called before WM_manipulator_property_def_rna"));
arrow->data.range_fac = range_fac;
}
@@ -532,8 +534,8 @@ static void MANIPULATOR_WT_arrow_3d(wmManipulatorType *wt)
/* api callbacks */
wt->draw = manipulator_arrow_draw;
- wt->draw_select = manipulator_arrow_render_3d_intersect;
- wt->position_get = manipulator_arrow_get_final_pos;
+ wt->draw_select = manipulator_arrow_draw_select;
+ wt->position_get = manipulator_arrow_position_get;
wt->modal = manipulator_arrow_modal;
wt->invoke = manipulator_arrow_invoke;
wt->property_update = manipulator_arrow_property_update;