[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [53092] trunk/blender/source/blender: uv edge based stitch.

Antony Riakiotakis kalast at gmail.com
Mon Dec 17 21:14:13 CET 2012


Revision: 53092
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=53092
Author:   psy-fi
Date:     2012-12-17 20:14:07 +0000 (Mon, 17 Dec 2012)
Log Message:
-----------
uv edge based stitch. Useful to disambiguate betwen islands
 when uvs are shared by more than two islands. Uv edges
 usually belong to only two islands, making for much cleaner
 stitches. To change between stitch modes, press TAB.
 Initial mode depends on the selection mode of the image
 editor. Documentation can also be found on the release wiki

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/BKE_mesh.h
    trunk/blender/source/blender/editors/mesh/editmesh_utils.c
    trunk/blender/source/blender/editors/uvedit/uvedit_smart_stitch.c

Modified: trunk/blender/source/blender/blenkernel/BKE_mesh.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_mesh.h	2012-12-17 20:00:02 UTC (rev 53091)
+++ trunk/blender/source/blender/blenkernel/BKE_mesh.h	2012-12-17 20:14:07 UTC (rev 53092)
@@ -229,8 +229,6 @@
 	/* Next UvElement corresponding to same vertex */
 	struct UvElement *next;
 	/* Face the element belongs to */
-	struct BMFace *face;
-	/* Index in the editFace of the uv */
 	struct BMLoop *l;
 	/* index in loop. */
 	unsigned short tfindex;

Modified: trunk/blender/source/blender/editors/mesh/editmesh_utils.c
===================================================================
--- trunk/blender/source/blender/editors/mesh/editmesh_utils.c	2012-12-17 20:00:02 UTC (rev 53091)
+++ trunk/blender/source/blender/editors/mesh/editmesh_utils.c	2012-12-17 20:14:07 UTC (rev 53092)
@@ -876,7 +876,6 @@
 		if (!selected || ((!BM_elem_flag_test(efa, BM_ELEM_HIDDEN)) && BM_elem_flag_test(efa, BM_ELEM_SELECT))) {
 			BM_ITER_ELEM_INDEX (l, &liter, efa, BM_LOOPS_OF_FACE, i) {
 				buf->l = l;
-				buf->face = efa;
 				buf->separate = 0;
 				buf->island = INVALID_ISLAND;
 				buf->tfindex = i;
@@ -948,7 +947,7 @@
 		for (i = 0; i < totuv; i++) {
 			if (element_map->buf[i].island == INVALID_ISLAND) {
 				element_map->buf[i].island = nislands;
-				stack[0] = element_map->buf[i].face;
+				stack[0] = element_map->buf[i].l->f;
 				island_number[BM_elem_index_get(stack[0])] = nislands;
 				stacksize = 1;
 
@@ -962,12 +961,11 @@
 							if (element->separate)
 								initelement = element;
 
-							if (element->face == efa) {
+							if (element->l->f == efa) {
 								/* found the uv corresponding to our face and vertex. Now fill it to the buffer */
 								element->island = nislands;
 								map[element - element_map->buf] = islandbufsize;
 								islandbuf[islandbufsize].l = element->l;
-								islandbuf[islandbufsize].face = element->face;
 								islandbuf[islandbufsize].separate = element->separate;
 								islandbuf[islandbufsize].tfindex = element->tfindex;
 								islandbuf[islandbufsize].island =  nislands;
@@ -977,9 +975,9 @@
 									if (element->separate && element != initelement)
 										break;
 
-									if (island_number[BM_elem_index_get(element->face)] == INVALID_ISLAND) {
-										stack[stacksize++] = element->face;
-										island_number[BM_elem_index_get(element->face)] = nislands;
+									if (island_number[BM_elem_index_get(element->l->f)] == INVALID_ISLAND) {
+										stack[stacksize++] = element->l->f;
+										island_number[BM_elem_index_get(element->l->f)] = nislands;
 									}
 								}
 								break;
@@ -1060,7 +1058,7 @@
 	element = map->vert[BM_elem_index_get(l->v)];
 
 	for (; element; element = element->next)
-		if (element->face == efa)
+		if (element->l->f == efa)
 			return element;
 
 	return NULL;

Modified: trunk/blender/source/blender/editors/uvedit/uvedit_smart_stitch.c
===================================================================
--- trunk/blender/source/blender/editors/uvedit/uvedit_smart_stitch.c	2012-12-17 20:00:02 UTC (rev 53091)
+++ trunk/blender/source/blender/editors/uvedit/uvedit_smart_stitch.c	2012-12-17 20:14:07 UTC (rev 53092)
@@ -72,24 +72,24 @@
 
 /* ********************** smart stitch operator *********************** */
 
-/* object that stores display data for previewing before accepting stitching */
+/* object that stores display data for previewing before confirming stitching */
 typedef struct StitchPreviewer {
-	/* here we'll store the preview triangle indices of the mesh */
-	float *preview_polys;
-	/* uvs per polygon. */
-	unsigned int *uvs_per_polygon;
-	/*number of preview polygons */
-	unsigned int num_polys;
-	/* preview data. These will be either the previewed vertices or edges depending on stitch mode settings */
-	float *preview_stitchable;
-	float *preview_unstitchable;
-	/* here we'll store the number of elements to be drawn */
-	unsigned int num_stitchable;
-	unsigned int num_unstitchable;
-	unsigned int preview_uvs;
-	/* ...and here we'll store the triangles*/
-	float *static_tris;
-	unsigned int num_static_tris;
+		/* here we'll store the preview triangle indices of the mesh */
+		float *preview_polys;
+		/* uvs per polygon. */
+		unsigned int *uvs_per_polygon;
+		/*number of preview polygons */
+		unsigned int num_polys;
+		/* preview data. These will be either the previewed vertices or edges depending on stitch mode settings */
+		float *preview_stitchable;
+		float *preview_unstitchable;
+		/* here we'll store the number of elements to be drawn */
+		unsigned int num_stitchable;
+		unsigned int num_unstitchable;
+		unsigned int preview_uvs;
+		/* ...and here we'll store the static island triangles*/
+		float *static_tris;
+		unsigned int num_static_tris;
 } StitchPreviewer;
 
 
@@ -98,85 +98,96 @@
 /* This is a straightforward implementation, count the uv's in the island that will move and take the mean displacement/rotation and apply it to all
  * elements of the island except from the stitchable */
 typedef struct IslandStitchData {
-	/* rotation can be used only for edges, for vertices there is no such notion */
-	float rotation;
-	float translation[2];
-	/* Used for rotation, the island will rotate around this point */
-	float medianPoint[2];
-	int numOfElements;
-	int num_rot_elements;
-	/* flag to remember if island has been added for preview */
-	char addedForPreview;
-	/* flag an island to be considered for determining static island */
-	char stitchableCandidate;
-	/* if edge rotation is used, flag so that vertex rotation is not used */
-	char use_edge_rotation;
+		/* rotation can be used only for edges, for vertices there is no such notion */
+		float rotation;
+		float translation[2];
+		/* Used for rotation, the island will rotate around this point */
+		float medianPoint[2];
+		int numOfElements;
+		int num_rot_elements;
+		/* flag to remember if island has been added for preview */
+		char addedForPreview;
+		/* flag an island to be considered for determining static island */
+		char stitchableCandidate;
+		/* if edge rotation is used, flag so that vertex rotation is not used */
+		char use_edge_rotation;
 } IslandStitchData;
 
 /* just for averaging UVs */
 typedef struct UVVertAverage {
-	float uv[2];
-	unsigned short count;
+		float uv[2];
+		unsigned short count;
 } UVVertAverage;
 
 typedef struct UvEdge {
-	/* index to uv buffer */
-	unsigned int uv1;
-	unsigned int uv2;
-	/* general use flag (Used to check if edge is boundary here, and propagates to adjacency elements) */
-	char flag;
-	/* element that guarantees element->face has the face on element->tfindex and element->tfindex+1 is the second uv */
-	UvElement *element;
+		/* index to uv buffer */
+		unsigned int uv1;
+		unsigned int uv2;
+		/* general use flag (Used to check if edge is boundary here, and propagates to adjacency elements) */
+		unsigned char flag;
+		/* element that guarantees element->face has the edge on element->tfindex and element->tfindex+1 is the second uv */
+		UvElement *element;
+		/* next uv edge with the same exact vertices as this one.. Calculated at startup to save time */
+		struct UvEdge *next;
+		/* point to first of common edges. Needed for iteration */
+		struct UvEdge *first;
 } UvEdge;
 
 
 /* stitch state object */
 typedef struct StitchState {
-	/* use limit flag */
-	char use_limit;
-	/* limit to operator, same as original operator */
-	float limit_dist;
-	/* snap uv islands together during stitching */
-	char snap_islands;
-	/* stich at midpoints or at islands */
-	char midpoints;
-	/* editmesh, cached for use in modal handler */
-	BMEditMesh *em;
-	/* clear seams of stitched edges after stitch */
-	char clear_seams;
-	/* element map for getting info about uv connectivity */
-	UvElementMap *element_map;
-	/* edge container */
-	UvEdge *uvedges;
-	/* container of first of a group of coincident uvs, these will be operated upon */
-	UvElement **uvs;
-	/* maps uvelements to their first coincident uv */
-	int *map;
-	/* 2D normals per uv to calculate rotation for snapping */
-	float *normals;
-	/* edge storage */
-	UvEdge *edges;
+		/* use limit flag */
+		char use_limit;
+		/* limit to operator, same as original operator */
+		float limit_dist;
+		/* snap uv islands together during stitching */
+		char snap_islands;
+		/* stich at midpoints or at islands */
+		char midpoints;
+		/* editmesh, cached for use in modal handler */
+		BMEditMesh *em;
+		/* clear seams of stitched edges after stitch */
+		char clear_seams;
+		/* element map for getting info about uv connectivity */
+		UvElementMap *element_map;
+		/* edge container */
+		UvEdge *uvedges;
+		/* container of first of a group of coincident uvs, these will be operated upon */
+		UvElement **uvs;
+		/* maps uvelements to their first coincident uv */
+		int *map;
+		/* 2D normals per uv to calculate rotation for snapping */
+		float *normals;
+		/* edge storage */
+		UvEdge *edges;
+		/* hash for quick lookup of edges */
+		GHash *edge_hash;
 
-	/* count of separate uvs and edges */
-	int total_boundary_edges;
-	int total_separate_uvs;
-	/* hold selection related information */
-	UvElement **selection_stack;
-	int selection_size;
-	/* island that stays in place */
-	int static_island;
-	/* store number of primitives per face so that we can allocate the active island buffer later */
-	unsigned int *tris_per_island;
+		/* count of separate uvs and edges */
+		int total_separate_edges;
+		int total_separate_uvs;
+		/* hold selection related information */
+		void **selection_stack;
+		int selection_size;
+		/* island that stays in place */
+		int static_island;
+		/* store number of primitives per face so that we can allocate the active island buffer later */
+		unsigned int *tris_per_island;
 
-	void *draw_handle;
+		/* vert or edge mode used for stitching */
+		char mode;
+		/* handle for drawing */
+		void *draw_handle;
+		/* preview data */
+		StitchPreviewer *stitch_preview;
 } StitchState;
 
 typedef struct PreviewPosition {
-	int data_position;
-	int polycount_position;
+		int data_position;
+		int polycount_position;
 } PreviewPosition;
 /*
- * defines for UvElement flags
+ * defines for UvElement/UcEdge flags
  */
 #define STITCH_SELECTED 1
 #define STITCH_STITCHABLE 2
@@ -186,83 +197,79 @@
 
 #define STITCH_NO_PREVIEW -1
 
-/* previewer stuff (see uvedit_intern.h for more info) */
-static StitchPreviewer *_stitch_preview;

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list