[Bf-blender-cvs] [9c025ba2917] temp-transform-conversions-split: Transform: Cleanup: Move Mesh conversion to its own header

mano-wii noreply at git.blender.org
Wed Sep 4 18:42:56 CEST 2019


Commit: 9c025ba2917470ef8670a20bdc22b17406c55d89
Author: mano-wii
Date:   Wed Sep 4 13:16:08 2019 -0300
Branches: temp-transform-conversions-split
https://developer.blender.org/rB9c025ba2917470ef8670a20bdc22b17406c55d89

Transform: Cleanup: Move Mesh conversion to its own header

Part of T68836

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

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

M	source/blender/editors/transform/CMakeLists.txt
M	source/blender/editors/transform/transform_conversions.c
A	source/blender/editors/transform/transform_conversions.h
A	source/blender/editors/transform/transform_conversions_mesh.c

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

diff --git a/source/blender/editors/transform/CMakeLists.txt b/source/blender/editors/transform/CMakeLists.txt
index 9696f0fb315..91ba72e8517 100644
--- a/source/blender/editors/transform/CMakeLists.txt
+++ b/source/blender/editors/transform/CMakeLists.txt
@@ -41,6 +41,7 @@ set(SRC
   transform.c
   transform_constraints.c
   transform_conversions.c
+  transform_conversions_mesh.c
   transform_generics.c
   transform_gizmo_2d.c
   transform_gizmo_3d.c
@@ -52,6 +53,7 @@ set(SRC
   transform_snap_object.c
 
   transform.h
+  transform_conversions.h
 )
 
 set(LIB
diff --git a/source/blender/editors/transform/transform_conversions.c b/source/blender/editors/transform/transform_conversions.c
index 611992c1d3c..242d0ce2bab 100644
--- a/source/blender/editors/transform/transform_conversions.c
+++ b/source/blender/editors/transform/transform_conversions.c
@@ -48,7 +48,6 @@
 #include "BLI_math.h"
 #include "BLI_utildefines.h"
 #include "BLI_listbase.h"
-#include "BLI_linklist_stack.h"
 #include "BLI_string.h"
 #include "BLI_bitmap.h"
 #include "BLI_rect.h"
@@ -59,7 +58,6 @@
 #include "BKE_armature.h"
 #include "BKE_constraint.h"
 #include "BKE_context.h"
-#include "BKE_crazyspace.h"
 #include "BKE_curve.h"
 #include "BKE_fcurve.h"
 #include "BKE_global.h"
@@ -116,7 +114,7 @@
 #include "DEG_depsgraph_query.h"
 
 #include "transform.h"
-#include "bmesh.h"
+#include "transform_conversions.h"
 
 /**
  * Transforming around ourselves is no use, fallback to individual origins,
@@ -131,12 +129,6 @@ static void transform_around_single_fallback(TransInfo *t)
   }
 }
 
-/* when transforming islands */
-struct TransIslandData {
-  float co[3];
-  float axismtx[3][3];
-};
-
 /* local function prototype - for Object/Bone Constraints */
 static bool constraints_list_needinv(TransInfo *t, ListBase *list);
 
@@ -2613,694 +2605,6 @@ void flushTransParticles(TransInfo *t)
   }
 }
 
-/* ********************* mesh ****************** */
-
-static bool bmesh_test_dist_add(BMVert *v,
-                                BMVert *v_other,
-                                float *dists,
-                                const float *dists_prev,
-                                /* optionally track original index */
-                                int *index,
-                                const int *index_prev,
-                                float mtx[3][3])
-{
-  if ((BM_elem_flag_test(v_other, BM_ELEM_SELECT) == 0) &&
-      (BM_elem_flag_test(v_other, BM_ELEM_HIDDEN) == 0)) {
-    const int i = BM_elem_index_get(v);
-    const int i_other = BM_elem_index_get(v_other);
-    float vec[3];
-    float dist_other;
-    sub_v3_v3v3(vec, v->co, v_other->co);
-    mul_m3_v3(mtx, vec);
-
-    dist_other = dists_prev[i] + len_v3(vec);
-    if (dist_other < dists[i_other]) {
-      dists[i_other] = dist_other;
-      if (index != NULL) {
-        index[i_other] = index_prev[i];
-      }
-      return true;
-    }
-  }
-
-  return false;
-}
-
-/**
- * \param mtx: Measure distance in this space.
- * \param dists: Store the closest connected distance to selected vertices.
- * \param index: Optionally store the original index we're measuring the distance to (can be NULL).
- */
-static void editmesh_set_connectivity_distance(BMesh *bm,
-                                               float mtx[3][3],
-                                               float *dists,
-                                               int *index)
-{
-  BLI_LINKSTACK_DECLARE(queue, BMVert *);
-
-  /* any BM_ELEM_TAG'd vertex is in 'queue_next', so we don't add in twice */
-  BLI_LINKSTACK_DECLARE(queue_next, BMVert *);
-
-  BLI_LINKSTACK_INIT(queue);
-  BLI_LINKSTACK_INIT(queue_next);
-
-  {
-    BMIter viter;
-    BMVert *v;
-    int i;
-
-    BM_ITER_MESH_INDEX (v, &viter, bm, BM_VERTS_OF_MESH, i) {
-      float dist;
-      BM_elem_index_set(v, i); /* set_inline */
-      BM_elem_flag_disable(v, BM_ELEM_TAG);
-
-      if (BM_elem_flag_test(v, BM_ELEM_SELECT) == 0 || BM_elem_flag_test(v, BM_ELEM_HIDDEN)) {
-        dist = FLT_MAX;
-        if (index != NULL) {
-          index[i] = i;
-        }
-      }
-      else {
-        BLI_LINKSTACK_PUSH(queue, v);
-        dist = 0.0f;
-        if (index != NULL) {
-          index[i] = i;
-        }
-      }
-
-      dists[i] = dist;
-    }
-    bm->elem_index_dirty &= ~BM_VERT;
-  }
-
-  /* need to be very careful of feedback loops here, store previous dist's to avoid feedback */
-  float *dists_prev = MEM_dupallocN(dists);
-  int *index_prev = MEM_dupallocN(index); /* may be NULL */
-
-  do {
-    BMVert *v;
-    LinkNode *lnk;
-
-    /* this is correct but slow to do each iteration,
-     * instead sync the dist's while clearing BM_ELEM_TAG (below) */
-#if 0
-    memcpy(dists_prev, dists, sizeof(float) * bm->totvert);
-#endif
-
-    while ((v = BLI_LINKSTACK_POP(queue))) {
-      BLI_assert(dists[BM_elem_index_get(v)] != FLT_MAX);
-
-      /* connected edge-verts */
-      if (v->e != NULL) {
-        BMEdge *e_iter, *e_first;
-
-        e_iter = e_first = v->e;
-
-        /* would normally use BM_EDGES_OF_VERT, but this runs so often,
-         * its faster to iterate on the data directly */
-        do {
-
-          if (BM_elem_flag_test(e_iter, BM_ELEM_HIDDEN) == 0) {
-
-            /* edge distance */
-            {
-              BMVert *v_other = BM_edge_other_vert(e_iter, v);
-              if (bmesh_test_dist_add(v, v_other, dists, dists_prev, index, index_prev, mtx)) {
-                if (BM_elem_flag_test(v_other, BM_ELEM_TAG) == 0) {
-                  BM_elem_flag_enable(v_other, BM_ELEM_TAG);
-                  BLI_LINKSTACK_PUSH(queue_next, v_other);
-                }
-              }
-            }
-
-            /* face distance */
-            if (e_iter->l) {
-              BMLoop *l_iter_radial, *l_first_radial;
-              /**
-               * imaginary edge diagonally across quad,
-               * \note, this takes advantage of the rules of winding that we
-               * know 2 or more of a verts edges wont reference the same face twice.
-               * Also, if the edge is hidden, the face will be hidden too.
-               */
-              l_iter_radial = l_first_radial = e_iter->l;
-
-              do {
-                if ((l_iter_radial->v == v) && (l_iter_radial->f->len == 4) &&
-                    (BM_elem_flag_test(l_iter_radial->f, BM_ELEM_HIDDEN) == 0)) {
-                  BMVert *v_other = l_iter_radial->next->next->v;
-                  if (bmesh_test_dist_add(v, v_other, dists, dists_prev, index, index_prev, mtx)) {
-                    if (BM_elem_flag_test(v_other, BM_ELEM_TAG) == 0) {
-                      BM_elem_flag_enable(v_other, BM_ELEM_TAG);
-                      BLI_LINKSTACK_PUSH(queue_next, v_other);
-                    }
-                  }
-                }
-              } while ((l_iter_radial = l_iter_radial->radial_next) != l_first_radial);
-            }
-          }
-        } while ((e_iter = BM_DISK_EDGE_NEXT(e_iter, v)) != e_first);
-      }
-    }
-
-    /* clear for the next loop */
-    for (lnk = queue_next; lnk; lnk = lnk->next) {
-      BMVert *v_link = lnk->link;
-      const int i = BM_elem_index_get(v_link);
-
-      BM_elem_flag_disable(v_link, BM_ELEM_TAG);
-
-      /* keep in sync, avoid having to do full memcpy each iteration */
-      dists_prev[i] = dists[i];
-      if (index != NULL) {
-        index_prev[i] = index[i];
-      }
-    }
-
-    BLI_LINKSTACK_SWAP(queue, queue_next);
-
-    /* none should be tagged now since 'queue_next' is empty */
-    BLI_assert(BM_iter_mesh_count_flag(BM_VERTS_OF_MESH, bm, BM_ELEM_TAG, true) == 0);
-
-  } while (BLI_LINKSTACK_SIZE(queue));
-
-  BLI_LINKSTACK_FREE(queue);
-  BLI_LINKSTACK_FREE(queue_next);
-
-  MEM_freeN(dists_prev);
-  if (index_prev != NULL) {
-    MEM_freeN(index_prev);
-  }
-}
-
-static struct TransIslandData *editmesh_islands_info_calc(BMEditMesh *em,
-                                                          int *r_island_tot,
-                                                          int **r_island_vert_map,
-                                                          bool calc_single_islands)
-{
-  BMesh *bm = em->bm;
-  struct TransIslandData *trans_islands;
-  char htype;
-  char itype;
-  int i;
-
-  /* group vars */
-  int *groups_array;
-  int(*group_index)[2];
-  int group_tot;
-  void **ele_array;
-
-  int *vert_map;
-
-  if (em->selectmode & (SCE_SELECT_VERTEX | SCE_SELECT_EDGE)) {
-    groups_array = MEM_mallocN(sizeof(*groups_array) * bm->totedgesel, __func__);
-    group_tot = BM_mesh_calc_edge_groups(
-        bm, groups_array, &group_index, NULL, NULL, BM_ELEM_SELECT);
-
-    htype = BM_EDGE;
-    itype = BM_VERTS_OF_EDGE;
-  }
-  else { /* (bm->selectmode & SCE_SELECT_FACE) */
-    groups_array = MEM_mallocN(sizeof(*groups_array) * bm->totfacesel, __func__);
-    group_tot = BM_mesh_calc_face_groups(
-        bm, groups_array, &group_index, NULL, NULL, BM_ELEM_SELECT, BM_VERT);
-
-    htype = BM_FACE;
-    itype = BM_VERTS_OF_FACE;
-  }
-
-  trans_islands = MEM_mallocN(sizeof(*trans_islands) * group_tot, __func__);
-
-  vert_map = MEM_mallocN(sizeof(*vert_map) * bm->totvert, __func__);
-  /* we shouldn't need this, but with incorrect selection flushing
-   * its possible we have a selected vertex that's not in a face,
-   * for now best not crash in that case. */
-  copy_vn_i(vert_map, bm->totvert, -1);
-
-  BM_mesh_elem_table_ensure(bm, htype);
-  ele_array = (htype == BM_FACE) ? (void **)bm->ftable : (void **)bm->etable;
-
-  BM_mesh_elem_index_ensure(bm, BM_VERT);
-
-  /* may be an edge OR a face array */
-  for (i = 0; i < group_tot; i++) {
-    BMEditSelection ese = {NULL};
-
-    const int fg_sta = group_index[i][0];
-    const int fg_len = group_index[i][1];
-    float co[3], no[3], tangent[3];
-    int j;
-
-    zero_v3(co);
-    zero_v3(no);
-    zero_v3(tangent);
-
-    ese.htype = htype;
-
-    /* loop on each face in this group:
-     * - assign r_vert_map
-     * - calculate (co, no)
-     */
-    for (j = 0; j < fg_len; j++) {
-      float tmp_co[3], tmp_no[3], tmp_tangent[3];
-
-      ese.ele = ele_array[groups_array[fg_sta + j]];
-
-      BM_editselection_center(&ese, tmp_co);
-      BM_editsel

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list