[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