Commit: 54cea98046962a7557ce1b75b4a6146373bdda42
Author: Campbell Barton
Date:   Fri Aug 4 15:34:01 2017 +1000
Branches: blender2.8
https://developer.blender.org/rB54cea98046962a7557ce1b75b4a6146373bdda42

Manipulator: add manipulator space matrix

Render-border & crop-node 2d-cage manipulators where unreasonably
complicated to implement because there was no good way to define
the sub-region the manipulator was transforming in
(render border within the camera's frame for example).

Add matrix-space variable,
remove scale property from cage2d manipulator, use matrix instead.

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

M       source/blender/editors/manipulator_library/manipulator_library_utils.c
M       
source/blender/editors/manipulator_library/manipulator_types/arrow3d_manipulator.c
M       
source/blender/editors/manipulator_library/manipulator_types/cage2d_manipulator.c
M       
source/blender/editors/manipulator_library/manipulator_types/dial3d_manipulator.c
M       
source/blender/editors/manipulator_library/manipulator_types/grab3d_manipulator.c
M       
source/blender/editors/manipulator_library/manipulator_types/primitive3d_manipulator.c
M       source/blender/editors/space_view3d/view3d_manipulator_camera.c
M       source/blender/makesrna/intern/rna_wm_manipulator.c
M       source/blender/windowmanager/manipulators/WM_manipulator_types.h
M       source/blender/windowmanager/manipulators/intern/wm_manipulator.c

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

diff --git 
a/source/blender/editors/manipulator_library/manipulator_library_utils.c 
b/source/blender/editors/manipulator_library/manipulator_library_utils.c
index f521bd9dbf4..58999a82bba 100644
--- a/source/blender/editors/manipulator_library/manipulator_library_utils.c
+++ b/source/blender/editors/manipulator_library/manipulator_library_utils.c
@@ -174,10 +174,10 @@ bool manipulator_window_project_2d(
 {
        float mat[4][4];
        if (use_offset) {
-               mul_m4_m4m4(mat, mpr->matrix_basis, mpr->matrix_offset);
+               mul_m4_series(mat, mpr->matrix_space, mpr->matrix_basis, 
mpr->matrix_offset);
        }
        else {
-               copy_m4_m4(mat, mpr->matrix_basis);
+               mul_m4_series(mat, mpr->matrix_space, mpr->matrix_basis);
        }
 
        /* rotate mouse in relation to the center and relocate it */
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 b6a9e526d49..923eca27e7c 100644
--- 
a/source/blender/editors/manipulator_library/manipulator_types/arrow3d_manipulator.c
+++ 
b/source/blender/editors/manipulator_library/manipulator_types/arrow3d_manipulator.c
@@ -36,6 +36,8 @@
  * - `matrix[0]` is derived from Y and Z.
  * - `matrix[1]` is 'up' for manipulator types that have an up.
  * - `matrix[2]` is the arrow direction (for all arrowes).
+ *
+ * TODO: use matrix_space
  */
 
 #include "BIF_gl.h"
diff --git 
a/source/blender/editors/manipulator_library/manipulator_types/cage2d_manipulator.c
 
b/source/blender/editors/manipulator_library/manipulator_types/cage2d_manipulator.c
index e75142119ab..f8d195ef155 100644
--- 
a/source/blender/editors/manipulator_library/manipulator_types/cage2d_manipulator.c
+++ 
b/source/blender/editors/manipulator_library/manipulator_types/cage2d_manipulator.c
@@ -202,9 +202,6 @@ static void manipulator_rect_transform_draw_intern(
        float w = dims[0];
        float h = dims[1];
 
-       float scale[2];
-       RNA_float_get_array(mpr->ptr, "scale", scale);
-
        const int transform_flag = RNA_enum_get(mpr->ptr, "transform");
 
        float aspx = 1.0f, aspy = 1.0f;
@@ -218,14 +215,9 @@ static void manipulator_rect_transform_draw_intern(
        };
 
        gpuPushMatrix();
+       gpuMultMatrix(mpr->matrix_space);
        gpuMultMatrix(mpr->matrix_basis);
        gpuMultMatrix(mpr->matrix_offset);
-       if (transform_flag & ED_MANIPULATOR_RECT_TRANSFORM_FLAG_SCALE_UNIFORM) {
-               gpuScaleUniform(scale[0]);
-       }
-       else {
-               gpuScale2fv(scale);
-       }
 
        if (w > h) {
                aspx = h / w;
@@ -235,9 +227,8 @@ static void manipulator_rect_transform_draw_intern(
        }
 
        if (use_clamp) {
-               w = min_ff(aspx * w / MANIPULATOR_RESIZER_WIDTH, 
MANIPULATOR_RESIZER_WIDTH / scale[0]);
-               h = min_ff(aspy * h / MANIPULATOR_RESIZER_WIDTH, 
MANIPULATOR_RESIZER_WIDTH /
-                          ((transform_flag & 
ED_MANIPULATOR_RECT_TRANSFORM_FLAG_SCALE_UNIFORM) ? scale[0] : scale[1]));
+               w = min_ff(aspx * w / MANIPULATOR_RESIZER_WIDTH, 
MANIPULATOR_RESIZER_WIDTH);
+               h = min_ff(aspy * h / MANIPULATOR_RESIZER_WIDTH, 
MANIPULATOR_RESIZER_WIDTH);
        }
        else {
                /* Corner size. */
@@ -324,8 +315,6 @@ static int manipulator_rect_transform_test_select(
 {
        //float matrot[2][2];
        float point_local[2];
-       float scale[2];
-       RNA_float_get_array(mpr->ptr, "scale", scale);
        float dims[2];
        RNA_float_get_array(mpr->ptr, "dimensions", dims);
        float w = dims[0];
@@ -341,23 +330,14 @@ static int manipulator_rect_transform_test_select(
        }
 
        const int transform_flag = RNA_enum_get(mpr->ptr, "transform");
-       if (transform_flag & ED_MANIPULATOR_RECT_TRANSFORM_FLAG_SCALE_UNIFORM) {
-               mul_v2_fl(point_local, 1.0f / scale[0]);
-       }
-       else {
-               point_local[0] /= scale[0];
-               point_local[1] /= scale[1];
-       }
-
        if (dims[0] > dims[1]) {
                aspx = h / w;
        }
        else {
                aspy = w / h;
        }
-       w = min_ff(aspx * w / MANIPULATOR_RESIZER_WIDTH, 
MANIPULATOR_RESIZER_WIDTH / scale[0]);
-       h = min_ff(aspy * h / MANIPULATOR_RESIZER_WIDTH, 
MANIPULATOR_RESIZER_WIDTH /
-                  ((transform_flag & 
ED_MANIPULATOR_RECT_TRANSFORM_FLAG_SCALE_UNIFORM) ? scale[0] : scale[1]));
+       w = min_ff(aspx * w / MANIPULATOR_RESIZER_WIDTH, 
MANIPULATOR_RESIZER_WIDTH);
+       h = min_ff(aspy * h / MANIPULATOR_RESIZER_WIDTH, 
MANIPULATOR_RESIZER_WIDTH);
 
 
        rctf r;
@@ -422,8 +402,7 @@ static int manipulator_rect_transform_test_select(
 
 typedef struct RectTransformInteraction {
        float orig_mouse[2];
-       float orig_offset[2];
-       float orig_scale[2];
+       float orig_matrix_offset[4][4];
 } RectTransformInteraction;
 
 static bool manipulator_rect_transform_get_prop_value(
@@ -440,6 +419,7 @@ static bool manipulator_rect_transform_get_prop_value(
                        }
                        else {
                                *value = 
WM_manipulator_target_property_value_get(mpr, mpr_prop);
+                               value[1] = value[0];
                        }
                }
                else {
@@ -463,11 +443,7 @@ static void manipulator_rect_transform_invoke(
 {
        RectTransformInteraction *data = 
MEM_callocN(sizeof(RectTransformInteraction), "cage_interaction");
 
-       float scale[2];
-       RNA_float_get_array(mpr->ptr, "scale", scale);
-
-       copy_v2_v2(data->orig_offset, mpr->matrix_offset[3]);
-       copy_v2_v2(data->orig_scale, scale);
+       copy_m4_m4(data->orig_matrix_offset, mpr->matrix_offset);
 
        if (manipulator_window_project_2d(
                C, mpr, (const float[2]){UNPACK2(event->mval)}, 2, false, 
data->orig_mouse) == 0)
@@ -500,48 +476,51 @@ static void manipulator_rect_transform_modal(
                return;
        }
 
-       float valuex = (point_local[0] - data->orig_mouse[0]);
-       float valuey = (point_local[1] - data->orig_mouse[1]);
+       float value_x = (point_local[0] - data->orig_mouse[0]);
+       float value_y = (point_local[1] - data->orig_mouse[1]);
 
        float dims[2];
        RNA_float_get_array(mpr->ptr, "dimensions", dims);
 
-       float scale[2];
-       RNA_float_get_array(mpr->ptr, "scale", scale);
+       const float  orig_scale[2] = {data->orig_matrix_offset[0][0], 
data->orig_matrix_offset[1][1]};
+       const float *orig_offset = data->orig_matrix_offset[3];
+
+       float  scale[2] = {mpr->matrix_offset[0][0], mpr->matrix_offset[1][1]};
+       float *offset = mpr->matrix_offset[3];
 
        if (mpr->highlight_part == 
ED_MANIPULATOR_RECT_TRANSFORM_INTERSECT_TRANSLATE) {
-               mpr->matrix_offset[3][0] = data->orig_offset[0] + valuex;
-               mpr->matrix_offset[3][1] = data->orig_offset[1] + valuey;
+               offset[0] = orig_offset[0] + value_x;
+               offset[1] = orig_offset[1] + value_y;
        }
        else if (mpr->highlight_part == 
ED_MANIPULATOR_RECT_TRANSFORM_INTERSECT_SCALEX_LEFT) {
-               valuex = min_ff(valuex, (dims[0] * data->orig_scale[0]) * 
(pivot_center ? 2 : 1));
+               value_x = min_ff(value_x, (dims[0] * orig_scale[0]) * 
(pivot_center ? 2 : 1));
                if (pivot_center == false) {
-                       mpr->matrix_offset[3][0] = data->orig_offset[0] + 
valuex / 2.0f;
+                       offset[0] = orig_offset[0] + value_x / 2.0f;
                }
-               scale[0] = (dims[0] * data->orig_scale[0] - valuex) / dims[0];
+               scale[0] = (dims[0] * orig_scale[0] - value_x) / dims[0];
        }
        else if (mpr->highlight_part == 
ED_MANIPULATOR_RECT_TRANSFORM_INTERSECT_SCALEX_RIGHT) {
-               valuex = max_ff(valuex, (dims[0] * data->orig_scale[0]) * 
(pivot_center ? -2 : -1));
+               value_x = max_ff(value_x, (dims[0] * orig_scale[0]) * 
(pivot_center ? -2 : -1));
                if (pivot_center == false) {
-                       mpr->matrix_offset[3][0] = data->orig_offset[0] + 
valuex / 2.0f;
+                       offset[0] = orig_offset[0] + value_x / 2.0f;
                }
-               scale[0] = (dims[0] * data->orig_scale[0] + valuex) / dims[0];
+               scale[0] = (dims[0] * orig_scale[0] + value_x) / dims[0];
        }
        else if (mpr->highlight_part == 
ED_MANIPULATOR_RECT_TRANSFORM_INTERSECT_SCALEY_DOWN) {
                int a = (transform_flag & 
ED_MANIPULATOR_RECT_TRANSFORM_FLAG_SCALE_UNIFORM) ? 0 : 1;
-               valuey = min_ff(valuey, (dims[1] * data->orig_scale[a]) * 
(pivot_center ? 2 : 1));
+               value_y = min_ff(value_y, (dims[1] * orig_scale[a]) * 
(pivot_center ? 2 : 1));
                if (pivot_center == false) {
-                       mpr->matrix_offset[3][1] = data->orig_offset[1] + 
valuey / 2.0f;
+                       offset[1] = orig_offset[1] + value_y / 2.0f;
                }
-               scale[a] = (dims[1] * data->orig_scale[a] - valuey) / dims[1];
+               scale[a] = (dims[1] * orig_scale[a] - value_y) / dims[1];
        }
        else if (mpr->highlight_part == 
ED_MANIPULATOR_RECT_TRANSFORM_INTERSECT_SCALEY_UP) {
                int a = (transform_flag & 
ED_MANIPULATOR_RECT_TRANSFORM_FLAG_SCALE_UNIFORM) ? 0 : 1;
-               valuey = max_ff(valuey, (dims[1] * data->orig_scale[a]) * 
(pivot_center ? -2 : -1));
+               value_y = max_ff(value_y, (dims[1] * orig_scale[a]) * 
(pivot_center ? -2 : -1));
                if (pivot_center == false) {
-                       mpr->matrix_offset[3][1] = data->orig_offset[1] + 
valuey / 2.0f;
+                       offset[1] = orig_offset[1] + value_y / 2.0f;
                }
-               scale[a] = (dims[1] * data->orig_scale[a] + valuey) / dims[1];
+               scale[a] = (dims[1] * orig_scale[a] + value_y) / dims[1];
        }
        else {
                BLI_assert(0);
@@ -556,18 +535,18 @@ static void manipulator_rect_transform_modal(
        else if (transform_flag & 
ED_MANIPULATOR_RECT_TRANSFORM_FLAG_SCALE_UNIFORM) {
                if (scale[0] < MANIPULATOR_RECT_MIN_WIDTH / max_ff(dims[0], 
dims[1])) {
                        scale[0] = max_ff(MANIPULATOR_RECT_MIN_WIDTH / dims[1], 
MANIPULATOR_RECT_MIN_WIDTH / dims[0]);
-                       mpr->matrix_offset[3][0] = orig_ofx;
-                       mpr->matrix_offset[3][1] = orig_ofy;
+                       offset[0] = orig_ofx;
+                       offset[1] = orig_ofy;
                }
        }
        else {
                if (scale[0] < MANIPULATOR_RECT_MIN_WIDTH / dims[0]) {
                        scale[0] = MANIPULATOR_RECT_MIN_WIDTH / dims[0];
-                       mpr->matrix_offset[3][0] = orig_ofx;
+                       offset[0] = orig_ofx;
                }
                if (scale[1] < MANIPULATOR_RECT_MIN_WIDTH / dims[1]) {
                        scale[1] = MANIPULATOR_RECT_MIN_WIDTH / dims[1];
-                       mpr->matrix_offset[3][1] = orig_ofy;
+                       offset[1] = orig_ofy;
                }
        }
 #endif
@@ -587,13 +566,15 @@ static void manipulator_rect_transform_modal(
        if (transform_flag & ED_MANIPULATOR_RECT_TRANSFORM_FLAG_SCALE_UNIFORM) {
                scale[1] = scale[0];
        }
-       RNA_float_set_array(mpr->ptr, "scale", scale);
+
+       mpr->matrix_offset[0][0] = scale[0];
+       mpr->matrix_offset[1][1] = scale[1];
 
        wmManipulatorProperty *mpr_prop;
 
        mpr_prop = WM_manipulator_target_property_find(mpr, "offset");
        if (mpr_prop->type != NULL) {
-               WM_manipulator_target_property_value_set_array(C, mpr, 
mpr_prop, mpr->matrix_offset[3]);
+               WM_manipulator_target_property_value_set_array(C, mpr, 
mpr_prop, offset);
        }
 
        mpr_prop = WM_manipulator_target_property_find(mpr, "scale");
@@ -624,7 +605,8 @@ static void manipulator_rect_transform_pr

@@ 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