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:
authorCampbell Barton <ideasman42@gmail.com>2017-08-09 08:27:08 +0300
committerCampbell Barton <ideasman42@gmail.com>2017-08-09 11:07:55 +0300
commitd186ab6560414d9a817a84cc31a0a73f340c571c (patch)
treecd65bac30e8302ef0d18d747e996ced44e6f19ed
parentf0d4420cc0624da5238a317cfa3d08204c35a3dc (diff)
Manipulator: grab3d - support for 2d views
Also internal changes so arrow3d matches grab3d's behavior. Needed to add WM_MANIPULATOR_DRAW_OFFSET_SCALE flag so we can optionally apply offset in worldspace or screen scaled values.
-rw-r--r--source/blender/editors/include/ED_manipulator_library.h2
-rw-r--r--source/blender/editors/manipulator_library/manipulator_library_intern.h4
-rw-r--r--source/blender/editors/manipulator_library/manipulator_types/arrow2d_manipulator.c4
-rw-r--r--source/blender/editors/manipulator_library/manipulator_types/arrow3d_manipulator.c64
-rw-r--r--source/blender/editors/manipulator_library/manipulator_types/grab3d_manipulator.c122
-rw-r--r--source/blender/editors/manipulator_library/manipulator_types/primitive3d_manipulator.c8
-rw-r--r--source/blender/editors/transform/transform_manipulator.c1
-rw-r--r--source/blender/windowmanager/manipulators/WM_manipulator_types.h4
8 files changed, 152 insertions, 57 deletions
diff --git a/source/blender/editors/include/ED_manipulator_library.h b/source/blender/editors/include/ED_manipulator_library.h
index b8981acf1da..5d0f1526050 100644
--- a/source/blender/editors/include/ED_manipulator_library.h
+++ b/source/blender/editors/include/ED_manipulator_library.h
@@ -114,11 +114,13 @@ enum {
/* draw_options */
enum {
ED_MANIPULATOR_GRAB_DRAW_FLAG_NOP = 0,
+ /* only for solid shapes */
ED_MANIPULATOR_GRAB_DRAW_FLAG_FILL = (1 << 0),
};
enum {
ED_MANIPULATOR_GRAB_STYLE_RING = 0,
+ ED_MANIPULATOR_GRAB_STYLE_CROSS = 1,
};
diff --git a/source/blender/editors/manipulator_library/manipulator_library_intern.h b/source/blender/editors/manipulator_library/manipulator_library_intern.h
index a22afda8730..3a504ebe1d2 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[4][4];
+ float init_matrix_basis[4][4];
float init_mval[2];
float init_offset;
- float init_scale;
+ float init_scale_final;
/* 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 59a1e08d95a..61fb7e45533 100644
--- a/source/blender/editors/manipulator_library/manipulator_types/arrow2d_manipulator.c
+++ b/source/blender/editors/manipulator_library/manipulator_types/arrow2d_manipulator.c
@@ -114,7 +114,7 @@ static void manipulator_arrow2d_draw(const bContext *UNUSED(C), wmManipulator *m
ManipulatorInteraction *inter = mpr->interaction_data;
glEnable(GL_BLEND);
- arrow2d_draw_geom(mpr, inter->init_matrix, (const float[4]){0.5f, 0.5f, 0.5f, 0.5f});
+ arrow2d_draw_geom(mpr, inter->init_matrix_basis, (const float[4]){0.5f, 0.5f, 0.5f, 0.5f});
glDisable(GL_BLEND);
}
}
@@ -129,7 +129,7 @@ static void manipulator_arrow2d_invoke(
{
ManipulatorInteraction *inter = MEM_callocN(sizeof(ManipulatorInteraction), __func__);
- copy_m4_m4(inter->init_matrix, mpr->matrix_basis);
+ copy_m4_m4(inter->init_matrix_basis, mpr->matrix_basis);
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 923eca27e7c..f9d6770bdb3 100644
--- a/source/blender/editors/manipulator_library/manipulator_types/arrow3d_manipulator.c
+++ b/source/blender/editors/manipulator_library/manipulator_types/arrow3d_manipulator.c
@@ -36,8 +36,6 @@
* - `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"
@@ -130,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);
@@ -184,33 +182,46 @@ 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];
+ wmManipulator *mpr = &arrow->manipulator;
+ float color[4];
float final_matrix[4][4];
- manipulator_color_get(&arrow->manipulator, highlight, col);
- manipulator_arrow_matrix_world_get(&arrow->manipulator, final_matrix);
+ manipulator_color_get(mpr, highlight, color);
+ manipulator_arrow_matrix_world_get(mpr, final_matrix);
- mul_mat3_m4_fl(final_matrix, arrow->manipulator.scale_final);
- mul_m4_m4m4(final_matrix, final_matrix, arrow->manipulator.matrix_offset);
+ if (mpr->flag & WM_MANIPULATOR_DRAW_OFFSET_SCALE) {
+ mul_mat3_m4_fl(final_matrix, arrow->manipulator.scale_final);
+ }
+ mul_m4_m4m4(final_matrix, final_matrix, mpr->matrix_offset);
+ if ((mpr->flag & WM_MANIPULATOR_DRAW_OFFSET_SCALE) == 0) {
+ mul_mat3_m4_fl(final_matrix, arrow->manipulator.scale_final);
+ }
gpuPushMatrix();
+ gpuMultMatrix(mpr->matrix_space);
gpuMultMatrix(final_matrix);
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];
+ if (mpr->interaction_data) {
+ ManipulatorInteraction *inter = mpr->interaction_data;
- copy_m4_m4(offset_matrix, inter->init_matrix);
- mul_mat3_m4_fl(offset_matrix, inter->init_scale);
+ copy_m4_m4(final_matrix, inter->init_matrix_basis);
+ if (mpr->flag & WM_MANIPULATOR_DRAW_OFFSET_SCALE) {
+ mul_mat3_m4_fl(final_matrix, inter->init_scale_final);
+ }
+ mul_m4_m4m4(final_matrix, final_matrix, mpr->matrix_offset);
+ if ((mpr->flag & WM_MANIPULATOR_DRAW_OFFSET_SCALE) == 0) {
+ mul_mat3_m4_fl(final_matrix, inter->init_scale_final);
+ }
gpuPushMatrix();
- gpuMultMatrix(offset_matrix);
- gpuMultMatrix(arrow->manipulator.matrix_offset);
+ gpuMultMatrix(mpr->matrix_space);
+
+ gpuMultMatrix(final_matrix);
glEnable(GL_BLEND);
arrow_draw_geom(arrow, select, (const float [4]){0.5f, 0.5f, 0.5f, 0.5f});
@@ -255,7 +266,7 @@ static void manipulator_arrow_modal(
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;
@@ -299,7 +310,7 @@ static void manipulator_arrow_modal(
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) {
@@ -382,9 +393,9 @@ 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;
+ inter->init_scale_final = mpr->scale_final;
- manipulator_arrow_matrix_world_get(mpr, inter->init_matrix);
+ manipulator_arrow_matrix_world_get(mpr, inter->init_matrix_basis);
mpr->interaction_data = inter;
}
@@ -400,14 +411,19 @@ 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;
+ wmManipulatorProperty *mpr_prop = WM_manipulator_target_property_find(mpr, "offset");
+
+ if (!cancel) {
+ /* Assign incase applying the opetration needs an updated offset
+ * editmesh bisect needs this. */
+ data->offset = WM_manipulator_target_property_value_get(mpr, mpr_prop);
+ return;
+ }
+
ManipulatorInteraction *inter = mpr->interaction_data;
- wmManipulatorProperty *mpr_prop = WM_manipulator_target_property_find(mpr, "offset");
manipulator_property_value_reset(C, mpr, inter, mpr_prop);
data->offset = inter->init_offset;
}
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 d4b98ec514a..605c089f818 100644
--- a/source/blender/editors/manipulator_library/manipulator_types/grab3d_manipulator.c
+++ b/source/blender/editors/manipulator_library/manipulator_types/grab3d_manipulator.c
@@ -23,7 +23,7 @@
*
* \name Grab Manipulator
*
- * 3D Manipulator
+ * 3D Manipulator, also works in 2D views.
*
* \brief Simple manipulator to grab and translate.
*
@@ -31,8 +31,6 @@
* - `matrix[1]` currently not used.
* - `matrix[2]` is the widget direction (for all manipulators).
*
- * TODO: use matrix_space
- *
*/
#include "BIF_gl.h"
@@ -75,9 +73,11 @@ typedef struct GrabInteraction {
/* only for when using properties */
float init_prop_co[3];
+ float init_matrix_basis[4][4];
+ float init_scale_final;
+
/* final output values, used for drawing */
struct {
- float co_ofs[3];
float co_final[3];
} output;
} GrabInteraction;
@@ -93,6 +93,7 @@ static void grab_geom_draw(
UNUSED_VARS(grab3d, col, axis_modal_mat);
wm_manipulator_geometryinfo_draw(&wm_manipulator_geom_data_grab3d, select);
#else
+ const int draw_style = RNA_enum_get(mpr->ptr, "draw_style");
const int draw_options = RNA_enum_get(mpr->ptr, "draw_options");
const bool filled = (draw_options & ED_MANIPULATOR_GRAB_DRAW_FLAG_FILL) != 0;
@@ -105,11 +106,22 @@ static void grab_geom_draw(
immUniformColor4fv(col);
- if (filled) {
- imm_draw_circle_fill(pos, 0, 0, 1.0, DIAL_RESOLUTION);
+ if (draw_style == ED_MANIPULATOR_GRAB_STYLE_RING) {
+ if (filled) {
+ imm_draw_circle_fill(pos, 0, 0, 1.0f, DIAL_RESOLUTION);
+ }
+ else {
+ imm_draw_circle_wire(pos, 0, 0, 1.0f, DIAL_RESOLUTION);
+ }
}
- else {
- imm_draw_circle_wire(pos, 0, 0, 1.0, DIAL_RESOLUTION);
+ else if (draw_style == ED_MANIPULATOR_GRAB_STYLE_CROSS) {
+ immBegin(GWN_PRIM_LINES, 4);
+ immVertex2f(pos, 1.0f, 1.0f);
+ immVertex2f(pos, -1.0f, -1.0f);
+
+ immVertex2f(pos, -1.0f, 1.0f);
+ immVertex2f(pos, 1.0f, -1.0f);
+ immEnd();
}
immUnbindProgram();
@@ -136,36 +148,47 @@ static void grab3d_get_translate(
}
static void grab3d_draw_intern(
- const bContext *C, wmManipulator *mpr,
+ const bContext *UNUSED(C), wmManipulator *mpr,
const bool select, const bool highlight)
{
- float mat[4][4];
float col[4];
-
- BLI_assert(CTX_wm_area(C)->spacetype == SPACE_VIEW3D);
- UNUSED_VARS_NDEBUG(C);
+ float final_matrix[4][4];
manipulator_color_get(mpr, highlight, col);
- copy_m4_m4(mat, mpr->matrix_basis);
- mul_mat3_m4_fl(mat, mpr->scale_final);
+ copy_m4_m4(final_matrix, mpr->matrix_basis);
+ if (mpr->flag & WM_MANIPULATOR_DRAW_OFFSET_SCALE) {
+ mul_mat3_m4_fl(final_matrix, mpr->scale_final);
+ }
+ mul_m4_m4m4(final_matrix, final_matrix, mpr->matrix_offset);
+ if ((mpr->flag & WM_MANIPULATOR_DRAW_OFFSET_SCALE) == 0) {
+ mul_mat3_m4_fl(final_matrix, mpr->scale_final);
+ }
gpuPushMatrix();
- if (mpr->interaction_data) {
- GrabInteraction *inter = mpr->interaction_data;
- gpuTranslate3fv(inter->output.co_ofs);
- }
- gpuMultMatrix(mat);
- gpuMultMatrix(mpr->matrix_offset);
+ gpuMultMatrix(mpr->matrix_space);
+ gpuMultMatrix(final_matrix);
glEnable(GL_BLEND);
+
grab_geom_draw(mpr, col, select);
glDisable(GL_BLEND);
gpuPopMatrix();
if (mpr->interaction_data) {
+ GrabInteraction *inter = mpr->interaction_data;
+
+ copy_m4_m4(final_matrix, inter->init_matrix_basis);
+ if (mpr->flag & WM_MANIPULATOR_DRAW_OFFSET_SCALE) {
+ mul_mat3_m4_fl(final_matrix, inter->init_scale_final);
+ }
+ mul_m4_m4m4(final_matrix, final_matrix, mpr->matrix_offset);
+ if ((mpr->flag & WM_MANIPULATOR_DRAW_OFFSET_SCALE) == 0) {
+ mul_mat3_m4_fl(final_matrix, inter->init_scale_final);
+ }
+
gpuPushMatrix();
- gpuMultMatrix(mat);
- gpuMultMatrix(mpr->matrix_offset);
+ gpuMultMatrix(mpr->matrix_space);
+ gpuMultMatrix(final_matrix);
glEnable(GL_BLEND);
grab_geom_draw(mpr, (const float [4]){0.5f, 0.5f, 0.5f, 0.5f}, select);
glDisable(GL_BLEND);
@@ -197,9 +220,23 @@ static void manipulator_grab_modal(
{
GrabInteraction *inter = mpr->interaction_data;
- grab3d_get_translate(mpr, event, CTX_wm_region(C), inter->output.co_ofs);
+ if (CTX_wm_area(C)->spacetype == SPACE_VIEW3D) {
+ grab3d_get_translate(mpr, event, CTX_wm_region(C), mpr->matrix_basis[3]);
+ }
+ else {
+ float mval_proj_init[2], mval_proj_curr[2];
+ if ((manipulator_window_project_2d(
+ C, mpr, inter->init_mval, 2, false, mval_proj_init) == false) ||
+ (manipulator_window_project_2d(
+ C, mpr, (const float[2]){UNPACK2(event->mval)}, 2, false, mval_proj_curr) == false))
+ {
+ return;
+ }
+ sub_v2_v2v2(mpr->matrix_basis[3], mval_proj_curr, mval_proj_init);
+ mpr->matrix_basis[3][2] = 0.0f;
+ }
- add_v3_v3v3(inter->output.co_final, inter->init_prop_co, inter->output.co_ofs);
+ add_v3_v3v3(inter->output.co_final, inter->init_prop_co, mpr->matrix_basis[3]);
/* set the property for the operator and call its modal function */
wmManipulatorProperty *mpr_prop = WM_manipulator_target_property_find(mpr, "offset");
@@ -216,6 +253,9 @@ 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;
+
wmManipulatorProperty *mpr_prop = WM_manipulator_target_property_find(mpr, "offset");
if (WM_manipulator_target_property_is_valid(mpr_prop)) {
WM_manipulator_target_property_value_get_array(mpr, mpr_prop, inter->init_prop_co);
@@ -224,6 +264,35 @@ static void manipulator_grab_invoke(
mpr->interaction_data = inter;
}
+
+static int manipulator_grab_test_select(
+ bContext *C, wmManipulator *mpr, const wmEvent *event)
+{
+ float point_local[2];
+
+ if (manipulator_window_project_2d(
+ C, mpr, (const float[2]){UNPACK2(event->mval)}, 2, true, point_local) == false)
+ {
+ return 0;
+ }
+
+ if (len_squared_v2(point_local) < SQUARE(mpr->scale_final)) {
+ return true;
+ }
+
+ return 0;
+}
+
+static void manipulator_grab_property_update(wmManipulator *mpr, wmManipulatorProperty *mpr_prop)
+{
+ WM_manipulator_target_property_value_get_array(mpr, mpr_prop, mpr->matrix_basis[3]);
+}
+
+static int manipulator_grab_cursor_get(wmManipulator *UNUSED(mpr))
+{
+ return BC_HANDCURSOR;
+}
+
/* -------------------------------------------------------------------- */
/** \name Grab Manipulator API
*
@@ -237,8 +306,11 @@ static void MANIPULATOR_WT_grab_3d(wmManipulatorType *wt)
/* api callbacks */
wt->draw = manipulator_grab_draw;
wt->draw_select = manipulator_grab_draw_select;
+ wt->test_select = manipulator_grab_test_select;
wt->invoke = manipulator_grab_invoke;
+ wt->property_update = manipulator_grab_property_update;
wt->modal = manipulator_grab_modal;
+ wt->cursor_get = manipulator_grab_cursor_get;
wt->struct_size = sizeof(wmManipulator);
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 6a7fde5a5b5..fae73e5f622 100644
--- a/source/blender/editors/manipulator_library/manipulator_types/primitive3d_manipulator.c
+++ b/source/blender/editors/manipulator_library/manipulator_types/primitive3d_manipulator.c
@@ -118,8 +118,8 @@ static void manipulator_primitive_draw_intern(
copy_v3_fl(col_outer, 0.5f);
col_outer[3] = 0.8f;
- copy_m4_m4(mat, inter->init_matrix);
- mul_mat3_m4_fl(mat, inter->init_scale);
+ copy_m4_m4(mat, inter->init_matrix_basis);
+ mul_mat3_m4_fl(mat, inter->init_scale_final);
gpuPushMatrix();
gpuMultMatrix(mat);
@@ -158,8 +158,8 @@ static void manipulator_primitive_invoke(
{
ManipulatorInteraction *inter = MEM_callocN(sizeof(ManipulatorInteraction), __func__);
- copy_m4_m4(inter->init_matrix, mpr->matrix_basis);
- inter->init_scale = mpr->scale_final;
+ copy_m4_m4(inter->init_matrix_basis, mpr->matrix_basis);
+ inter->init_scale_final = mpr->scale_final;
mpr->interaction_data = inter;
}
diff --git a/source/blender/editors/transform/transform_manipulator.c b/source/blender/editors/transform/transform_manipulator.c
index 5b4eebc963f..cddb7113361 100644
--- a/source/blender/editors/transform/transform_manipulator.c
+++ b/source/blender/editors/transform/transform_manipulator.c
@@ -1310,6 +1310,7 @@ static void WIDGETGROUP_manipulator_refresh(const bContext *C, wmManipulatorGrou
WM_manipulator_set_matrix_rotation_from_z_axis(axis, rv3d->twmat[aidx_norm]);
RNA_float_set(axis->ptr, "length", len);
WM_manipulator_set_matrix_offset_location(axis, start_co);
+ WM_manipulator_set_flag(axis, WM_MANIPULATOR_DRAW_OFFSET_SCALE, true);
break;
}
case MAN_AXIS_ROT_X:
diff --git a/source/blender/windowmanager/manipulators/WM_manipulator_types.h b/source/blender/windowmanager/manipulators/WM_manipulator_types.h
index 065206eb9b3..8346bf24fd1 100644
--- a/source/blender/windowmanager/manipulators/WM_manipulator_types.h
+++ b/source/blender/windowmanager/manipulators/WM_manipulator_types.h
@@ -71,6 +71,10 @@ typedef enum eWM_ManipulatorFlag {
WM_MANIPULATOR_DRAW_MODAL = (1 << 1), /* draw while dragging */
WM_MANIPULATOR_DRAW_VALUE = (1 << 2), /* draw an indicator for the current value while dragging */
WM_MANIPULATOR_HIDDEN = (1 << 3),
+ /**
+ * When set 'scale_final' value also scales the offset.
+ * Use when offset is to avoid screen-space overlap instead of absolute positioning. */
+ WM_MANIPULATOR_DRAW_OFFSET_SCALE = (1 << 4),
} eWM_ManipulatorFlag;
/**