[Bf-blender-cvs] [f4718d52f34] master: Snap Gizmo: update props using gizmo's snap_state

Germano Cavalcante noreply at git.blender.org
Thu Apr 28 17:42:10 CEST 2022


Commit: f4718d52f348666a91ff1aab66a6e495c299c8fd
Author: Germano Cavalcante
Date:   Thu Apr 28 11:13:03 2022 -0300
Branches: master
https://developer.blender.org/rBf4718d52f348666a91ff1aab66a6e495c299c8fd

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.

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

M	source/blender/editors/gizmo_library/gizmo_types/snap3d_gizmo.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 27e9207aa07..6bdffade058 100644
--- a/source/blender/editors/gizmo_library/gizmo_types/snap3d_gizmo.c
+++ b/source/blender/editors/gizmo_library/gizmo_types/snap3d_gizmo.c
@@ -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);
 }



More information about the Bf-blender-cvs mailing list