diff options
author | Campbell Barton <ideasman42@gmail.com> | 2017-08-15 06:27:31 +0300 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2017-08-15 06:46:09 +0300 |
commit | dfb890947d036bca735abcc56d55bd2572aefcb3 (patch) | |
tree | 01d971c3a8c9bc2014a42a115268ce712f7f6999 /source | |
parent | 3ab46f42046854e1f4c036a9b779177136017772 (diff) |
Manipulator: store initial-final matrix for reuse
Also take matrix_space into account when calculating final pixel size.
Diffstat (limited to 'source')
7 files changed, 32 insertions, 50 deletions
diff --git a/source/blender/editors/manipulator_library/manipulator_library_intern.h b/source/blender/editors/manipulator_library/manipulator_library_intern.h index 3a504ebe1d2..92ca195f21d 100644 --- a/source/blender/editors/manipulator_library/manipulator_library_intern.h +++ b/source/blender/editors/manipulator_library/manipulator_library_intern.h @@ -50,10 +50,10 @@ typedef struct ManipulatorCommonData { typedef struct ManipulatorInteraction { float init_value; /* initial property value */ - float init_matrix_basis[4][4]; float init_mval[2]; float init_offset; - float init_scale_final; + float init_matrix_final[4][4]; + float init_matrix_basis[4][4]; /* offset of last handling step */ float prev_offset; diff --git a/source/blender/editors/manipulator_library/manipulator_types/arrow2d_manipulator.c b/source/blender/editors/manipulator_library/manipulator_types/arrow2d_manipulator.c index d8af351b4e3..1185bec2a2d 100644 --- a/source/blender/editors/manipulator_library/manipulator_types/arrow2d_manipulator.c +++ b/source/blender/editors/manipulator_library/manipulator_types/arrow2d_manipulator.c @@ -66,18 +66,12 @@ static void arrow2d_draw_geom(wmManipulator *mpr, const float matrix[4][4], cons const float size_h = size / 2.0f; const float arrow_length = RNA_float_get(mpr->ptr, "length"); const float arrow_angle = RNA_float_get(mpr->ptr, "angle"); - const float draw_line_ofs = (mpr->line_width * 0.5f) / mpr->scale_final; uint pos = GWN_vertformat_attr_add(immVertexFormat(), "pos", GWN_COMP_F32, 2, GWN_FETCH_FLOAT); gpuPushMatrix(); gpuMultMatrix(matrix); - gpuScaleUniform(mpr->scale_final); gpuRotate2D(RAD2DEGF(arrow_angle)); - /* local offset */ - gpuTranslate2f( - mpr->matrix_offset[3][0] + draw_line_ofs, - mpr->matrix_offset[3][1]); immBindBuiltinProgram(GPU_SHADER_2D_UNIFORM_COLOR); @@ -103,18 +97,23 @@ static void manipulator_arrow2d_draw(const bContext *UNUSED(C), wmManipulator *m { float color[4]; + float matrix_final[4][4]; + manipulator_color_get(mpr, mpr->state & WM_MANIPULATOR_STATE_HIGHLIGHT, color); glLineWidth(mpr->line_width); + + WM_manipulator_calc_matrix_final(mpr, matrix_final); + glEnable(GL_BLEND); - arrow2d_draw_geom(mpr, mpr->matrix_basis, color); + arrow2d_draw_geom(mpr, matrix_final, color); glDisable(GL_BLEND); if (mpr->interaction_data) { ManipulatorInteraction *inter = mpr->interaction_data; glEnable(GL_BLEND); - arrow2d_draw_geom(mpr, inter->init_matrix_basis, (const float[4]){0.5f, 0.5f, 0.5f, 0.5f}); + arrow2d_draw_geom(mpr, inter->init_matrix_final, (const float[4]){0.5f, 0.5f, 0.5f, 0.5f}); glDisable(GL_BLEND); } } @@ -130,6 +129,8 @@ static void manipulator_arrow2d_invoke( ManipulatorInteraction *inter = MEM_callocN(sizeof(ManipulatorInteraction), __func__); copy_m4_m4(inter->init_matrix_basis, mpr->matrix_basis); + WM_manipulator_calc_matrix_final(mpr, inter->init_matrix_final); + mpr->interaction_data = inter; } 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 a7a454d62c3..970850dca06 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(wmManipulator *mpr, float r_matrix[4][4]) { ArrowManipulator3D *arrow = (ArrowManipulator3D *)mpr; @@ -188,7 +188,7 @@ static void arrow_draw_intern(ArrowManipulator3D *arrow, const bool select, cons float matrix_final[4][4]; manipulator_color_get(mpr, highlight, color); - manipulator_arrow_matrix_world_get(mpr, matrix_basis_adjust); + manipulator_arrow_matrix_basis_get(mpr, matrix_basis_adjust); WM_manipulator_calc_matrix_final_params( mpr, &((struct WM_ManipulatorMatrixParams) { @@ -206,14 +206,8 @@ static void arrow_draw_intern(ArrowManipulator3D *arrow, const bool select, cons if (mpr->interaction_data) { ManipulatorInteraction *inter = mpr->interaction_data; - WM_manipulator_calc_matrix_final_params( - mpr, &((struct WM_ManipulatorMatrixParams) { - .matrix_basis = inter->init_matrix_basis, - .scale_final = &inter->init_scale_final, - }), matrix_final); - gpuPushMatrix(); - gpuMultMatrix(matrix_final); + gpuMultMatrix(inter->init_matrix_final); glEnable(GL_BLEND); @@ -386,9 +380,8 @@ static void manipulator_arrow_invoke( inter->init_mval[0] = event->mval[0]; inter->init_mval[1] = event->mval[1]; - inter->init_scale_final = mpr->scale_final; - - manipulator_arrow_matrix_world_get(mpr, inter->init_matrix_basis); + manipulator_arrow_matrix_basis_get(mpr, inter->init_matrix_basis); + WM_manipulator_calc_matrix_final(mpr, inter->init_matrix_final); mpr->interaction_data = inter; } @@ -467,7 +460,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; diff --git a/source/blender/editors/manipulator_library/manipulator_types/grab3d_manipulator.c b/source/blender/editors/manipulator_library/manipulator_types/grab3d_manipulator.c index 01376cf6184..d3843bbb6cb 100644 --- a/source/blender/editors/manipulator_library/manipulator_types/grab3d_manipulator.c +++ b/source/blender/editors/manipulator_library/manipulator_types/grab3d_manipulator.c @@ -73,8 +73,7 @@ typedef struct GrabInteraction { /* only for when using properties */ float init_prop_co[3]; - float init_matrix_basis[4][4]; - float init_scale_final; + float init_matrix_final[4][4]; /* final output values, used for drawing */ struct { @@ -184,14 +183,8 @@ static void grab3d_draw_intern( if (mpr->interaction_data) { GrabInteraction *inter = mpr->interaction_data; - WM_manipulator_calc_matrix_final_params( - mpr, &((struct WM_ManipulatorMatrixParams) { - .matrix_basis = inter->init_matrix_basis, - .scale_final = &inter->init_scale_final, - }), matrix_final); - gpuPushMatrix(); - gpuMultMatrix(matrix_final); + gpuMultMatrix(inter->init_matrix_final); if (align_view) { gpuMultMatrix(matrix_align); @@ -261,8 +254,7 @@ static void manipulator_grab_invoke( inter->init_mval[0] = event->mval[0]; inter->init_mval[1] = event->mval[1]; - copy_m4_m4(inter->init_matrix_basis, mpr->matrix_basis); - inter->init_scale_final = mpr->scale_final; + WM_manipulator_calc_matrix_final(mpr, inter->init_matrix_final); wmManipulatorProperty *mpr_prop = WM_manipulator_target_property_find(mpr, "offset"); if (WM_manipulator_target_property_is_valid(mpr_prop)) { diff --git a/source/blender/editors/manipulator_library/manipulator_types/primitive3d_manipulator.c b/source/blender/editors/manipulator_library/manipulator_types/primitive3d_manipulator.c index fc9b08b31cf..44878a24430 100644 --- a/source/blender/editors/manipulator_library/manipulator_types/primitive3d_manipulator.c +++ b/source/blender/editors/manipulator_library/manipulator_types/primitive3d_manipulator.c @@ -114,14 +114,8 @@ static void manipulator_primitive_draw_intern( copy_v3_fl(color_outer, 0.5f); color_outer[3] = 0.8f; - WM_manipulator_calc_matrix_final_params( - mpr, &((struct WM_ManipulatorMatrixParams) { - .matrix_basis = inter->init_matrix_basis, - .scale_final = &inter->init_scale_final, - }), matrix_final); - gpuPushMatrix(); - gpuMultMatrix(matrix_final); + gpuMultMatrix(inter->init_matrix_final); glEnable(GL_BLEND); manipulator_primitive_draw_geom(color_inner, color_outer, draw_style); @@ -156,8 +150,7 @@ static void manipulator_primitive_invoke( { ManipulatorInteraction *inter = MEM_callocN(sizeof(ManipulatorInteraction), __func__); - copy_m4_m4(inter->init_matrix_basis, mpr->matrix_basis); - inter->init_scale_final = mpr->scale_final; + WM_manipulator_calc_matrix_final(mpr, inter->init_matrix_final); mpr->interaction_data = inter; } diff --git a/source/blender/windowmanager/manipulators/WM_manipulator_types.h b/source/blender/windowmanager/manipulators/WM_manipulator_types.h index 7bfc08c7caa..82bf556ce20 100644 --- a/source/blender/windowmanager/manipulators/WM_manipulator_types.h +++ b/source/blender/windowmanager/manipulators/WM_manipulator_types.h @@ -273,7 +273,7 @@ typedef struct wmManipulatorType { * - Scale isn't applied (wmManipulator.scale/user_scale). * - Offset isn't applied (wmManipulator.matrix_offset). */ - wmManipulatorFnMatrixWorldGet matrix_world_get; + wmManipulatorFnMatrixWorldGet matrix_basis_get; /* activate a manipulator state when the user clicks on it */ wmManipulatorFnInvoke invoke; diff --git a/source/blender/windowmanager/manipulators/intern/wm_manipulator.c b/source/blender/windowmanager/manipulators/intern/wm_manipulator.c index ccb6a39350f..fe7dbb56d6e 100644 --- a/source/blender/windowmanager/manipulators/intern/wm_manipulator.c +++ b/source/blender/windowmanager/manipulators/intern/wm_manipulator.c @@ -446,15 +446,18 @@ void wm_manipulator_calculate_scale(wmManipulator *mpr, const bContext *C) scale *= U.manipulator_size; if (rv3d) { /* 'ED_view3d_pixel_size' includes 'U.pixelsize', remove it. */ - if (mpr->type->matrix_world_get) { - float matrix_world[4][4]; - - mpr->type->matrix_world_get(mpr, matrix_world); - scale *= ED_view3d_pixel_size(rv3d, matrix_world[3]) / U.pixelsize; + float matrix_world[4][4]; + if (mpr->type->matrix_basis_get) { + float matrix_basis[4][4]; + mpr->type->matrix_basis_get(mpr, matrix_basis); + mul_m4_m4m4(matrix_world, mpr->matrix_space, matrix_basis); } else { - scale *= ED_view3d_pixel_size(rv3d, mpr->matrix_basis[3]) / U.pixelsize; + mul_m4_m4m4(matrix_world, mpr->matrix_space, mpr->matrix_basis); } + + /* Exclude matrix_offset from scale. */ + scale *= ED_view3d_pixel_size(rv3d, matrix_world[3]) / U.pixelsize; } else { scale *= 0.02f; |