[Bf-blender-cvs] [9001dd7f29a] master: View3D: Cursor Snap Refactor
Germano Cavalcante
noreply at git.blender.org
Wed Oct 20 13:29:52 CEST 2021
Commit: 9001dd7f29a2f22534cf5549bc500422b1243c97
Author: Germano Cavalcante
Date: Tue Oct 19 12:55:20 2021 -0300
Branches: master
https://developer.blender.org/rB9001dd7f29a2f22534cf5549bc500422b1243c97
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
===================================================================
M source/blender/editors/gizmo_library/gizmo_types/snap3d_gizmo.c
M source/blender/editors/include/ED_view3d.h
M source/blender/editors/space_view3d/space_view3d.c
M source/blender/editors/space_view3d/view3d_cursor_snap.c
M source/blender/editors/space_view3d/view3d_placement.c
M source/blender/windowmanager/intern/wm_init_exit.c
===================================================================
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)
diff --git a/so
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list