[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [41108] branches/soc-2011-onion-uv-tools/ source/blender/editors/uvedit/uvedit_ops.c: edge selection/ deselection in stitching working correctly + mode change between edge/ vert stitch fixes.
Antony Riakiotakis
kalast at gmail.com
Tue Oct 18 23:20:40 CEST 2011
Revision: 41108
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=41108
Author: psy-fi
Date: 2011-10-18 21:20:39 +0000 (Tue, 18 Oct 2011)
Log Message:
-----------
edge selection/deselection in stitching working correctly + mode change between edge/vert stitch fixes.
Modified Paths:
--------------
branches/soc-2011-onion-uv-tools/source/blender/editors/uvedit/uvedit_ops.c
Modified: branches/soc-2011-onion-uv-tools/source/blender/editors/uvedit/uvedit_ops.c
===================================================================
--- branches/soc-2011-onion-uv-tools/source/blender/editors/uvedit/uvedit_ops.c 2011-10-18 19:49:55 UTC (rev 41107)
+++ branches/soc-2011-onion-uv-tools/source/blender/editors/uvedit/uvedit_ops.c 2011-10-18 21:20:39 UTC (rev 41108)
@@ -2291,78 +2291,79 @@
UvElement *element2 = state->uvs[edge->uv2];
UvElement *element_iter1 = state->elementMap->vert[(*(&element1->face->v1 + element1->tfindex))->tmp.l];
- UvElement *element_iter2 = state->elementMap->vert[(*(&element2->face->v1 + element2->tfindex))->tmp.l];
for(;element_iter1; element_iter1 = element_iter1->next){
- if(element_iter1->separate){
- for(;element_iter2; element_iter2 = element_iter2->next){
- if(element_iter2->separate){
- int uniqueIndex1;
- int uniqueIndex2;
- UvEdge tmp_edge, *edge_iter;
+ UvElement *element_iter2 = state->elementMap->vert[(*(&element2->face->v1 + element2->tfindex))->tmp.l];
- if((element_iter1 == element1) && (element_iter2 == element2))
- continue;
+ for(;element_iter2; element_iter2 = element_iter2->next){
+ int uniqueIndex1;
+ int uniqueIndex2;
+ UvEdge tmp_edge, *edge_iter;
- uniqueIndex1 = state->map[element_iter1 - state->elementMap->buf];
- uniqueIndex2 = state->map[element_iter2 - state->elementMap->buf];
+ uniqueIndex1 = state->map[element_iter1 - state->elementMap->buf];
+ uniqueIndex2 = state->map[element_iter2 - state->elementMap->buf];
- if(uniqueIndex2 > uniqueIndex1){
- tmp_edge.uv1 = uniqueIndex1;
- tmp_edge.uv2 = uniqueIndex2;
- }else{
- tmp_edge.uv1 = uniqueIndex2;
- tmp_edge.uv2 = uniqueIndex1;
- }
+ if(uniqueIndex2 > uniqueIndex1){
+ tmp_edge.uv1 = uniqueIndex1;
+ tmp_edge.uv2 = uniqueIndex2;
+ }else{
+ tmp_edge.uv1 = uniqueIndex2;
+ tmp_edge.uv2 = uniqueIndex1;
+ }
- edge_iter = (UvEdge *)BLI_ghash_lookup(state->edgeHash, &tmp_edge);
+ /* Same edge. If we don't use this, internal edges will always be stitchable */
+ if(tmp_edge.uv1 == edge->uv1 && tmp_edge.uv2 == edge->uv2){
+ continue;
+ }
- if(edge_iter && (edge_iter->flag & STITCH_BOUNDARY)){
- if(state->use_limit){
- MTFace *mtface_orig1 = CustomData_em_get(&state->em->fdata, element1->face->data, CD_MTFACE);
- MTFace *mtface_iter1 = CustomData_em_get(&state->em->fdata, element_iter1->face->data, CD_MTFACE);
+ edge_iter = (UvEdge *)BLI_ghash_lookup(state->edgeHash, &tmp_edge);
- MTFace *mtface_orig2 = CustomData_em_get(&state->em->fdata, element1->face->data, CD_MTFACE);
- MTFace *mtface_iter2 = CustomData_em_get(&state->em->fdata, element_iter1->face->data, CD_MTFACE);
+ if(edge_iter && (edge_iter->flag & STITCH_BOUNDARY) && !(edge_iter->flag & STITCH_STITCHABLE)){
+ if(state->use_limit){
+ MTFace *mtface_orig1 = CustomData_em_get(&state->em->fdata, element1->face->data, CD_MTFACE);
+ MTFace *mtface_iter1 = CustomData_em_get(&state->em->fdata, element_iter1->face->data, CD_MTFACE);
- if(fabs(mtface_orig1->uv[element1->tfindex][0] - mtface_iter1->uv[element_iter1->tfindex][0]) < state->limitDist
+ MTFace *mtface_orig2 = CustomData_em_get(&state->em->fdata, element1->face->data, CD_MTFACE);
+ MTFace *mtface_iter2 = CustomData_em_get(&state->em->fdata, element_iter1->face->data, CD_MTFACE);
+
+ if(fabs(mtface_orig1->uv[element1->tfindex][0] - mtface_iter1->uv[element_iter1->tfindex][0]) < state->limitDist
&& fabs(mtface_orig1->uv[element1->tfindex][1] - mtface_iter1->uv[element_iter1->tfindex][1]) < state->limitDist
&& fabs(mtface_orig2->uv[element2->tfindex][0] - mtface_iter2->uv[element_iter2->tfindex][0]) < state->limitDist
&& fabs(mtface_orig2->uv[element2->tfindex][1] - mtface_iter2->uv[element_iter2->tfindex][1]) < state->limitDist){
- stitch_setup_face_preview_for_uv_group(element1, state, island_stitch_data);
- stitch_setup_face_preview_for_uv_group(element2, state, island_stitch_data);
- stitch_setup_face_preview_for_uv_group(element_iter1, state, island_stitch_data);
- stitch_setup_face_preview_for_uv_group(element_iter2, state, island_stitch_data);
- if(!(edge_iter->flag & STITCH_STITCHABLE)){
- edge_iter->flag |= STITCH_STITCHABLE;
- preview->numOfStitchable++;
- }
- if(!(edge->flag & STITCH_STITCHABLE)){
- edge->flag |= STITCH_STITCHABLE;
- preview->numOfStitchable++;
- }
- }
- }else{
- stitch_setup_face_preview_for_uv_group(element1, state, island_stitch_data);
- stitch_setup_face_preview_for_uv_group(element2, state, island_stitch_data);
- stitch_setup_face_preview_for_uv_group(element_iter1, state, island_stitch_data);
- stitch_setup_face_preview_for_uv_group(element_iter2, state, island_stitch_data);
- if(!(edge_iter->flag & STITCH_STITCHABLE)){
- edge_iter->flag |= STITCH_STITCHABLE;
- preview->numOfStitchable++;
- }
- if(!(edge->flag & STITCH_STITCHABLE)){
- edge->flag |= STITCH_STITCHABLE;
- preview->numOfStitchable++;
- }
- }
+ UvElement *element_prev1 = state->uvs[tmp_edge.uv1];
+ UvElement *element_prev2 = state->uvs[tmp_edge.uv2];
+
+ stitch_setup_face_preview_for_uv_group(element1, state, island_stitch_data);
+ stitch_setup_face_preview_for_uv_group(element2, state, island_stitch_data);
+ stitch_setup_face_preview_for_uv_group(element_prev1, state, island_stitch_data);
+ stitch_setup_face_preview_for_uv_group(element_prev2, state, island_stitch_data);
+
+ edge->flag |= STITCH_STITCHABLE;
+ edge_iter->flag |= STITCH_STITCHABLE;
+ preview->numOfStitchable++;
}
+ }else{
+ UvElement *element_prev1 = state->uvs[tmp_edge.uv1];
+ UvElement *element_prev2 = state->uvs[tmp_edge.uv2];
+
+ stitch_setup_face_preview_for_uv_group(element1, state, island_stitch_data);
+ stitch_setup_face_preview_for_uv_group(element2, state, island_stitch_data);
+ stitch_setup_face_preview_for_uv_group(element_prev1, state, island_stitch_data);
+ stitch_setup_face_preview_for_uv_group(element_prev2, state, island_stitch_data);
+
+ edge->flag |= STITCH_STITCHABLE;
+ edge_iter->flag |= STITCH_STITCHABLE;
+ preview->numOfStitchable++;
}
}
}
}
- if(!(edge->flag & STITCH_STITCHABLE)){
+ /* Caution here, this is valid only if each group of edges with common verts is traversed once */
+ if(edge->flag & STITCH_STITCHABLE){
/* Add to preview */
+ preview->numOfStitchable++;
+ }
+ else{
preview->numOfUnstitchable++;
}
}else{
@@ -2594,7 +2595,7 @@
MEM_freeN(averageUvPosition);
}else{
for(i = 0; i < state->total_edges; i++){
- state->edges[i].flag &= STITCH_SELECTED | STITCH_BOUNDARY;
+ state->edges[i].flag &= (STITCH_SELECTED | STITCH_BOUNDARY);
}
}
@@ -2894,8 +2895,8 @@
}
}
-/* Make sure we are selectig only one of a vertex's common uv */
-static void stitch_select_uv(UvElement *element, StitchState *stitch_state, void **selection_stack, int *total_selected,int select)
+/* Make sure we are selecting only one of a vertex's common uv */
+static void stitch_select_uv(UvElement *element, StitchState *stitch_state, void **selection_stack, int *total_selected, int select)
{
int uniqueIndex;
/* This works due to setting of tmp in find nearest uv vert */
@@ -2927,10 +2928,54 @@
}
}
-/* Make sure we are selectig only one of edges with common vertices */
-static void stitch_select_edge(UvEdge *edge, StitchState *stitch_state)
+/* Make sure we are selecting only one of edges with common vertices */
+static void stitch_select_edge(UvEdge *edge, StitchState *state, void **selection_stack, int *total_selected, int select)
{
+ UvElement *element1 = state->uvs[edge->uv1];
+ UvElement *element2 = state->uvs[edge->uv2];
+ UvElement *element_iter1 = state->elementMap->vert[(*(&element1->face->v1 + element1->tfindex))->tmp.l];
+
+ for(;element_iter1; element_iter1 = element_iter1->next){
+
+ UvElement *element_iter2 = state->elementMap->vert[(*(&element2->face->v1 + element2->tfindex))->tmp.l];
+
+ for(;element_iter2; element_iter2 = element_iter2->next){
+ int uniqueIndex1;
+ int uniqueIndex2;
+ UvEdge tmp_edge, *edge_iter;
+
+ uniqueIndex1 = state->map[element_iter1 - state->elementMap->buf];
+ uniqueIndex2 = state->map[element_iter2 - state->elementMap->buf];
+
+ if(uniqueIndex2 > uniqueIndex1){
+ tmp_edge.uv1 = uniqueIndex1;
+ tmp_edge.uv2 = uniqueIndex2;
+ }else{
+ tmp_edge.uv1 = uniqueIndex2;
+ tmp_edge.uv2 = uniqueIndex1;
+ }
+
+ edge_iter = (UvEdge *)BLI_ghash_lookup(state->edgeHash, &tmp_edge);
+
+ if(edge_iter && edge_iter->flag & STITCH_SELECTED){
+ int i;
+ edge_iter->flag &= ~STITCH_SELECTED;
+ for(i = 0; i < *total_selected; i++){
+ if(((UvEdge *)selection_stack[i]) == edge_iter){
+ (*total_selected)--;
+ selection_stack[i] = selection_stack[*total_selected];
+ break;
+ }
+ }
+ }
+ }
+ }
+
+ if(select){
+ edge->flag |= STITCH_SELECTED;
+ selection_stack[(*total_selected)++] = edge;
+ }
}
static int stitch_modal(bContext *C, wmOperator *op, wmEvent *event)
@@ -3019,8 +3064,16 @@
/* Use Edge selection */
case MKEY:
if(event->val == KM_PRESS){
+ EditVert *ev;
+ int i;
+
void **new_selection = MEM_mallocN(sizeof(*new_selection)*stitch_state->elementMap->totalUVs, "uv_stitch_selection_stack");
+ /* Store Indices to editVerts. */
+ for(ev = stitch_state->em->verts.first, i = 0; ev; ev = ev->next, i++){
+ ev->tmp.l = i;
+ }
+
if(stitch_state->mode == EDGE_STITCH){
int i;
int total_uvs_selected = 0;
@@ -3041,6 +3094,8 @@
else{
int i;
int total_edges_selected = 0;
+
+ /* first do a quick evaluation of stitchability of uvs */
for(i = 0; i < stitch_state->selection_size; i++){
UvElement *element = (UvElement *)stitch_state->selection_stack[i];
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list