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;

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

Reply via email to