Commit: 49be79693c6d2e3be20b2cd0ecf81e76a7121b2f
Author: Campbell Barton
Date:   Sun Jun 18 05:38:10 2017 +1000
Branches: blender2.8
https://developer.blender.org/rB49be79693c6d2e3be20b2cd0ecf81e76a7121b2f

Manipulator: use matrix instead of origin

This avoids having to use manipulator-type specific functions
to set the orientation.
And will make it simpler to access transformation from Python.

Currently the matrix is still used as an offset in places.
Also per-type orientation values still need to be removed.

===================================================================

M       source/blender/editors/manipulator_library/arrow2d_manipulator.c
M       source/blender/editors/manipulator_library/arrow3d_manipulator.c
M       source/blender/editors/manipulator_library/cage2d_manipulator.c
M       source/blender/editors/manipulator_library/dial3d_manipulator.c
M       source/blender/editors/manipulator_library/grab3d_manipulator.c
M       source/blender/editors/manipulator_library/manipulator_library_intern.h
M       source/blender/editors/manipulator_library/primitive3d_manipulator.c
M       source/blender/editors/mesh/editmesh_bisect.c
M       source/blender/editors/mesh/editmesh_extrude.c
M       source/blender/windowmanager/manipulators/WM_manipulator_types.h
M       source/blender/windowmanager/manipulators/intern/wm_manipulator.c
M       source/blender/windowmanager/manipulators/wm_manipulator_fn.h

===================================================================

diff --git a/source/blender/editors/manipulator_library/arrow2d_manipulator.c 
b/source/blender/editors/manipulator_library/arrow2d_manipulator.c
index 159fcd658ec..5e7975d05e3 100644
--- a/source/blender/editors/manipulator_library/arrow2d_manipulator.c
+++ b/source/blender/editors/manipulator_library/arrow2d_manipulator.c
@@ -68,7 +68,7 @@ typedef struct ArrowManipulator2D {
 } ArrowManipulator2D;
 
 
-static void arrow2d_draw_geom(ArrowManipulator2D *arrow, const float 
origin[2], const float color[4])
+static void arrow2d_draw_geom(ArrowManipulator2D *arrow, const float 
matrix[4][4], const float color[4])
 {
        const float size = 0.11f;
        const float size_h = size / 2.0f;
@@ -78,11 +78,13 @@ static void arrow2d_draw_geom(ArrowManipulator2D *arrow, 
const float origin[2],
        uint pos = VertexFormat_add_attrib(immVertexFormat(), "pos", COMP_F32, 
2, KEEP_FLOAT);
 
        gpuPushMatrix();
-       gpuTranslate2fv(origin);
+       gpuMultMatrix(matrix);
        gpuScaleUniform(arrow->manipulator.scale);
        gpuRotate2D(RAD2DEGF(arrow->angle));
        /* local offset */
-       gpuTranslate2f(arrow->manipulator.offset[0] + draw_line_ofs, 
arrow->manipulator.offset[1]);
+       gpuTranslate2f(
+               arrow->manipulator.matrix_offset[3][0] + draw_line_ofs,
+               arrow->manipulator.matrix_offset[3][1]);
 
        immBindBuiltinProgram(GPU_SHADER_2D_UNIFORM_COLOR);
 
@@ -113,14 +115,14 @@ static void manipulator_arrow2d_draw(const bContext 
*UNUSED(C), struct wmManipul
 
        glLineWidth(mpr->line_width);
        glEnable(GL_BLEND);
-       arrow2d_draw_geom(arrow, mpr->origin, col);
+       arrow2d_draw_geom(arrow, mpr->matrix, col);
        glDisable(GL_BLEND);
 
        if (mpr->interaction_data) {
                ManipulatorInteraction *inter = 
arrow->manipulator.interaction_data;
 
                glEnable(GL_BLEND);
-               arrow2d_draw_geom(arrow, inter->init_origin, (const 
float[4]){0.5f, 0.5f, 0.5f, 0.5f});
+               arrow2d_draw_geom(arrow, inter->init_matrix, (const 
float[4]){0.5f, 0.5f, 0.5f, 0.5f});
                glDisable(GL_BLEND);
        }
 }
@@ -139,7 +141,7 @@ static void manipulator_arrow2d_invoke(
 {
        ManipulatorInteraction *inter = 
MEM_callocN(sizeof(ManipulatorInteraction), __func__);
 
-       copy_v2_v2(inter->init_origin, mpr->origin);
+       copy_m4_m4(inter->init_matrix, mpr->matrix);
        mpr->interaction_data = inter;
 }
 
@@ -152,7 +154,7 @@ static int manipulator_arrow2d_test_select(
        float mval_local[2];
 
        copy_v2_v2(mval_local, mval);
-       sub_v2_v2(mval_local, mpr->origin);
+       sub_v2_v2(mval_local, mpr->matrix[3]);
 
        float line[2][2];
        line[0][0] = line[0][1] = line[1][0] = 0.0f;
diff --git a/source/blender/editors/manipulator_library/arrow3d_manipulator.c 
b/source/blender/editors/manipulator_library/arrow3d_manipulator.c
index f0f7470c058..1d3cb281af1 100644
--- a/source/blender/editors/manipulator_library/arrow3d_manipulator.c
+++ b/source/blender/editors/manipulator_library/arrow3d_manipulator.c
@@ -89,12 +89,12 @@ typedef struct ArrowManipulator3D {
 
 /* -------------------------------------------------------------------- */
 
-static void manipulator_arrow_position_get(wmManipulator *mpr, float r_pos[3])
+static void manipulator_arrow_matrix_world_get(wmManipulator *mpr, float 
r_matrix[4][4])
 {
        ArrowManipulator3D *arrow = (ArrowManipulator3D *)mpr;
 
-       mul_v3_v3fl(r_pos, arrow->direction, arrow->data.offset);
-       add_v3_v3(r_pos, arrow->manipulator.origin);
+       copy_m4_m4(r_matrix, arrow->manipulator.matrix);
+       madd_v3_v3fl(r_matrix[3], arrow->direction, arrow->data.offset);
 }
 
 static void arrow_draw_geom(const ArrowManipulator3D *arrow, const bool 
select, const float color[4])
@@ -190,10 +190,10 @@ static void arrow_draw_intern(ArrowManipulator3D *arrow, 
const bool select, cons
        float col[4];
        float rot[3][3];
        float mat[4][4];
-       float final_pos[3];
+       float final_matrix[4][4];
 
        manipulator_color_get(&arrow->manipulator, highlight, col);
-       manipulator_arrow_position_get(&arrow->manipulator, final_pos);
+       manipulator_arrow_matrix_world_get(&arrow->manipulator, final_matrix);
 
        if (arrow->flag & ARROW_UP_VECTOR_SET) {
                copy_v3_v3(rot[2], arrow->direction);
@@ -204,12 +204,12 @@ static void arrow_draw_intern(ArrowManipulator3D *arrow, 
const bool select, cons
                rotation_between_vecs_to_mat3(rot, up, arrow->direction);
        }
        copy_m4_m3(mat, rot);
-       copy_v3_v3(mat[3], final_pos);
+       copy_v3_v3(mat[3], final_matrix[3]);
        mul_mat3_m4_fl(mat, arrow->manipulator.scale);
 
        gpuPushMatrix();
        gpuMultMatrix(mat);
-       gpuTranslate3fv(arrow->manipulator.offset);
+       gpuMultMatrix(arrow->manipulator.matrix_offset);
 
        glEnable(GL_BLEND);
        arrow_draw_geom(arrow, select, col);
@@ -221,12 +221,12 @@ static void arrow_draw_intern(ArrowManipulator3D *arrow, 
const bool select, cons
                ManipulatorInteraction *inter = 
arrow->manipulator.interaction_data;
 
                copy_m4_m3(mat, rot);
-               copy_v3_v3(mat[3], inter->init_origin);
+               copy_v3_v3(mat[3], inter->init_matrix[3]);
                mul_mat3_m4_fl(mat, inter->init_scale);
 
                gpuPushMatrix();
                gpuMultMatrix(mat);
-               gpuTranslate3fv(arrow->manipulator.offset);
+               gpuMultMatrix(arrow->manipulator.matrix_offset);
 
                glEnable(GL_BLEND);
                arrow_draw_geom(arrow, select, (const float [4]){0.5f, 0.5f, 
0.5f, 0.5f});
@@ -269,7 +269,7 @@ static void manipulator_arrow_modal(bContext *C, 
wmManipulator *mpr, const wmEve
        bool use_vertical = false;
 
 
-       copy_v3_v3(orig_origin, inter->init_origin);
+       copy_v3_v3(orig_origin, inter->init_matrix[3]);
        orig_origin[3] = 1.0f;
        add_v3_v3v3(offset, orig_origin, arrow->direction);
        offset[3] = 1.0f;
@@ -313,7 +313,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_origin);
+       add_v3_v3v3(orig_origin, offset, inter->init_matrix[3]);
 
        /* calculate view vector for the new position */
        if (rv3d->is_persp) {
@@ -402,7 +402,7 @@ static void manipulator_arrow_invoke(
 
        inter->init_scale = mpr->scale;
 
-       manipulator_arrow_position_get(mpr, inter->init_origin);
+       manipulator_arrow_matrix_world_get(mpr, inter->init_matrix);
 
        mpr->interaction_data = inter;
 }
@@ -535,7 +535,7 @@ static void MANIPULATOR_WT_arrow_3d(wmManipulatorType *wt)
        /* api callbacks */
        wt->draw = manipulator_arrow_draw;
        wt->draw_select = manipulator_arrow_draw_select;
-       wt->position_get = manipulator_arrow_position_get;
+       wt->matrix_world_get = manipulator_arrow_matrix_world_get;
        wt->modal = manipulator_arrow_modal;
        wt->setup = manipulator_arrow_setup;
        wt->invoke = manipulator_arrow_invoke;
diff --git a/source/blender/editors/manipulator_library/cage2d_manipulator.c 
b/source/blender/editors/manipulator_library/cage2d_manipulator.c
index 9236a5ef10e..bf6c23f98e7 100644
--- a/source/blender/editors/manipulator_library/cage2d_manipulator.c
+++ b/source/blender/editors/manipulator_library/cage2d_manipulator.c
@@ -219,8 +219,8 @@ static void manipulator_rect_transform_draw(const bContext 
*UNUSED(C), wmManipul
        BLI_assert(cage->style != -1);
 
        gpuPushMatrix();
-       gpuTranslate2f(mpr->origin[0] + mpr->offset[0],
-                      mpr->origin[1] + mpr->offset[1]);
+       gpuMultMatrix(mpr->matrix);
+       gpuMultMatrix(mpr->matrix_offset);
        if (cage->style & ED_MANIPULATOR_RECT_TRANSFORM_STYLE_SCALE_UNIFORM)
                gpuScaleUniform(cage->scale[0]);
        else
@@ -281,9 +281,9 @@ static int manipulator_rect_transform_test_select(
        float aspx = 1.0f, aspy = 1.0f;
 
        /* rotate mouse in relation to the center and relocate it */
-       sub_v2_v2v2(point_local, mouse, mpr->origin);
-       point_local[0] -= mpr->offset[0];
-       point_local[1] -= mpr->offset[1];
+       sub_v2_v2v2(point_local, mouse, mpr->matrix[3]);
+       point_local[0] -= mpr->matrix_offset[3][0];
+       point_local[1] -= mpr->matrix_offset[3][1];
        //rotate_m2(matrot, -cage->transform.rotation);
 
        if (cage->style & ED_MANIPULATOR_RECT_TRANSFORM_STYLE_SCALE_UNIFORM)
@@ -419,7 +419,7 @@ static void manipulator_rect_transform_invoke(
        Cage2D *cage = (Cage2D *)mpr;
        RectTransformInteraction *data = 
MEM_callocN(sizeof(RectTransformInteraction), "cage_interaction");
 
-       copy_v2_v2(data->orig_offset, mpr->offset);
+       copy_v2_v2(data->orig_offset, mpr->matrix_offset[3]);
        copy_v2_v2(data->orig_scale, cage->scale);
 
        data->orig_mouse[0] = event->mval[0];
@@ -435,26 +435,26 @@ static void manipulator_rect_transform_modal(
        Cage2D *cage = (Cage2D *)mpr;
        RectTransformInteraction *data = mpr->interaction_data;
        /* needed here as well in case clamping occurs */
-       const float orig_ofx = mpr->offset[0], orig_ofy = mpr->offset[1];
+       const float orig_ofx = mpr->matrix_offset[3][0], orig_ofy = 
mpr->matrix_offset[3][1];
 
        const float valuex = (event->mval[0] - data->orig_mouse[0]);
        const float valuey = (event->mval[1] - data->orig_mouse[1]);
 
 
        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;
+               mpr->matrix_offset[3][0] = data->orig_offset[0] + valuex;
+               mpr->matrix_offset[3][1] = data->orig_offset[1] + valuey;
        }
        else if (mpr->highlight_part == 
ED_MANIPULATOR_RECT_TRANSFORM_INTERSECT_SCALEX_LEFT) {
-               mpr->offset[0] = data->orig_offset[0] + valuex / 2.0;
+               mpr->matrix_offset[3][0] = data->orig_offset[0] + valuex / 2.0;
                cage->scale[0] = (cage->w * data->orig_scale[0] - valuex) / 
cage->w;
        }
        else if (mpr->highlight_part == 
ED_MANIPULATOR_RECT_TRANSFORM_INTERSECT_SCALEX_RIGHT) {
-               mpr->offset[0] = data->orig_offset[0] + valuex / 2.0;
+               mpr->matrix_offset[3][0] = data->orig_offset[0] + valuex / 2.0;
                cage->scale[0] = (cage->w * data->orig_scale[0] + valuex) / 
cage->w;
        }
        else if (mpr->highlight_part == 
ED_MANIPULATOR_RECT_TRANSFORM_INTERSECT_SCALEY_DOWN) {
-               mpr->offset[1] = data->orig_offset[1] + valuey / 2.0;
+               mpr->matrix_offset[3][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;
@@ -464,7 +464,7 @@ static void manipulator_rect_transform_modal(
                }
        }
        else if (mpr->highlight_part == 
ED_MANIPULATOR_RECT_TRANSFORM_INTERSECT_SCALEY_UP) {
-               mpr->offset[1] = data->orig_offset[1] + valuey / 2.0;
+               mpr->matrix_off

@@ Diff output truncated at 10240 characters. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to