Snap Gizmo: update props using gizmo's snap_state

A snap state can be replaced by another snap state of a gizmo or cursor.

The snap gizmo should only change its state, not the current state.

It's not really a problem currently.
This commit is contained in:
Germano Cavalcante 2022-04-28 11:13:03 -03:00
parent 16b6d4aeb3
commit f4718d52f3
1 changed files with 59 additions and 24 deletions

View File

@ -47,7 +47,7 @@ static void snap_gizmo_snap_elements_update(SnapGizmo3D *snap_gizmo)
gz_prop_snap = WM_gizmo_target_property_find(&snap_gizmo->gizmo, "snap_elements");
if (gz_prop_snap->prop) {
V3DSnapCursorState *snap_state = ED_view3d_cursor_snap_state_get();
V3DSnapCursorState *snap_state = snap_gizmo->snap_state;
snap_state->snap_elem_force |= RNA_property_enum_get(&gz_prop_snap->ptr, gz_prop_snap->prop);
}
}
@ -61,38 +61,38 @@ SnapObjectContext *ED_gizmotypes_snap_3d_context_ensure(Scene *scene, wmGizmo *U
return ED_view3d_cursor_snap_context_ensure(scene);
}
void ED_gizmotypes_snap_3d_flag_set(struct wmGizmo *UNUSED(gz), int flag)
void ED_gizmotypes_snap_3d_flag_set(struct wmGizmo *gz, int flag)
{
V3DSnapCursorState *snap_state = ED_view3d_cursor_snap_state_get();
V3DSnapCursorState *snap_state = ((SnapGizmo3D *)gz)->snap_state;
snap_state->flag |= flag;
}
void ED_gizmotypes_snap_3d_flag_clear(struct wmGizmo *UNUSED(gz), int flag)
void ED_gizmotypes_snap_3d_flag_clear(struct wmGizmo *gz, int flag)
{
V3DSnapCursorState *snap_state = ED_view3d_cursor_snap_state_get();
V3DSnapCursorState *snap_state = ((SnapGizmo3D *)gz)->snap_state;
snap_state->flag &= ~flag;
}
bool ED_gizmotypes_snap_3d_flag_test(struct wmGizmo *UNUSED(gz), int flag)
bool ED_gizmotypes_snap_3d_flag_test(struct wmGizmo *gz, int flag)
{
V3DSnapCursorState *snap_state = ED_view3d_cursor_snap_state_get();
V3DSnapCursorState *snap_state = ((SnapGizmo3D *)gz)->snap_state;
return (snap_state->flag & flag) != 0;
}
bool ED_gizmotypes_snap_3d_invert_snap_get(struct wmGizmo *UNUSED(gz))
bool ED_gizmotypes_snap_3d_invert_snap_get(struct wmGizmo *gz)
{
V3DSnapCursorData *snap_data = ED_view3d_cursor_snap_data_get();
return snap_data->is_snap_invert;
}
bool ED_gizmotypes_snap_3d_is_enabled(const wmGizmo *UNUSED(gz))
bool ED_gizmotypes_snap_3d_is_enabled(const wmGizmo *gz)
{
V3DSnapCursorData *snap_data = ED_view3d_cursor_snap_data_get();
return snap_data->is_enabled;
}
void ED_gizmotypes_snap_3d_data_get(const struct bContext *C,
wmGizmo *UNUSED(gz),
wmGizmo *gz,
float r_loc[3],
float r_nor[3],
int r_elem_index[3],
@ -107,7 +107,8 @@ void ED_gizmotypes_snap_3d_data_get(const struct bContext *C,
int x = event->xy[0] - region->winrct.xmin;
int y = event->xy[1] - region->winrct.ymin;
ED_view3d_cursor_snap_data_update(NULL, C, x, y);
SnapGizmo3D *snap_gizmo = (SnapGizmo3D *)gz;
ED_view3d_cursor_snap_data_update(snap_gizmo->snap_state, C, x, y);
}
}
@ -133,36 +134,72 @@ void ED_gizmotypes_snap_3d_data_get(const struct bContext *C,
/** \name RNA callbacks
* \{ */
static int gizmo_snap_rna_snap_elements_force_get_fn(struct PointerRNA *UNUSED(ptr),
/* Based on 'rna_GizmoProperties_find_operator'. */
static SnapGizmo3D *gizmo_snap_rna_find_operator(PointerRNA *ptr)
{
IDProperty *properties = ptr->data;
for (bScreen *screen = G_MAIN->screens.first; screen; screen = screen->id.next) {
LISTBASE_FOREACH (ScrArea *, area, &screen->areabase) {
if (area->spacetype != SPACE_VIEW3D) {
continue;
}
LISTBASE_FOREACH (ARegion *, region, &area->regionbase) {
if (region->regiontype == RGN_TYPE_WINDOW && region->gizmo_map) {
wmGizmoMap *gzmap = region->gizmo_map;
LISTBASE_FOREACH (wmGizmoGroup *, gzgroup, WM_gizmomap_group_list(gzmap)) {
LISTBASE_FOREACH (wmGizmo *, gz, &gzgroup->gizmos) {
if (gz->properties == properties) {
return (SnapGizmo3D *)gz;
}
}
}
}
}
}
}
return NULL;
}
static V3DSnapCursorState *gizmo_snap_state_from_rna_get(struct PointerRNA *ptr)
{
SnapGizmo3D *snap_gizmo = gizmo_snap_rna_find_operator(ptr);
if (snap_gizmo) {
return snap_gizmo->snap_state;
}
return ED_view3d_cursor_snap_state_get();
}
static int gizmo_snap_rna_snap_elements_force_get_fn(struct PointerRNA *ptr,
struct PropertyRNA *UNUSED(prop))
{
V3DSnapCursorState *snap_state = ED_view3d_cursor_snap_state_get();
V3DSnapCursorState *snap_state = gizmo_snap_state_from_rna_get(ptr);
return snap_state->snap_elem_force;
}
static void gizmo_snap_rna_snap_elements_force_set_fn(struct PointerRNA *UNUSED(ptr),
static void gizmo_snap_rna_snap_elements_force_set_fn(struct PointerRNA *ptr,
struct PropertyRNA *UNUSED(prop),
int value)
{
V3DSnapCursorState *snap_state = ED_view3d_cursor_snap_state_get();
V3DSnapCursorState *snap_state = gizmo_snap_state_from_rna_get(ptr);
snap_state->snap_elem_force = (short)value;
}
static void gizmo_snap_rna_prevpoint_get_fn(struct PointerRNA *UNUSED(ptr),
static void gizmo_snap_rna_prevpoint_get_fn(struct PointerRNA *ptr,
struct PropertyRNA *UNUSED(prop),
float *values)
{
V3DSnapCursorState *snap_state = ED_view3d_cursor_snap_state_get();
V3DSnapCursorState *snap_state = gizmo_snap_state_from_rna_get(ptr);
if (snap_state->prevpoint) {
copy_v3_v3(values, snap_state->prevpoint);
}
}
static void gizmo_snap_rna_prevpoint_set_fn(struct PointerRNA *UNUSED(ptr),
static void gizmo_snap_rna_prevpoint_set_fn(struct PointerRNA *ptr,
struct PropertyRNA *UNUSED(prop),
const float *values)
{
V3DSnapCursorState *snap_state = ED_view3d_cursor_snap_state_get();
V3DSnapCursorState *snap_state = gizmo_snap_state_from_rna_get(ptr);
ED_view3d_cursor_snap_prevpoint_set(snap_state, values);
}
@ -209,11 +246,9 @@ static void snap_gizmo_setup(wmGizmo *gz)
gz->flag |= WM_GIZMO_NO_TOOLTIP;
SnapGizmo3D *snap_gizmo = (SnapGizmo3D *)gz;
snap_gizmo->snap_state = ED_view3d_cursor_snap_active();
if (snap_gizmo->snap_state) {
snap_gizmo->snap_state->gzgrp_type = gz->parent_gzgroup->type;
snap_gizmo->snap_state->draw_point = true;
snap_gizmo->snap_state->draw_plane = false;
}
snap_gizmo->snap_state->gzgrp_type = gz->parent_gzgroup->type;
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);
}