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:
Diffstat (limited to 'source/blender/editors/manipulator_library/manipulator_types/arrow3d_manipulator.c')
-rw-r--r--source/blender/editors/manipulator_library/manipulator_types/arrow3d_manipulator.c87
1 files changed, 48 insertions, 39 deletions
diff --git a/source/blender/editors/manipulator_library/manipulator_types/arrow3d_manipulator.c b/source/blender/editors/manipulator_library/manipulator_types/arrow3d_manipulator.c
index e95800f3db1..3bbcafb925a 100644
--- a/source/blender/editors/manipulator_library/manipulator_types/arrow3d_manipulator.c
+++ b/source/blender/editors/manipulator_library/manipulator_types/arrow3d_manipulator.c
@@ -79,7 +79,7 @@ typedef struct ArrowManipulator3D {
/* -------------------------------------------------------------------- */
-static void manipulator_arrow_matrix_world_get(wmManipulator *mpr, float r_matrix[4][4])
+static void manipulator_arrow_matrix_basis_get(const wmManipulator *mpr, float r_matrix[4][4])
{
ArrowManipulator3D *arrow = (ArrowManipulator3D *)mpr;
@@ -128,7 +128,7 @@ static void arrow_draw_geom(const ArrowManipulator3D *arrow, const bool select,
const float vec[2][3] = {
{0.0f, 0.0f, 0.0f},
- {0.0f, 0.0f, RNA_float_get(arrow->manipulator.ptr, "length")},
+ {0.0f, 0.0f, arrow_length},
};
glLineWidth(arrow->manipulator.line_width);
@@ -182,33 +182,28 @@ static void arrow_draw_geom(const ArrowManipulator3D *arrow, const bool select,
static void arrow_draw_intern(ArrowManipulator3D *arrow, const bool select, const bool highlight)
{
- float col[4];
- float final_matrix[4][4];
+ wmManipulator *mpr = &arrow->manipulator;
+ float color[4];
+ float matrix_final[4][4];
- manipulator_color_get(&arrow->manipulator, highlight, col);
- manipulator_arrow_matrix_world_get(&arrow->manipulator, final_matrix);
+ manipulator_color_get(mpr, highlight, color);
- mul_mat3_m4_fl(final_matrix, arrow->manipulator.scale_final);
- mul_m4_m4m4(final_matrix, final_matrix, arrow->manipulator.matrix_offset);
+ WM_manipulator_calc_matrix_final(mpr, matrix_final);
gpuPushMatrix();
- gpuMultMatrix(final_matrix);
+ gpuMultMatrix(matrix_final);
glEnable(GL_BLEND);
- arrow_draw_geom(arrow, select, col);
+ arrow_draw_geom(arrow, select, color);
glDisable(GL_BLEND);
gpuPopMatrix();
- if (arrow->manipulator.interaction_data) {
- ManipulatorInteraction *inter = arrow->manipulator.interaction_data;
- float offset_matrix[4][4];
-
- copy_m4_m4(offset_matrix, inter->init_matrix);
- mul_mat3_m4_fl(offset_matrix, inter->init_scale);
+ if (mpr->interaction_data) {
+ ManipulatorInteraction *inter = mpr->interaction_data;
gpuPushMatrix();
- gpuMultMatrix(offset_matrix);
- gpuMultMatrix(arrow->manipulator.matrix_offset);
+ gpuMultMatrix(inter->init_matrix_final);
+
glEnable(GL_BLEND);
arrow_draw_geom(arrow, select, (const float [4]){0.5f, 0.5f, 0.5f, 0.5f});
@@ -220,9 +215,9 @@ static void arrow_draw_intern(ArrowManipulator3D *arrow, const bool select, cons
static void manipulator_arrow_draw_select(
const bContext *UNUSED(C), wmManipulator *mpr,
- int selectionbase)
+ int select_id)
{
- GPU_select_load_id(selectionbase);
+ GPU_select_load_id(select_id);
arrow_draw_intern((ArrowManipulator3D *)mpr, true, false);
}
@@ -235,7 +230,9 @@ static void manipulator_arrow_draw(const bContext *UNUSED(C), wmManipulator *mpr
* Calculate arrow offset independent from prop min value,
* meaning the range will not be offset by min value first.
*/
-static void manipulator_arrow_modal(bContext *C, wmManipulator *mpr, const wmEvent *event, const int flag)
+static int manipulator_arrow_modal(
+ bContext *C, wmManipulator *mpr, const wmEvent *event,
+ eWM_ManipulatorTweak tweak_flag)
{
ArrowManipulator3D *arrow = (ArrowManipulator3D *)mpr;
ManipulatorInteraction *inter = mpr->interaction_data;
@@ -251,7 +248,7 @@ static void manipulator_arrow_modal(bContext *C, wmManipulator *mpr, const wmEve
bool use_vertical = false;
- copy_v3_v3(orig_origin, inter->init_matrix[3]);
+ copy_v3_v3(orig_origin, inter->init_matrix_basis[3]);
orig_origin[3] = 1.0f;
add_v3_v3v3(offset, orig_origin, arrow->manipulator.matrix_basis[2]);
offset[3] = 1.0f;
@@ -267,7 +264,7 @@ static void manipulator_arrow_modal(bContext *C, wmManipulator *mpr, const wmEve
/* first determine if view vector is really close to the direction. If it is, we use
* vertical movement to determine offset, just like transform system does */
- if (RAD2DEG(acos(dot_v3v3(viewvec, arrow->manipulator.matrix_basis[2]))) > 5.0f) {
+ if (RAD2DEGF(acosf(dot_v3v3(viewvec, arrow->manipulator.matrix_basis[2]))) > 5.0f) {
/* multiply to projection space */
mul_m4_v4(rv3d->persmat, orig_origin);
mul_v4_fl(orig_origin, 1.0f / orig_origin[3]);
@@ -295,7 +292,7 @@ static void manipulator_arrow_modal(bContext *C, wmManipulator *mpr, const wmEve
float zfac = ED_view3d_calc_zfac(rv3d, orig_origin, NULL);
ED_view3d_win_to_delta(ar, dir2d_final, offset, zfac);
- add_v3_v3v3(orig_origin, offset, inter->init_matrix[3]);
+ add_v3_v3v3(orig_origin, offset, inter->init_matrix_basis[3]);
/* calculate view vector for the new position */
if (rv3d->is_persp) {
@@ -314,13 +311,13 @@ static void manipulator_arrow_modal(bContext *C, wmManipulator *mpr, const wmEve
const float plane_offset = dot_v3v3(plane, offset);
const float plane_dir = dot_v3v3(plane, arrow->manipulator.matrix_basis[2]);
const float fac = (plane_dir != 0.0f) ? (plane_offset / plane_dir) : 0.0f;
- facdir = (fac < 0.0) ? -1.0 : 1.0;
+ facdir = (fac < 0.0f) ? -1.0f : 1.0f;
if (isfinite(fac)) {
mul_v3_v3fl(offset, arrow->manipulator.matrix_basis[2], fac);
}
}
else {
- facdir = (m_diff[1] < 0.0) ? -1.0 : 1.0;
+ facdir = (m_diff[1] < 0.0f) ? -1.0f : 1.0f;
}
@@ -334,7 +331,7 @@ static void manipulator_arrow_modal(bContext *C, wmManipulator *mpr, const wmEve
const int draw_options = RNA_enum_get(arrow->manipulator.ptr, "draw_options");
const bool constrained = (draw_options & ED_MANIPULATOR_ARROW_STYLE_CONSTRAINED) != 0;
const bool inverted = (draw_options & ED_MANIPULATOR_ARROW_STYLE_INVERTED) != 0;
- const bool use_precision = (flag & WM_MANIPULATOR_TWEAK_PRECISE) != 0;
+ const bool use_precision = (tweak_flag & WM_MANIPULATOR_TWEAK_PRECISE) != 0;
float value = manipulator_value_from_offset(data, inter, ofs_new, constrained, inverted, use_precision);
WM_manipulator_target_property_value_set(C, mpr, mpr_prop, value);
@@ -350,18 +347,20 @@ static void manipulator_arrow_modal(bContext *C, wmManipulator *mpr, const wmEve
/* tag the region for redraw */
ED_region_tag_redraw(ar);
WM_event_add_mousemove(C);
+
+ return OPERATOR_RUNNING_MODAL;
}
static void manipulator_arrow_setup(wmManipulator *mpr)
{
ArrowManipulator3D *arrow = (ArrowManipulator3D *)mpr;
- arrow->manipulator.flag |= WM_MANIPULATOR_DRAW_ACTIVE;
+ arrow->manipulator.flag |= WM_MANIPULATOR_DRAW_MODAL;
arrow->data.range_fac = 1.0f;
}
-static void manipulator_arrow_invoke(
+static int manipulator_arrow_invoke(
bContext *UNUSED(C), wmManipulator *mpr, const wmEvent *event)
{
ArrowManipulator3D *arrow = (ArrowManipulator3D *)mpr;
@@ -378,11 +377,12 @@ static void manipulator_arrow_invoke(
inter->init_mval[0] = event->mval[0];
inter->init_mval[1] = event->mval[1];
- inter->init_scale = mpr->scale_final;
-
- manipulator_arrow_matrix_world_get(mpr, inter->init_matrix);
+ manipulator_arrow_matrix_basis_get(mpr, inter->init_matrix_basis);
+ WM_manipulator_calc_matrix_final(mpr, inter->init_matrix_final);
mpr->interaction_data = inter;
+
+ return OPERATOR_RUNNING_MODAL;
}
static void manipulator_arrow_property_update(wmManipulator *mpr, wmManipulatorProperty *mpr_prop)
@@ -396,15 +396,24 @@ static void manipulator_arrow_property_update(wmManipulator *mpr, wmManipulatorP
static void manipulator_arrow_exit(bContext *C, wmManipulator *mpr, const bool cancel)
{
- if (!cancel)
- return;
-
ArrowManipulator3D *arrow = (ArrowManipulator3D *)mpr;
ManipulatorCommonData *data = &arrow->data;
- ManipulatorInteraction *inter = mpr->interaction_data;
-
wmManipulatorProperty *mpr_prop = WM_manipulator_target_property_find(mpr, "offset");
- manipulator_property_value_reset(C, mpr, inter, mpr_prop);
+ const bool is_prop_valid = WM_manipulator_target_property_is_valid(mpr_prop);
+
+ if (!cancel) {
+ /* Assign incase applying the opetration needs an updated offset
+ * editmesh bisect needs this. */
+ if (is_prop_valid) {
+ data->offset = WM_manipulator_target_property_value_get(mpr, mpr_prop);
+ }
+ return;
+ }
+
+ ManipulatorInteraction *inter = mpr->interaction_data;
+ if (is_prop_valid) {
+ manipulator_property_value_reset(C, mpr, inter, mpr_prop);
+ }
data->offset = inter->init_offset;
}
@@ -454,7 +463,7 @@ static void MANIPULATOR_WT_arrow_3d(wmManipulatorType *wt)
/* api callbacks */
wt->draw = manipulator_arrow_draw;
wt->draw_select = manipulator_arrow_draw_select;
- wt->matrix_world_get = manipulator_arrow_matrix_world_get;
+ wt->matrix_basis_get = manipulator_arrow_matrix_basis_get;
wt->modal = manipulator_arrow_modal;
wt->setup = manipulator_arrow_setup;
wt->invoke = manipulator_arrow_invoke;