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:
authorGermano Cavalcante <germano.costa@ig.com.br>2021-10-19 18:55:20 +0300
committerGermano Cavalcante <germano.costa@ig.com.br>2021-10-20 14:28:58 +0300
commit9001dd7f29a2f22534cf5549bc500422b1243c97 (patch)
tree4722af399c6b7144d2db49222dd08e4ce623c01a /source/blender/editors/gizmo_library
parent690e1baf722c6c79ec6a7eaa548cff4c0538f5d3 (diff)
View3D: Cursor Snap Refactor
Make the snap system consistent with the placement tool and leak-safe. **Changes:** - Store `SnapCursorDataIntern` in a `static` variable; - Initialize (lazily) `SnapCursorDataIntern` only once (for the keymap). - Move setup members of `V3DSnapCursorData` to a new struct `V3DSnapCursorState` - Merge `ED_view3d_cursor_snap_activate_point` and `ED_view3d_cursor_snap_activate_plane` into `state = ED_view3d_cursor_snap_active()` - Merge `ED_view3d_cursor_snap_deactivate_point` and `ED_view3d_cursor_snap_deactivate_plane` into `ED_view3d_cursor_snap_deactive(state)` - Be sure to free the snap context when closing via `ED_view3d_cursor_snap_exit` - Use RNA properties callbacks to update the properties of the `"Add Primitive Object"` operator
Diffstat (limited to 'source/blender/editors/gizmo_library')
-rw-r--r--source/blender/editors/gizmo_library/gizmo_types/snap3d_gizmo.c112
1 files changed, 48 insertions, 64 deletions
diff --git a/source/blender/editors/gizmo_library/gizmo_types/snap3d_gizmo.c b/source/blender/editors/gizmo_library/gizmo_types/snap3d_gizmo.c
index fccb65bad68..b95935f2e06 100644
--- a/source/blender/editors/gizmo_library/gizmo_types/snap3d_gizmo.c
+++ b/source/blender/editors/gizmo_library/gizmo_types/snap3d_gizmo.c
@@ -53,22 +53,18 @@
typedef struct SnapGizmo3D {
wmGizmo gizmo;
- V3DSnapCursorData *cursor_handle;
+ V3DSnapCursorState *snap_state;
} SnapGizmo3D;
static void snap_gizmo_snap_elements_update(SnapGizmo3D *snap_gizmo)
{
- V3DSnapCursorData *snap_data = snap_gizmo->cursor_handle;
wmGizmoProperty *gz_prop_snap;
gz_prop_snap = WM_gizmo_target_property_find(&snap_gizmo->gizmo, "snap_elements");
if (gz_prop_snap->prop) {
- snap_data->snap_elem_force |= RNA_property_enum_get(&gz_prop_snap->ptr, gz_prop_snap->prop);
+ V3DSnapCursorState *snap_state = ED_view3d_cursor_snap_state_get();
+ snap_state->snap_elem_force |= RNA_property_enum_get(&gz_prop_snap->ptr, gz_prop_snap->prop);
}
-
- UI_GetThemeColor3ubv(TH_TRANSFORM, snap_data->color_line);
- snap_data->color_line[3] = 128;
- rgba_float_to_uchar(snap_data->color_point, snap_gizmo->gizmo.color);
}
/* -------------------------------------------------------------------- */
@@ -77,49 +73,47 @@ static void snap_gizmo_snap_elements_update(SnapGizmo3D *snap_gizmo)
SnapObjectContext *ED_gizmotypes_snap_3d_context_ensure(Scene *scene, wmGizmo *UNUSED(gz))
{
- ED_view3d_cursor_snap_activate_point();
return ED_view3d_cursor_snap_context_ensure(scene);
}
-void ED_gizmotypes_snap_3d_flag_set(struct wmGizmo *gz, int flag)
+void ED_gizmotypes_snap_3d_flag_set(struct wmGizmo *UNUSED(gz), int flag)
{
- SnapGizmo3D *snap_gizmo = (SnapGizmo3D *)gz;
- snap_gizmo->cursor_handle->flag |= flag;
+ V3DSnapCursorState *snap_state = ED_view3d_cursor_snap_state_get();
+ snap_state->flag |= flag;
}
-void ED_gizmotypes_snap_3d_flag_clear(struct wmGizmo *gz, int flag)
+void ED_gizmotypes_snap_3d_flag_clear(struct wmGizmo *UNUSED(gz), int flag)
{
- SnapGizmo3D *snap_gizmo = (SnapGizmo3D *)gz;
- snap_gizmo->cursor_handle->flag &= ~flag;
+ V3DSnapCursorState *snap_state = ED_view3d_cursor_snap_state_get();
+ snap_state->flag &= ~flag;
}
-bool ED_gizmotypes_snap_3d_flag_test(struct wmGizmo *gz, int flag)
+bool ED_gizmotypes_snap_3d_flag_test(struct wmGizmo *UNUSED(gz), int flag)
{
- SnapGizmo3D *snap_gizmo = (SnapGizmo3D *)gz;
- return (snap_gizmo->cursor_handle->flag & flag) != 0;
+ V3DSnapCursorState *snap_state = ED_view3d_cursor_snap_state_get();
+ return (snap_state->flag & flag) != 0;
}
-bool ED_gizmotypes_snap_3d_invert_snap_get(struct wmGizmo *gz)
+bool ED_gizmotypes_snap_3d_invert_snap_get(struct wmGizmo *UNUSED(gz))
{
- SnapGizmo3D *snap_gizmo = (SnapGizmo3D *)gz;
- return snap_gizmo->cursor_handle->is_snap_invert;
+ V3DSnapCursorData *snap_data = ED_view3d_cursor_snap_data_get(NULL, NULL, 0, 0);
+ return snap_data->is_snap_invert;
}
bool ED_gizmotypes_snap_3d_is_enabled(const wmGizmo *gz)
{
- const SnapGizmo3D *snap_gizmo = (const SnapGizmo3D *)gz;
- return snap_gizmo->cursor_handle->is_enabled;
+ V3DSnapCursorData *snap_data = ED_view3d_cursor_snap_data_get(NULL, NULL, 0, 0);
+ return snap_data->is_enabled;
}
void ED_gizmotypes_snap_3d_data_get(const struct bContext *C,
- wmGizmo *gz,
+ wmGizmo *UNUSED(gz),
float r_loc[3],
float r_nor[3],
int r_elem_index[3],
int *r_snap_elem)
{
- V3DSnapCursorData *snap_data = ((SnapGizmo3D *)gz)->cursor_handle;
-
+ V3DSnapCursorData *snap_data = NULL;
if (C) {
/* Snap values are updated too late at the cursor. Be sure to update ahead of time. */
wmWindowManager *wm = CTX_wm_manager(C);
@@ -128,9 +122,12 @@ void ED_gizmotypes_snap_3d_data_get(const struct bContext *C,
ARegion *region = CTX_wm_region(C);
int x = event->x - region->winrct.xmin;
int y = event->y - region->winrct.ymin;
- ED_view3d_cursor_snap_update(C, x, y, snap_data);
+ snap_data = ED_view3d_cursor_snap_data_get(NULL, C, x, y);
}
}
+ if (!snap_data) {
+ snap_data = ED_view3d_cursor_snap_data_get(NULL, NULL, 0, 0);
+ }
if (r_loc) {
copy_v3_v3(r_loc, snap_data->loc);
@@ -155,30 +152,25 @@ void ED_gizmotypes_snap_3d_data_get(const struct bContext *C,
static int gizmo_snap_rna_snap_elements_force_get_fn(struct PointerRNA *UNUSED(ptr),
struct PropertyRNA *UNUSED(prop))
{
- V3DSnapCursorData *snap_data = ED_view3d_cursor_snap_data_get();
- if (snap_data) {
- return snap_data->snap_elem_force;
- }
- return 0;
+ V3DSnapCursorState *snap_state = ED_view3d_cursor_snap_state_get();
+ return snap_state->snap_elem_force;
}
static void gizmo_snap_rna_snap_elements_force_set_fn(struct PointerRNA *UNUSED(ptr),
struct PropertyRNA *UNUSED(prop),
int value)
{
- V3DSnapCursorData *snap_data = ED_view3d_cursor_snap_data_get();
- if (snap_data) {
- snap_data->snap_elem_force = (short)value;
- }
+ V3DSnapCursorState *snap_state = ED_view3d_cursor_snap_state_get();
+ snap_state->snap_elem_force = (short)value;
}
static void gizmo_snap_rna_prevpoint_get_fn(struct PointerRNA *UNUSED(ptr),
struct PropertyRNA *UNUSED(prop),
float *values)
{
- V3DSnapCursorData *snap_data = ED_view3d_cursor_snap_data_get();
- if (snap_data && snap_data->prevpoint) {
- copy_v3_v3(values, snap_data->prevpoint);
+ V3DSnapCursorState *snap_state = ED_view3d_cursor_snap_state_get();
+ if (snap_state->prevpoint) {
+ copy_v3_v3(values, snap_state->prevpoint);
}
}
@@ -186,47 +178,40 @@ static void gizmo_snap_rna_prevpoint_set_fn(struct PointerRNA *UNUSED(ptr),
struct PropertyRNA *UNUSED(prop),
const float *values)
{
- ED_view3d_cursor_snap_prevpoint_set(values);
+ V3DSnapCursorState *snap_state = ED_view3d_cursor_snap_state_get();
+ ED_view3d_cursor_snap_prevpoint_set(snap_state, values);
}
static void gizmo_snap_rna_location_get_fn(struct PointerRNA *UNUSED(ptr),
struct PropertyRNA *UNUSED(prop),
float *values)
{
- V3DSnapCursorData *snap_data = ED_view3d_cursor_snap_data_get();
- if (snap_data) {
- copy_v3_v3(values, snap_data->loc);
- }
+ V3DSnapCursorData *snap_data = ED_view3d_cursor_snap_data_get(NULL, NULL, 0, 0);
+ copy_v3_v3(values, snap_data->loc);
}
static void gizmo_snap_rna_location_set_fn(struct PointerRNA *UNUSED(ptr),
struct PropertyRNA *UNUSED(prop),
const float *values)
{
- V3DSnapCursorData *snap_data = ED_view3d_cursor_snap_data_get();
- if (snap_data) {
- copy_v3_v3(snap_data->loc, values);
- }
+ V3DSnapCursorData *snap_data = ED_view3d_cursor_snap_data_get(NULL, NULL, 0, 0);
+ copy_v3_v3(snap_data->loc, values);
}
static void gizmo_snap_rna_normal_get_fn(struct PointerRNA *UNUSED(ptr),
struct PropertyRNA *UNUSED(prop),
float *values)
{
- V3DSnapCursorData *snap_data = ED_view3d_cursor_snap_data_get();
- if (snap_data) {
- copy_v3_v3(values, snap_data->nor);
- }
+ V3DSnapCursorData *snap_data = ED_view3d_cursor_snap_data_get(NULL, NULL, 0, 0);
+ copy_v3_v3(values, snap_data->nor);
}
static void gizmo_snap_rna_snap_elem_index_get_fn(struct PointerRNA *UNUSED(ptr),
struct PropertyRNA *UNUSED(prop),
int *values)
{
- V3DSnapCursorData *snap_data = ED_view3d_cursor_snap_data_get();
- if (snap_data) {
- copy_v3_v3_int(values, snap_data->elem_index);
- }
+ V3DSnapCursorData *snap_data = ED_view3d_cursor_snap_data_get(NULL, NULL, 0, 0);
+ copy_v3_v3_int(values, snap_data->elem_index);
}
/** \} */
@@ -239,8 +224,11 @@ static void snap_gizmo_setup(wmGizmo *gz)
{
gz->flag |= WM_GIZMO_NO_TOOLTIP;
SnapGizmo3D *snap_gizmo = (SnapGizmo3D *)gz;
- ED_view3d_cursor_snap_activate_point();
- snap_gizmo->cursor_handle = ED_view3d_cursor_snap_data_get();
+ snap_gizmo->snap_state = ED_view3d_cursor_snap_active();
+ snap_gizmo->snap_state->draw_point = true;
+ snap_gizmo->snap_state->draw_plane = false;
+
+ rgba_float_to_uchar(snap_gizmo->snap_state->color_point, gz->color);
}
static void snap_gizmo_draw(const bContext *UNUSED(C), wmGizmo *UNUSED(gz))
@@ -251,7 +239,6 @@ static void snap_gizmo_draw(const bContext *UNUSED(C), wmGizmo *UNUSED(gz))
static int snap_gizmo_test_select(bContext *C, wmGizmo *gz, const int mval[2])
{
SnapGizmo3D *snap_gizmo = (SnapGizmo3D *)gz;
- V3DSnapCursorData *snap_data = snap_gizmo->cursor_handle;
/* Snap Elements can change while the gizmo is active. Need to be updated somewhere. */
snap_gizmo_snap_elements_update(snap_gizmo);
@@ -271,9 +258,9 @@ static int snap_gizmo_test_select(bContext *C, wmGizmo *gz, const int mval[2])
y = mval[1];
}
}
- ED_view3d_cursor_snap_update(C, x, y, snap_data);
+ V3DSnapCursorData *snap_data = ED_view3d_cursor_snap_data_get(snap_gizmo->snap_state, C, x, y);
- if (snap_data && snap_data->snap_elem) {
+ if (snap_data->snap_elem) {
return 0;
}
return -1;
@@ -297,10 +284,7 @@ static int snap_gizmo_invoke(bContext *UNUSED(C),
static void snap_gizmo_free(wmGizmo *gz)
{
SnapGizmo3D *snap_gizmo = (SnapGizmo3D *)gz;
- V3DSnapCursorData *snap_data = snap_gizmo->cursor_handle;
- if (snap_data) {
- ED_view3d_cursor_snap_deactivate_point();
- }
+ ED_view3d_cursor_snap_deactive(snap_gizmo->snap_state);
}
static void GIZMO_GT_snap_3d(wmGizmoType *gzt)