[Bf-blender-cvs] [f4ab36b] mesh-transfer-data: Clean up/slight rework of mesh islands data.

Bastien Montagne noreply at git.blender.org
Wed Oct 15 13:11:19 CEST 2014


Commit: f4ab36bd74adfee34e63b0294c8d5611791d2096
Author: Bastien Montagne
Date:   Tue Oct 14 15:23:36 2014 +0200
Branches: mesh-transfer-data
https://developer.blender.org/rBf4ab36bd74adfee34e63b0294c8d5611791d2096

Clean up/slight rework of mesh islands data.

Now it should be ready for future more generic usage - we might actually want to support
islands for arbitrary mesh elem types, not only loops for UVs/splitnors.

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

M	source/blender/blenkernel/BKE_mesh_mapping.h
M	source/blender/blenkernel/intern/mesh_mapping.c
M	source/blender/editors/object/object_transfer_data.c

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

diff --git a/source/blender/blenkernel/BKE_mesh_mapping.h b/source/blender/blenkernel/BKE_mesh_mapping.h
index b3410b6..cd8c800 100644
--- a/source/blender/blenkernel/BKE_mesh_mapping.h
+++ b/source/blender/blenkernel/BKE_mesh_mapping.h
@@ -137,32 +137,36 @@ int *BKE_mesh_calc_smoothgroups(
         int *r_totgroup, const bool use_bitflags);
 
 /* Loop islands data helpers. */
-/* TODO: this ended up being the same as MeshElemMap... Should we use this generic struct instead? */
-typedef struct MeshIslandItem {
-	int *polys_idx;
-	int nbr_polys;
-} MeshIslandItem;
-
-/* For loops, to which poly island each loop belongs.
- * Island definition can vary based on data type (UVs, loop normals, etc.). */
+enum {
+	MISLAND_TYPE_VERT = 1,
+	MISLAND_TYPE_EDGE = 2,
+	MISLAND_TYPE_POLY = 3,
+	MISLAND_TYPE_LOOP = 4,
+};
+
 typedef struct MeshIslands {
-	int nbr_loops;
-	int *loops_to_islands_idx;
+	short item_type;  /* MISLAND_TYPE_... */
+	short island_type;  /* MISLAND_TYPE_... */
+
+	int nbr_items;
+	int *items_to_islands_idx;
+
 	int nbr_islands;
-	MeshIslandItem *islands;  /* Array, one item per island. */
+	MeshElemMap *islands;  /* Array, one item per island. */
+
 	void *mem;  /* Memory handler, internal use only. */
 } MeshIslands;
 
-void BKE_loop_islands_init(MeshIslands *islands, const int num_loops);
+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_loops, int *loop_indices,
-                                 const int num_polys, int *poly_indices);
+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_island_compute_uv(struct DerivedMesh *dm, MeshIslands *r_islands);
+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. */
 
@@ -176,8 +180,9 @@ typedef struct Mesh2MeshMappingItem {
 
 /* All mapping computing func return this. */
 typedef struct Mesh2MeshMapping {
-	Mesh2MeshMappingItem *items;  /* Array, one item per dest element. */
 	int nbr_items;
+	Mesh2MeshMappingItem *items;  /* Array, one item per dest element. */
+
 	void *mem;  /* Memory handler, internal use only. */
 } Mesh2MeshMapping;
 
diff --git a/source/blender/blenkernel/intern/mesh_mapping.c b/source/blender/blenkernel/intern/mesh_mapping.c
index 409dad0..e52418c 100644
--- a/source/blender/blenkernel/intern/mesh_mapping.c
+++ b/source/blender/blenkernel/intern/mesh_mapping.c
@@ -384,25 +384,6 @@ void BKE_mesh_origindex_map_create(MeshElemMap **r_map, int **r_mem,
 typedef bool (*check_island_boundary)(const MPoly *mpoly, const MLoop *mloop, const MEdge *medge,
                                       const int nbr_egde_users);
 
-static bool bke_check_island_boundary_smooth(const MPoly *mp, const MLoop *UNUSED(ml), const MEdge *me,
-                                             const int nbr_egde_users)
-{
-	/* Edge is sharp if its poly is sharp, or edge itself is sharp, or edge is not used by exactly two polygons. */
-	return (!(mp->flag & ME_SMOOTH) || (me->flag & ME_SHARP) || (nbr_egde_users != 2));
-}
-
-/* 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 => boun dary 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 bke_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;
-}
-
 static 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,
@@ -554,6 +535,13 @@ static void bke_poly_loop_islands_compute(const MEdge *medge, const int totedge,
 	*r_poly_groups = poly_groups;
 }
 
+static bool bke_check_island_boundary_smooth(const MPoly *mp, const MLoop *UNUSED(ml), const MEdge *me,
+                                             const int nbr_egde_users)
+{
+	/* Edge is sharp if its poly is sharp, or edge itself is sharp, or edge is not used by exactly two polygons. */
+	return (!(mp->flag & ME_SMOOTH) || (me->flag & ME_SHARP) || (nbr_egde_users != 2));
+}
+
 /**
  * Calculate smooth groups from sharp edges.
  *
@@ -575,11 +563,20 @@ int *BKE_mesh_calc_smoothgroups(const MEdge *medge, const int totedge,
 	return poly_groups;
 }
 
-void BKE_loop_islands_init(MeshIslands *islands, const int num_loops)
+
+void BKE_loop_islands_init(MeshIslands *islands, const short item_type, const int num_items, const short island_type)
 {
-	islands->loops_to_islands_idx = MEM_mallocN(sizeof(*islands->loops_to_islands_idx) * (size_t)num_loops, __func__);
-	islands->islands = NULL;
+	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));
+
+	islands->item_type = item_type;
+	islands->nbr_items = num_items;
+	islands->items_to_islands_idx = MEM_mallocN(sizeof(*islands->items_to_islands_idx) * (size_t)num_items, __func__);
+
+	islands->island_type = island_type;
 	islands->nbr_islands = 0;
+	islands->islands = NULL;
+
 	islands->mem = NULL;
 }
 
@@ -590,34 +587,38 @@ void BKE_loop_islands_free(MeshIslands *islands)
 
 	if (i) {
 		while (i--) {
-			MeshIslandItem *it = &islands->islands[i];
-			if (it->nbr_polys) {
-				MEM_freeN(it->polys_idx);
+			MeshElemMap *it = &islands->islands[i];
+			if (it->count) {
+				MEM_freeN(it->indices);
 			}
 		}
 
 		MEM_freeN(islands->islands);
-		MEM_freeN(islands->loops_to_islands_idx);
+		MEM_freeN(islands->items_to_islands_idx);
 	}
 
-	islands->nbr_loops = 0;
-	islands->loops_to_islands_idx = NULL;
+	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;
 }
 
-void BKE_loop_islands_add_island(MeshIslands *islands, const int num_loops, int *loop_indices,
-                                 const int num_polys, int *poly_indices)
+void BKE_loop_islands_add_island(MeshIslands *islands, const int num_items, int *items_indices,
+                                 const int num_island_items, int *island_item_indices)
 {
-	MeshIslandItem *isl;
+	MeshElemMap *isl;
 	const int curr_island_idx = islands->nbr_islands++;
 	const size_t curr_num_islands = (size_t)islands->nbr_islands;
-	int i = num_loops;
+	int i = num_items;
 
-	islands->nbr_loops = num_loops;
+	islands->nbr_items = num_items;
 	while (i--) {
-		islands->loops_to_islands_idx[loop_indices[i]] = curr_island_idx;
+		islands->items_to_islands_idx[items_indices[i]] = curr_island_idx;
 	}
 
 	/* XXX TODO UGLY!!! Quick code, to be done better. */
@@ -629,14 +630,26 @@ void BKE_loop_islands_add_island(MeshIslands *islands, const int num_loops, int
 	islands->islands = isl;
 
 	isl = &isl[curr_island_idx];
-	isl->nbr_polys = num_polys;
-	isl->polys_idx = MEM_mallocN(sizeof(*isl->polys_idx) * (size_t)num_polys, __func__);
-	memcpy(isl->polys_idx, poly_indices, sizeof(*isl->polys_idx) * (size_t)num_polys);
+	isl->count = num_island_items;
+	isl->indices = MEM_mallocN(sizeof(*isl->indices) * (size_t)num_island_items, __func__);
+	memcpy(isl->indices, island_item_indices, sizeof(*isl->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 bke_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_island_compute_uv(struct DerivedMesh *dm, MeshIslands *r_islands)
+bool BKE_loop_poly_island_compute_uv(struct DerivedMesh *dm, MeshIslands *r_islands)
 {
 	MEdge *edges = dm->getEdgeArray(dm);
 	MPoly *polys = dm->getPolyArray(dm);
@@ -655,7 +668,7 @@ bool BKE_loop_island_compute_uv(struct DerivedMesh *dm, MeshIslands *r_islands)
 	int grp_idx, p_idx, pl_idx, l_idx;
 
 	BKE_loop_islands_free(r_islands);
-	BKE_loop_islands_init(r_islands, num_loops);
+	BKE_loop_islands_init(r_islands, MISLAND_TYPE_LOOP, num_loops, MISLAND_TYPE_POLY);
 
 	bke_poly_loop_islands_compute(edges, num_edges, polys, num_polys, loops, num_loops, false,
 	                              bke_check_island_boundary_uv, &poly_groups, &num_poly_groups);
@@ -1603,7 +1616,12 @@ void BKE_dm2mesh_mapping_loops_compute(
 			use_islands = gen_islands_src(dm_src, &islands);
 			num_trees = use_islands ? islands.nbr_islands : 1;
 			treedata = MEM_callocN(sizeof(*treedata) * (size_t)num_trees, __func__);
-			printf("num trees/islands: %d (%d)\n", num_trees, use_islands);
+
+			if (use_islands) {
+				/* We expect our islands to contain poly indices, and a mapping lo

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list