diff options
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.c | 87 |
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; |