[Bf-blender-cvs] [be60b3b2398] master: Transform: Grid snap target refactor

Germano Cavalcante noreply at git.blender.org
Mon Feb 8 14:01:17 CET 2021


Commit: be60b3b23984ff7a9b973a37800522e4b5e7918f
Author: Germano Cavalcante
Date:   Fri Feb 5 11:01:30 2021 -0300
Branches: master
https://developer.blender.org/rBbe60b3b23984ff7a9b973a37800522e4b5e7918f

Transform: Grid snap target refactor

The code takes many turns to get a suitable "target" for the snap to grid.

Perhaps there were other reasons awaited for `transformCenter_from_type`
and `TransCenterData center_cache[5]`.

But since nothing is defined, it is better to simplify the code.

No user functional changes

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

M	source/blender/editors/transform/transform.h
M	source/blender/editors/transform/transform_convert.c
M	source/blender/editors/transform/transform_generics.c
M	source/blender/editors/transform/transform_snap.c

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

diff --git a/source/blender/editors/transform/transform.h b/source/blender/editors/transform/transform.h
index 72f43a14b11..9ee0aa1d6da 100644
--- a/source/blender/editors/transform/transform.h
+++ b/source/blender/editors/transform/transform.h
@@ -166,8 +166,10 @@ typedef enum {
 typedef enum {
   SNAP_FORCED = 1 << 0,
   TARGET_INIT = 1 << 1,
-  POINT_INIT = 1 << 2,
-  MULTI_POINTS = 1 << 3,
+  /* Special flag for snap to grid. */
+  TARGET_GRID_INIT = 1 << 2,
+  POINT_INIT = 1 << 3,
+  MULTI_POINTS = 1 << 4,
 } eTSnap;
 
 /** #TransCon.mode, #TransInfo.con.mode */
@@ -310,6 +312,7 @@ typedef struct TransSnap {
   float snapPoint[3];
   /** to this point (in global-space). */
   float snapTarget[3];
+  float snapTargetGrid[3];
   float snapNormal[3];
   char snapNodeBorder;
   ListBase points;
@@ -539,9 +542,6 @@ typedef struct TransInfo {
   float center_global[3];
   /** center in screen coordinates. */
   float center2d[2];
-  /* Lazy initialize center data for when we need other center values.
-   * V3D_AROUND_ACTIVE + 1 (static assert checks this) */
-  TransCenterData center_cache[5];
   /** maximum index on the input vector. */
   short idx_max;
   /** Snapping Gears. */
@@ -764,7 +764,6 @@ void recalcData(TransInfo *t);
 void calculateCenter2D(TransInfo *t);
 void calculateCenterLocal(TransInfo *t, const float center_global[3]);
 
-const TransCenterData *transformCenter_from_type(TransInfo *t, int around);
 void calculateCenter(TransInfo *t);
 
 /* API functions for getting center points */
diff --git a/source/blender/editors/transform/transform_convert.c b/source/blender/editors/transform/transform_convert.c
index 0770f39453e..8942a3a319b 100644
--- a/source/blender/editors/transform/transform_convert.c
+++ b/source/blender/editors/transform/transform_convert.c
@@ -993,10 +993,6 @@ void createTransData(bContext *C, TransInfo *t)
     else {
       convert_type = TC_CURSOR_VIEW3D;
     }
-
-    /* Since we're transforming the cursor, initialize this value before it's modified.
-     * Needed for #snap_grid_apply to access the cursor location. */
-    transformCenter_from_type(t, V3D_AROUND_CURSOR);
   }
   else if (!(t->options & CTX_PAINT_CURVE) && (t->spacetype == SPACE_VIEW3D) && ob &&
            (ob->mode == OB_MODE_SCULPT) && ob->sculpt) {
diff --git a/source/blender/editors/transform/transform_generics.c b/source/blender/editors/transform/transform_generics.c
index e181593d28a..d230670993c 100644
--- a/source/blender/editors/transform/transform_generics.c
+++ b/source/blender/editors/transform/transform_generics.c
@@ -1184,13 +1184,6 @@ void calculateCenter(TransInfo *t)
   }
   calculateCenterLocal(t, t->center_global);
 
-  /* avoid calculating again */
-  {
-    TransCenterData *cd = &t->center_cache[t->around];
-    copy_v3_v3(cd->global, t->center_global);
-    cd->is_set = true;
-  }
-
   calculateCenter2D(t);
 
   /* For panning from the camera-view. */
@@ -1237,23 +1230,6 @@ void calculateCenter(TransInfo *t)
   }
 }
 
-BLI_STATIC_ASSERT(ARRAY_SIZE(((TransInfo *)NULL)->center_cache) == (V3D_AROUND_ACTIVE + 1),
-                  "test size");
-
-/**
- * Lazy initialize transform center data, when we need to access center values from other types.
- */
-const TransCenterData *transformCenter_from_type(TransInfo *t, int around)
-{
-  BLI_assert(around <= V3D_AROUND_ACTIVE);
-  TransCenterData *cd = &t->center_cache[around];
-  if (cd->is_set == false) {
-    calculateCenter_FromAround(t, around, cd->global);
-    cd->is_set = true;
-  }
-  return cd;
-}
-
 void calculatePropRatio(TransInfo *t)
 {
   int i;
diff --git a/source/blender/editors/transform/transform_snap.c b/source/blender/editors/transform/transform_snap.c
index 575c736cf51..8500ff25a1f 100644
--- a/source/blender/editors/transform/transform_snap.c
+++ b/source/blender/editors/transform/transform_snap.c
@@ -926,6 +926,64 @@ static void CalcSnapGeometry(TransInfo *t, float *UNUSED(vec))
 /** \name Target
  * \{ */
 
+static void snap_target_median_impl(TransInfo *t, float r_median[3])
+{
+  int i_accum = 0;
+
+  zero_v3(r_median);
+
+  FOREACH_TRANS_DATA_CONTAINER (t, tc) {
+    TransData *td = tc->data;
+    int i;
+    float v[3];
+    zero_v3(v);
+
+    for (i = 0; i < tc->data_len && td->flag & TD_SELECTED; i++, td++) {
+      add_v3_v3(v, td->center);
+    }
+
+    if (i == 0) {
+      /* Is this possible? */
+      continue;
+    }
+
+    mul_v3_fl(v, 1.0 / i);
+
+    if (tc->use_local_mat) {
+      mul_m4_v3(tc->mat, v);
+    }
+
+    add_v3_v3(r_median, v);
+    i_accum++;
+  }
+
+  mul_v3_fl(r_median, 1.0 / i_accum);
+
+  // TargetSnapOffset(t, NULL);
+}
+
+static void snap_target_grid_ensure(TransInfo *t)
+{
+  /* Only need to calculate once. */
+  if ((t->tsnap.status & TARGET_GRID_INIT) == 0) {
+    if (t->data_type == TC_CURSOR_VIEW3D) {
+      /* Use a fallback when transforming the cursor.
+       * In this case the center is _not_ derived from the cursor which is being transformed. */
+      copy_v3_v3(t->tsnap.snapTargetGrid, TRANS_DATA_CONTAINER_FIRST_SINGLE(t)->data->iloc);
+    }
+    else if (t->around == V3D_AROUND_CURSOR) {
+      /* Use a fallback for cursor selection,
+       * this isn't useful as a global center for absolute grid snapping
+       * since its not based on the position of the selection. */
+      snap_target_median_impl(t, t->tsnap.snapTargetGrid);
+    }
+    else {
+      copy_v3_v3(t->tsnap.snapTargetGrid, t->center_global);
+    }
+    t->tsnap.status |= TARGET_GRID_INIT;
+  }
+}
+
 static void TargetSnapOffset(TransInfo *t, TransData *td)
 {
   if (t->spacetype == SPACE_NODE && td != NULL) {
@@ -997,41 +1055,7 @@ static void TargetSnapMedian(TransInfo *t)
 {
   /* Only need to calculate once. */
   if ((t->tsnap.status & TARGET_INIT) == 0) {
-    int i_accum = 0;
-
-    t->tsnap.snapTarget[0] = 0;
-    t->tsnap.snapTarget[1] = 0;
-    t->tsnap.snapTarget[2] = 0;
-
-    FOREACH_TRANS_DATA_CONTAINER (t, tc) {
-      TransData *td = tc->data;
-      int i;
-      float v[3];
-      zero_v3(v);
-
-      for (i = 0; i < tc->data_len && td->flag & TD_SELECTED; i++, td++) {
-        add_v3_v3(v, td->center);
-      }
-
-      if (i == 0) {
-        /* Is this possible? */
-        continue;
-      }
-
-      mul_v3_fl(v, 1.0 / i);
-
-      if (tc->use_local_mat) {
-        mul_m4_v3(tc->mat, v);
-      }
-
-      add_v3_v3(t->tsnap.snapTarget, v);
-      i_accum++;
-    }
-
-    mul_v3_fl(t->tsnap.snapTarget, 1.0 / i_accum);
-
-    TargetSnapOffset(t, NULL);
-
+    snap_target_median_impl(t, t->tsnap.snapTarget);
     t->tsnap.status |= TARGET_INIT;
   }
 }
@@ -1431,28 +1455,10 @@ static void snap_grid_apply(
     TransInfo *t, const int max_index, const float grid_dist, const float loc[3], float r_out[3])
 {
   BLI_assert(max_index <= 2);
-  const float *center_global = t->center_global;
+  snap_target_grid_ensure(t);
+  const float *center_global = t->tsnap.snapTargetGrid;
   const float *asp = t->aspect;
 
-  if (t->options & CTX_CURSOR) {
-    /* Note that we must already have called #transformCenter_from_type, otherwise
-     * we would be lazy-initializing data which is being transformed,
-     * causing the transformed cursor location to be used instead of it's initial location. */
-    BLI_assert(t->center_cache[V3D_AROUND_CURSOR].is_set);
-
-    /* Use a fallback when transforming the cursor.
-     * In this case the center is _not_ derived from the cursor which is being transformed. */
-    const TransCenterData *cd = transformCenter_from_type(t, V3D_AROUND_CURSOR);
-    center_global = cd->global;
-  }
-  else if (t->around == V3D_AROUND_CURSOR) {
-    /* Use a fallback for cursor selection,
-     * this isn't useful as a global center for absolute grid snapping
-     * since its not based on the position of the selection. */
-    const TransCenterData *cd = transformCenter_from_type(t, V3D_AROUND_CENTER_MEDIAN);
-    center_global = cd->global;
-  }
-
   float in[3];
   if (t->con.mode & CON_APPLY) {
     BLI_assert(t->tsnap.snapElem == 0);



More information about the Bf-blender-cvs mailing list