Commit: f88a54c1f168116d09bca9bfb60f4198806535be
Author: Campbell Barton
Date:   Mon Nov 17 14:09:15 2014 +0100
Branches: mesh-transfer-data
https://developer.blender.org/rBf88a54c1f168116d09bca9bfb60f4198806535be

cleanup: move island calculation back into mesh_mapping

also make uv-island computing take arrays instead of a derivedmesh.

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

M       source/blender/blenkernel/BKE_mesh_mapping.h
M       source/blender/blenkernel/BKE_mesh_remap.h
M       source/blender/blenkernel/intern/mesh_mapping.c
M       source/blender/blenkernel/intern/mesh_remap.c

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

diff --git a/source/blender/blenkernel/BKE_mesh_mapping.h 
b/source/blender/blenkernel/BKE_mesh_mapping.h
index af76e89..d6fa468 100644
--- a/source/blender/blenkernel/BKE_mesh_mapping.h
+++ b/source/blender/blenkernel/BKE_mesh_mapping.h
@@ -31,8 +31,9 @@
  *  \ingroup bke
  */
 
-struct MPoly;
+struct MVert;
 struct MEdge;
+struct MPoly;
 struct MLoop;
 struct MLoopUV;
 
@@ -126,7 +127,54 @@ void BKE_mesh_origindex_map_create(
         const int totorig,
         const int *final_origindex, const int totfinal);
 
-/* smoothgroups */
+
+/* islands */
+
+/* Loop islands data helpers. */
+enum {
+       MISLAND_TYPE_VERT = 1,
+       MISLAND_TYPE_EDGE = 2,
+       MISLAND_TYPE_POLY = 3,
+       MISLAND_TYPE_LOOP = 4,
+};
+
+typedef struct MeshIslands {
+       short item_type;  /* MISLAND_TYPE_... */
+       short island_type;  /* MISLAND_TYPE_... */
+
+       int nbr_items;
+       int *items_to_islands_idx;
+
+       int nbr_islands;
+       struct MeshElemMap **islands;  /* Array of pointers, one item per 
island. */
+
+       void *mem;  /* Memory handler, internal use only. */
+       size_t allocated_islands;
+} MeshIslands;
+
+void BKE_loop_islands_init(MeshIslands *islands, const short item_type, const 
int num_items, const short island_type);
+void BKE_loop_islands_free(MeshIslands *islands);
+void BKE_loop_islands_add_island(MeshIslands *islands, const int num_items, 
int *item_indices,
+                                 const int num_island_items, int 
*island_item_indices);
+
+typedef bool (*loop_island_compute)(
+        struct MVert *verts, const int totvert,
+        struct MEdge *edges, const int totedge,
+        struct MPoly *polys, const int totpoly,
+        struct MLoop *loops, const int totloop,
+        struct MeshIslands *r_islands);
+
+/* Above vert/UV mapping stuff does not do what we need here, but does things 
we do not need here.
+ * So better keep them separated for now, I think.
+ */
+bool BKE_loop_poly_island_compute_uv(
+        struct MVert *verts, const int totvert,
+        struct MEdge *edges, const int totedge,
+        struct MPoly *polys, const int totpoly,
+        struct MLoop *loops, const int totloop,
+        MeshIslands *r_islands);
+
+
 int *BKE_mesh_calc_smoothgroups(
         const struct MEdge *medge, const int totedge,
         const struct MPoly *mpoly, const int totpoly,
@@ -135,14 +183,14 @@ int *BKE_mesh_calc_smoothgroups(
 
 /** Callback deciding whether the given poly/loop/edge define an island 
boundary or not.
  */
-typedef bool (*check_island_boundary)(
+typedef bool (*MeshRemap_CheckIslandBoundary)(
         const struct MPoly *mpoly, const struct MLoop *mloop, const struct 
MEdge *medge,
         const int nbr_egde_users);
 
 void BKE_poly_loop_islands_compute(
         const struct MEdge *medge, const int totedge, const struct MPoly 
*mpoly, const int totpoly,
         const struct MLoop *mloop, const int totloop, const bool use_bitflags,
-        check_island_boundary edge_boundary_check,
+        MeshRemap_CheckIslandBoundary edge_boundary_check,
         int **r_poly_groups, int *r_totgroup);
 
 /* No good (portable) way to have exported inlined functions... */
diff --git a/source/blender/blenkernel/BKE_mesh_remap.h 
b/source/blender/blenkernel/BKE_mesh_remap.h
index 2b43ff6..535684b 100644
--- a/source/blender/blenkernel/BKE_mesh_remap.h
+++ b/source/blender/blenkernel/BKE_mesh_remap.h
@@ -29,39 +29,6 @@ struct DerivedMesh;
 struct MVert;
 struct MeshElemMap;
 
-/* Loop islands data helpers. */
-enum {
-       MISLAND_TYPE_VERT = 1,
-       MISLAND_TYPE_EDGE = 2,
-       MISLAND_TYPE_POLY = 3,
-       MISLAND_TYPE_LOOP = 4,
-};
-
-typedef struct MeshIslands {
-       short item_type;  /* MISLAND_TYPE_... */
-       short island_type;  /* MISLAND_TYPE_... */
-
-       int nbr_items;
-       int *items_to_islands_idx;
-
-       int nbr_islands;
-       struct MeshElemMap **islands;  /* Array of pointers, one item per 
island. */
-
-       void *mem;  /* Memory handler, internal use only. */
-       size_t allocated_islands;
-} MeshIslands;
-
-void BKE_loop_islands_init(MeshIslands *islands, const short item_type, const 
int num_items, const short island_type);
-void BKE_loop_islands_free(MeshIslands *islands);
-void BKE_loop_islands_add_island(MeshIslands *islands, const int num_items, 
int *item_indices,
-                                 const int num_island_items, int 
*island_item_indices);
-
-typedef bool (*loop_island_compute)(struct DerivedMesh *dm, MeshIslands 
*r_islands);
-/* Above vert/UV mapping stuff does not do what we need here, but does things 
we do not need here.
- * So better keep them separated for now, I think.
- */
-bool BKE_loop_poly_island_compute_uv(struct DerivedMesh *dm, MeshIslands 
*r_islands);
-
 /* Generic ways to map some geometry elements from a source mesh to a dest 
one. */
 
 typedef struct Mesh2MeshMappingItem {
diff --git a/source/blender/blenkernel/intern/mesh_mapping.c 
b/source/blender/blenkernel/intern/mesh_mapping.c
index 73533e0..b37be42 100644
--- a/source/blender/blenkernel/intern/mesh_mapping.c
+++ b/source/blender/blenkernel/intern/mesh_mapping.c
@@ -36,6 +36,7 @@
 
 #include "BKE_mesh_mapping.h"
 #include "BKE_customdata.h"
+#include "BLI_memarena.h"
 
 #include "BLI_strict_flags.h"
 
@@ -383,7 +384,7 @@ void BKE_mesh_origindex_map_create(MeshElemMap **r_map, int 
**r_mem,
 void BKE_poly_loop_islands_compute(
         const MEdge *medge, const int totedge, const MPoly *mpoly, const int 
totpoly,
         const MLoop *mloop, const int totloop, const bool use_bitflags,
-        check_island_boundary edge_boundary_check,
+        MeshRemap_CheckIslandBoundary edge_boundary_check,
         int **r_poly_groups, int *r_totgroup)
 {
        int *poly_groups;
@@ -532,7 +533,7 @@ void BKE_poly_loop_islands_compute(
        *r_poly_groups = poly_groups;
 }
 
-static bool poly_island_is_boundary_smooth_cb(
+static bool poly_is_island_boundary_smooth_cb(
         const MPoly *mp, const MLoop *UNUSED(ml), const MEdge *me,
         const int nbr_egde_users)
 {
@@ -556,8 +557,153 @@ int *BKE_mesh_calc_smoothgroups(const MEdge *medge, const 
int totedge,
        int *poly_groups = NULL;
 
        BKE_poly_loop_islands_compute(medge, totedge, mpoly, totpoly, mloop, 
totloop, use_bitflags,
-                                     poly_island_is_boundary_smooth_cb, 
&poly_groups, r_totgroup);
+                                     poly_is_island_boundary_smooth_cb, 
&poly_groups, r_totgroup);
 
        return poly_groups;
 }
+
+
+void BKE_loop_islands_init(MeshIslands *islands, const short item_type, const 
int num_items, const short island_type)
+{
+       MemArena *mem = BLI_memarena_new(BLI_MEMARENA_STD_BUFSIZE, __func__);
+
+       BLI_assert(ELEM(item_type, MISLAND_TYPE_VERT, MISLAND_TYPE_EDGE, 
MISLAND_TYPE_POLY, MISLAND_TYPE_LOOP));
+       BLI_assert(ELEM(island_type, MISLAND_TYPE_VERT, MISLAND_TYPE_EDGE, 
MISLAND_TYPE_POLY, MISLAND_TYPE_LOOP));
+
+       BKE_loop_islands_free(islands);
+
+       islands->item_type = item_type;
+       islands->nbr_items = num_items;
+       islands->items_to_islands_idx = BLI_memarena_alloc(mem, 
sizeof(*islands->items_to_islands_idx) * (size_t)num_items);
+
+       islands->island_type = island_type;
+       islands->allocated_islands = 64;
+       islands->islands = BLI_memarena_alloc(mem, sizeof(*islands->islands) * 
islands->allocated_islands);
+
+       islands->mem = mem;
+}
+
+void BKE_loop_islands_free(MeshIslands *islands)
+{
+       MemArena *mem = islands->mem;
+
+       if (mem) {
+               BLI_memarena_free(mem);
+       }
+
+       islands->item_type = 0;
+       islands->nbr_items = 0;
+       islands->items_to_islands_idx = NULL;
+
+       islands->island_type = 0;
+       islands->nbr_islands = 0;
+       islands->islands = NULL;
+
+       islands->mem = NULL;
+       islands->allocated_islands = 0;
+}
+
+void BKE_loop_islands_add_island(MeshIslands *islands, const int num_items, 
int *items_indices,
+                                 const int num_island_items, int 
*island_item_indices)
+{
+       MemArena *mem = islands->mem;
+
+       MeshElemMap *isld;
+       const int curr_island_idx = islands->nbr_islands++;
+       const size_t curr_num_islands = (size_t)islands->nbr_islands;
+       int i = num_items;
+
+       islands->nbr_items = num_items;
+       while (i--) {
+               islands->items_to_islands_idx[items_indices[i]] = 
curr_island_idx;
+       }
+
+       if (UNLIKELY(curr_num_islands > islands->allocated_islands)) {
+               MeshElemMap **islds;
+
+               islands->allocated_islands *= 2;
+               islds = BLI_memarena_alloc(mem, sizeof(*islds) * 
islands->allocated_islands);
+               memcpy(islds, islands->islands, sizeof(*islds) * 
(curr_num_islands - 1));
+               islands->islands = islds;
+       }
+
+       islands->islands[curr_island_idx] = isld = BLI_memarena_alloc(mem, 
sizeof(*isld));
+
+       isld->count = num_island_items;
+       isld->indices = BLI_memarena_alloc(mem, sizeof(*isld->indices) * 
(size_t)num_island_items);
+       memcpy(isld->indices, island_item_indices, sizeof(*isld->indices) * 
(size_t)num_island_items);
+}
+
+/* TODO: I'm not sure edge seam flag is enough to define UV islands? Maybe we 
should also consider UVmaps values
+ *       themselves (i.e. different UV-edges for a same mesh-edge => boundary 
edge too?).
+ *       Would make things much more complex though, and each UVMap would then 
need its own mesh mapping,
+ *       not sure we want that at all!
+ */
+static bool mesh_check_island_boundary_uv(
+        const MPoly *UNUSED(mp), const MLoop *UNUSED(ml), const MEdge *me,
+        const int UNUSED(nbr_egde_users))
+{
+       /* Edge is UV boundary if tagged as seam. */
+       return (me->flag & ME_SEAM) != 0;
+}
+
+/* Note: all this could be optimized... Not sure it would be worth the more 
complex code, though, those loops
+ *       are supposed to be really quick to do... */
+bool BKE_loop_poly_island_compute_uv(
+        MVert *UNUSED(verts), const int UNUSED(totvert),
+        MEdge *edges, const int totedge,
+        MPoly *polys, const int totpoly,
+        MLoop *loops, const int totloop,
+
+        MeshIslands *r_islands)
+{
+       int *poly_groups = NULL;
+       int num_poly_groups;
+
+       int *poly_indices = MEM_mallocN(sizeof(*poly_indices) * 
(size_t)totpoly, __func__);
+       int *loop_indices = MEM_mallocN(sizeof(*loop_indices) * 
(size_t)totloop, __func__);
+       int num_pidx, num_lidx;
+
+       int grp_idx, p_idx, pl_idx, l_idx;
+
+       BKE_loop_islands_free(r_islands);
+       BKE_loop_islands_init(r_islands, MISLAND_TYPE_LOOP, totloop, 
MISLAND_TYPE_POLY);
+
+       BKE_poly_loop_islands_compute(
+               edges, totedge, polys, totpoly, loops, totloop, false,
+       

@@ Diff output truncated at 10240 characters. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to