[Bf-blender-cvs] [69d6222481b] master: Snap and Placement Gizmo Refactor

Germano Cavalcante noreply at git.blender.org
Mon Oct 18 06:58:34 CEST 2021


Commit: 69d6222481b4342dc2a153e62752145aa37ea101
Author: Germano Cavalcante
Date:   Mon Oct 18 00:32:23 2021 -0300
Branches: master
https://developer.blender.org/rB69d6222481b4342dc2a153e62752145aa37ea101

Snap and Placement Gizmo Refactor

Move most of the gizmo snap and placement code to `view_cursor_snap.c`.

Simplify and extend the snap API.

Differential Revision: https://developer.blender.org/D12868

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

M	source/blender/editors/gizmo_library/gizmo_types/snap3d_gizmo.c
M	source/blender/editors/include/ED_gizmo_library.h
M	source/blender/editors/include/ED_transform_snap_object_context.h
M	source/blender/editors/include/ED_view3d.h
M	source/blender/editors/space_view3d/CMakeLists.txt
M	source/blender/editors/space_view3d/space_view3d.c
A	source/blender/editors/space_view3d/view3d_cursor_snap.c
M	source/blender/editors/space_view3d/view3d_edit.c
M	source/blender/editors/space_view3d/view3d_gizmo_ruler.c
M	source/blender/editors/space_view3d/view3d_placement.c
M	source/blender/editors/transform/transform_snap.c
M	source/blender/editors/transform/transform_snap_object.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 322ae87befa..fccb65bad68 100644
--- a/source/blender/editors/gizmo_library/gizmo_types/snap3d_gizmo.c
+++ b/source/blender/editors/gizmo_library/gizmo_types/snap3d_gizmo.c
@@ -27,420 +27,122 @@
  * \brief Snap gizmo which exposes the location, normal and index in the props.
  */
 
+#include "MEM_guardedalloc.h"
+
 #include "BLI_listbase.h"
 #include "BLI_math.h"
 
-#include "DNA_scene_types.h"
-
 #include "BKE_context.h"
 #include "BKE_global.h"
 #include "BKE_main.h"
 
-#include "GPU_immediate.h"
-#include "GPU_state.h"
-
 #include "ED_gizmo_library.h"
 #include "ED_screen.h"
 #include "ED_transform_snap_object_context.h"
 #include "ED_view3d.h"
 
-#include "UI_resources.h" /* icons */
+#include "UI_resources.h"
 
 #include "RNA_access.h"
 #include "RNA_define.h"
 
-#include "DEG_depsgraph_query.h"
-
 #include "WM_api.h"
-#include "WM_types.h"
 
 /* own includes */
-#include "../gizmo_geometry.h"
 #include "../gizmo_library_intern.h"
 
 typedef struct SnapGizmo3D {
   wmGizmo gizmo;
-
-  /* We could have other snap contexts, for now only support 3D view. */
-  SnapObjectContext *snap_context_v3d;
-
-  /* Copy of the parameters of the last event state in order to detect updates. */
-  struct {
-    int x;
-    int y;
-#ifdef USE_SNAP_DETECT_FROM_KEYMAP_HACK
-    short shift, ctrl, alt, oskey;
-#endif
-  } last_eventstate;
-
-#ifdef USE_SNAP_DETECT_FROM_KEYMAP_HACK
-  wmKeyMap *keymap;
-  int snap_on;
-  bool invert_snap;
-#endif
-
-  /* Setup. */
-  eSnapGizmo flag;
-  float *prevpoint;
-  float prevpoint_stack[3];
-  short snap_elem_force;
-
-  /* Return values. */
-  short snap_elem;
-  float loc[3];
-  float nor[3];
-  int elem_index[3];
-
-  /** Enabled when snap is activated, even if it didn't find anything. */
-  bool is_enabled;
+  V3DSnapCursorData *cursor_handle;
 } SnapGizmo3D;
 
-/* Checks if the current event is different from the one captured in the last update. */
-static bool eventstate_has_changed(SnapGizmo3D *snap_gizmo, const wmWindowManager *wm)
+static void snap_gizmo_snap_elements_update(SnapGizmo3D *snap_gizmo)
 {
-  if (wm && wm->winactive) {
-    const wmEvent *event = wm->winactive->eventstate;
-    if ((event->x != snap_gizmo->last_eventstate.x) ||
-        (event->y != snap_gizmo->last_eventstate.y)) {
-      return true;
-    }
-#ifdef USE_SNAP_DETECT_FROM_KEYMAP_HACK
-    if (!(snap_gizmo->flag & ED_SNAPGIZMO_TOGGLE_ALWAYS_TRUE)) {
-      if ((event->ctrl != snap_gizmo->last_eventstate.ctrl) ||
-          (event->shift != snap_gizmo->last_eventstate.shift) ||
-          (event->alt != snap_gizmo->last_eventstate.alt) ||
-          (event->oskey != snap_gizmo->last_eventstate.oskey)) {
-        return true;
-      }
-    }
-#endif
-  }
-  return false;
-}
+  V3DSnapCursorData *snap_data = snap_gizmo->cursor_handle;
+  wmGizmoProperty *gz_prop_snap;
+  gz_prop_snap = WM_gizmo_target_property_find(&snap_gizmo->gizmo, "snap_elements");
 
-/* Copies the current eventstate. */
-static void eventstate_save_xy(SnapGizmo3D *snap_gizmo, const wmWindowManager *wm)
-{
-  if (wm && wm->winactive) {
-    const wmEvent *event = wm->winactive->eventstate;
-    snap_gizmo->last_eventstate.x = event->x;
-    snap_gizmo->last_eventstate.y = event->y;
-  }
-}
-
-#ifdef USE_SNAP_DETECT_FROM_KEYMAP_HACK
-static bool invert_snap(SnapGizmo3D *snap_gizmo, const wmWindowManager *wm)
-{
-  if (!wm || !wm->winactive) {
-    return false;
-  }
-
-  const wmEvent *event = wm->winactive->eventstate;
-  if ((event->ctrl == snap_gizmo->last_eventstate.ctrl) &&
-      (event->shift == snap_gizmo->last_eventstate.shift) &&
-      (event->alt == snap_gizmo->last_eventstate.alt) &&
-      (event->oskey == snap_gizmo->last_eventstate.oskey)) {
-    /* Nothing has changed. */
-    return snap_gizmo->invert_snap;
-  }
-
-  /* Save new eventstate. */
-  snap_gizmo->last_eventstate.ctrl = event->ctrl;
-  snap_gizmo->last_eventstate.shift = event->shift;
-  snap_gizmo->last_eventstate.alt = event->alt;
-  snap_gizmo->last_eventstate.oskey = event->oskey;
-
-  const int snap_on = snap_gizmo->snap_on;
-
-  wmKeyMap *keymap = WM_keymap_active(wm, snap_gizmo->keymap);
-  for (wmKeyMapItem *kmi = keymap->items.first; kmi; kmi = kmi->next) {
-    if (kmi->flag & KMI_INACTIVE) {
-      continue;
-    }
-
-    if (kmi->propvalue == snap_on) {
-      if ((ELEM(kmi->type, EVT_LEFTCTRLKEY, EVT_RIGHTCTRLKEY) && event->ctrl) ||
-          (ELEM(kmi->type, EVT_LEFTSHIFTKEY, EVT_RIGHTSHIFTKEY) && event->shift) ||
-          (ELEM(kmi->type, EVT_LEFTALTKEY, EVT_RIGHTALTKEY) && event->alt) ||
-          ((kmi->type == EVT_OSKEY) && event->oskey)) {
-        return true;
-      }
-    }
+  if (gz_prop_snap->prop) {
+    snap_data->snap_elem_force |= RNA_property_enum_get(&gz_prop_snap->ptr, gz_prop_snap->prop);
   }
-  return false;
-}
-#endif
-
-static short snap_gizmo_snap_elements(SnapGizmo3D *snap_gizmo)
-{
-  int snap_elements = snap_gizmo->snap_elem_force;
 
-  wmGizmoProperty *gz_prop = WM_gizmo_target_property_find(&snap_gizmo->gizmo, "snap_elements");
-  if (gz_prop->prop) {
-    snap_elements |= RNA_property_enum_get(&gz_prop->ptr, gz_prop->prop);
-  }
-  snap_elements &= (SCE_SNAP_MODE_VERTEX | SCE_SNAP_MODE_EDGE | SCE_SNAP_MODE_FACE |
-                    SCE_SNAP_MODE_EDGE_MIDPOINT | SCE_SNAP_MODE_EDGE_PERPENDICULAR);
-  return (ushort)snap_elements;
+  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);
 }
 
 /* -------------------------------------------------------------------- */
 /** \name ED_gizmo_library specific API
  * \{ */
 
-void ED_gizmotypes_snap_3d_draw_util(RegionView3D *rv3d,
-                                     const float loc_prev[3],
-                                     const float loc_curr[3],
-                                     const float normal[3],
-                                     const uchar color_line[4],
-                                     const uchar color_point[4],
-                                     const short snap_elem_type)
+SnapObjectContext *ED_gizmotypes_snap_3d_context_ensure(Scene *scene, wmGizmo *UNUSED(gz))
 {
-  if (!loc_prev && !loc_curr) {
-    return;
-  }
-
-  float view_inv[4][4];
-  copy_m4_m4(view_inv, rv3d->viewinv);
-
-  /* The size of the circle is larger than the vertex size.
-   * This prevents a drawing overlaps the other. */
-  float radius = 2.5f * UI_GetThemeValuef(TH_VERTEX_SIZE);
-  uint pos = GPU_vertformat_attr_add(immVertexFormat(), "pos", GPU_COMP_F32, 3, GPU_FETCH_FLOAT);
-
-  immBindBuiltinProgram(GPU_SHADER_3D_UNIFORM_COLOR);
-
-  if (loc_curr) {
-    immUniformColor4ubv(color_point);
-    imm_drawcircball(loc_curr, ED_view3d_pixel_size(rv3d, loc_curr) * radius, view_inv, pos);
-
-    /* draw normal if needed */
-    if (normal) {
-      immBegin(GPU_PRIM_LINES, 2);
-      immVertex3fv(pos, loc_curr);
-      immVertex3f(pos, loc_curr[0] + normal[0], loc_curr[1] + normal[1], loc_curr[2] + normal[2]);
-      immEnd();
-    }
-  }
-
-  if (loc_prev) {
-    /* Draw an "X" indicating where the previous snap point is.
-     * This is useful for indicating perpendicular snap. */
-
-    /* v1, v2, v3 and v4 indicate the coordinates of the ends of the "X". */
-    float vx[3], vy[3], v1[3], v2[3], v3[3], v4[4];
-
-    /* Multiply by 0.75f so that the final size of the "X" is close to that of
-     * the circle.
-     * (A closer value is 0.7071f, but we don't need to be exact here). */
-    float x_size = 0.75f * radius * ED_view3d_pixel_size(rv3d, loc_prev);
-
-    mul_v3_v3fl(vx, view_inv[0], x_size);
-    mul_v3_v3fl(vy, view_inv[1], x_size);
-
-    add_v3_v3v3(v1, vx, vy);
-    sub_v3_v3v3(v2, vx, vy);
-    negate_v3_v3(v3, v1);
-    negate_v3_v3(v4, v2);
-
-    add_v3_v3(v1, loc_prev);
-    add_v3_v3(v2, loc_prev);
-    add_v3_v3(v3, loc_prev);
-    add_v3_v3(v4, loc_prev);
-
-    immUniformColor4ubv(color_line);
-    immBegin(GPU_PRIM_LINES, 4);
-    immVertex3fv(pos, v3);
-    immVertex3fv(pos, v1);
-    immVertex3fv(pos, v4);
-    immVertex3fv(pos, v2);
-    immEnd();
-
-    if (loc_curr && (snap_elem_type & SCE_SNAP_MODE_EDGE_PERPENDICULAR)) {
-      /* Dashed line. */
-      immUnbindProgram();
-
-      immBindBuiltinProgram(GPU_SHADER_3D_LINE_DASHED_UNIFORM_COLOR);
-      float viewport_size[4];
-      GPU_viewport_size_get_f(viewport_size);
-      immUniform2f("viewport_size", viewport_size[2], viewport_size[3]);
-      immUniform1f("dash_width", 6.0f * U.pixelsize);
-      immUniform1f("dash_factor", 1.0f / 4.0f);
-      immUniformColor4ubv(color_line);
-
-      immBegin(GPU_PRIM_LINES, 2);
-      immVertex3fv(pos, loc_prev);
-      immVertex3fv(pos, loc_curr);
-      immEnd();
-    }
-  }
-
-  immUnbindProgram();
-}
-
-SnapObjectContext *ED_gizmotypes_snap_3d_context_ensure(Scene *scene, wmGizmo *gz)
-{
-  SnapGizmo3D *snap_gizmo = (SnapGizmo3D *)gz;
-  if (snap_gizmo->snap_context_v3d == NULL) {
-    snap_gizmo->snap_context_v3d = ED_transform_snap_object_context_create(scene, 0);
-  }
-  return snap_gizmo->snap_context_v3d;
+  ED_view3d_cursor_snap_activate_point();
+  return ED_view3d_cursor_snap_context_ensure(scene);
 }
 
-void ED_gizmotypes_snap_3d_flag_set(struct wmGizmo *gz, eSnapGizmo flag)
+void ED_gizmotypes_snap_3d_flag_set(struct wmGizmo *gz, int flag)
 {
   SnapGizmo3D *snap_gizmo = (SnapGizmo3D *)gz;
-  snap_gizmo->flag |= flag;
+  snap_gizmo->cursor_handle->flag |= flag;
 }
 
-void ED_gizmotypes_snap_3d_flag_clear(struct wmGizmo *gz, eSnapGizmo flag)
+void ED_gizmotypes_snap_3d_flag_clear(struct wmGizmo *gz, int flag)
 {
   SnapGizmo3D *snap_gizmo = (SnapGizmo3D *)gz;
-  snap_gizmo->flag &= ~flag;
+  snap_gizmo->cursor_handle->flag &= ~flag;
 }
 
-bool ED_gizmotypes_snap_3d_flag_test(struct wmGizmo *gz, eSnapGizmo flag)
+bool ED_gizmotypes_snap_3d_flag_test(struct wmGizmo *gz, int flag)
 {
   SnapGizmo3D *snap_gizmo = (SnapGizmo3D *)gz;
-  return (snap_gizmo->flag & flag) != 0;
+  return (snap_gizmo->cursor_handle->flag & flag) != 0;
 }
 
 bool ED_gizmotypes_snap_3d_invert_snap_get(struct wmGizmo *gz)
 {
-

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list