[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [37935] branches/soc-2011-onion/source/ blender/editors: smart stitch - better vertex selection + utility function for edge stitch, maybe unneeded, I keep thinking about refactoring every few commits :)

Antony Riakiotakis kalast at gmail.com
Wed Jun 29 05:02:25 CEST 2011


Revision: 37935
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=37935
Author:   psy-fi
Date:     2011-06-29 03:02:20 +0000 (Wed, 29 Jun 2011)
Log Message:
-----------
smart stitch - better vertex selection + utility function for edge stitch, maybe unneeded, I keep thinking about refactoring every few commits :)

Modified Paths:
--------------
    branches/soc-2011-onion/source/blender/editors/include/ED_mesh.h
    branches/soc-2011-onion/source/blender/editors/mesh/editmesh_lib.c
    branches/soc-2011-onion/source/blender/editors/uvedit/uvedit_ops.c

Modified: branches/soc-2011-onion/source/blender/editors/include/ED_mesh.h
===================================================================
--- branches/soc-2011-onion/source/blender/editors/include/ED_mesh.h	2011-06-29 02:45:08 UTC (rev 37934)
+++ branches/soc-2011-onion/source/blender/editors/include/ED_mesh.h	2011-06-29 03:02:20 UTC (rev 37935)
@@ -157,7 +157,7 @@
 void		EM_free_uv_vert_map(struct UvVertMap *vmap);
 
 struct UvVertMap2 *EM_make_uv_vert_map2(struct EditMesh *em, int selected, float *limit);
-struct UvElement *EM_get_uv_element_for_edge(struct UvVertMap2 *vmap, struct EditMesh *em, struct EditEdge *edge, int initVertexArray);
+struct UvElement *EM_get_uv_map_vert_for_edge(struct UvVertMap2 *vmap, struct EditMesh *em, struct EditEdge *edge, int initVertexArray);
 void		EM_free_uv_vert_map2(struct UvVertMap2 *vmap);
 
 void		EM_add_data_layer(struct EditMesh *em, struct CustomData *data, int type, const char *name);

Modified: branches/soc-2011-onion/source/blender/editors/mesh/editmesh_lib.c
===================================================================
--- branches/soc-2011-onion/source/blender/editors/mesh/editmesh_lib.c	2011-06-29 02:45:08 UTC (rev 37934)
+++ branches/soc-2011-onion/source/blender/editors/mesh/editmesh_lib.c	2011-06-29 03:02:20 UTC (rev 37935)
@@ -2466,6 +2466,7 @@
 	return vmap;
 }
 
+/* Will return the UV for which uvi and uvi+1 belong to given edge */
 UvElement *EM_get_uv_map_vert_for_edge(UvVertMap2 *vmap, EditMesh *em, EditEdge *edge, int initVertexArray)
 {
 	int i;
@@ -2481,10 +2482,19 @@
 	}
 
 	for(element = vmap->vert[edge->v1->tmp.t]; element; element = element->next){
+		int nverts;
 		efa = element->face;
-
+		nverts = efa->v4 ? 4 : 3;
+		if(*(&efa->v1 + (element->tfindex + 1)%nverts) == edge->v2)
+			return element;
 	}
-
+	for(element = vmap->vert[edge->v2->tmp.t]; element; element = element->next){
+		int nverts;
+		efa = element->face;
+		nverts = efa->v4 ? 4 : 3;
+		if(*(&efa->v1 + (element->tfindex + 1)%nverts) == edge->v1)
+			return element;
+	}
 	return NULL;
 }
 

Modified: branches/soc-2011-onion/source/blender/editors/uvedit/uvedit_ops.c
===================================================================
--- branches/soc-2011-onion/source/blender/editors/uvedit/uvedit_ops.c	2011-06-29 02:45:08 UTC (rev 37934)
+++ branches/soc-2011-onion/source/blender/editors/uvedit/uvedit_ops.c	2011-06-29 03:02:20 UTC (rev 37935)
@@ -1434,8 +1434,6 @@
 			EditVert *v1, *v2;
 			UvElement *element;
 			int stackSize = 0;
-			/* initialize position in preview buffer */
-			editEdge->tmp.l = -1;
 			editEdge = BLI_ghashIterator_getKey(edgeIterator);
 
 			v1 = editEdge->v1;
@@ -1760,11 +1758,16 @@
 			if(event->val == KM_PRESS){
 				/* add uv under mouse to processed uv's */
 				float co[2];
+				EditVert *vert;
+				int i;
 				NearestHit hit;
 				ARegion *ar= CTX_wm_region(C);
 				Image *ima= CTX_data_edit_image(C);
 				Scene *scene= CTX_data_scene(C);
-
+				/* We need this again -sigh- */
+				for(vert = stitch_state->em->verts.first, i = 0; vert; vert = vert->next, i++){
+					vert->tmp.t = i;
+				}
 				UI_view2d_region_to_view(&ar->v2d, event->mval[0], event->mval[1], &co[0], &co[1]);
 				if(stitch_state->mode == VERT_STITCH){
 					find_nearest_uv_vert(scene, ima, stitch_state->em, co, NULL, &hit);
@@ -1778,23 +1781,40 @@
 					/* Add vertex to selection and update the preview */
 					if(stitch_state->mode == VERT_STITCH)
 					{
-						MTFace *tface = hit.tf;
+						UvElement *element = stitch_state->vmap->vert[(*(&hit.efa->v1 + hit.uv))->tmp.t];
+						UvElement *firstCoincident;
+						//MTFace *tface = hit.tf;
+						for(; element; element = element->next)
+						{
+							if(element->separate)
+								firstCoincident = element;
+							if(element->face == hit.efa){
+								for(element = firstCoincident; element; element = element->next){
+									MTFace *tface;
+									if(element->separate && element != firstCoincident)
+										break;
+									tface =  CustomData_em_get(&stitch_state->em->fdata, element->face->data, CD_MTFACE);
+									if(event->ctrl)
+										uvedit_uv_deselect(scene, element->face, tface, element->tfindex);
+									else
+										uvedit_uv_select(scene, element->face, tface, element->tfindex);
+								}
+								break;
+							}
+						}
 
-						if(event->ctrl)
-							tface->flag &= ~TF_SEL_MASK(hit.uv);
-						else
-							tface->flag |= TF_SEL_MASK(hit.uv);
 					}
 					else
 					{
 						EditEdge *edge = *(&hit.efa->e1 + hit.edge);
-						EditVert *v1 = edge->v1, *v2 = edge->v2;
-						if(!BLI_ghash_haskey(stitch_state->edges,edge)){
-							BLI_ghash_insert(stitch_state->edges, edge, NULL);
+
+						UvElement *element = EM_get_uv_map_vert_for_edge(stitch_state->vmap, stitch_state->em, edge, 1);
+						if(element && !BLI_ghash_haskey(stitch_state->edges,element)){
+							BLI_ghash_insert(stitch_state->edges, element, NULL);
 						}
 					}
 				}
-				stitch_process_data(stitch_state, 0, scene, 1);
+				stitch_process_data(stitch_state, 0, scene, 0);
 				break;
 			}
 			return OPERATOR_RUNNING_MODAL;




More information about the Bf-blender-cvs mailing list