[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [40933] branches/soc-2011-onion-uv-tools/ source/blender/editors/uvedit/uvedit_ops.c: smart stitching
Antony Riakiotakis
kalast at gmail.com
Tue Oct 11 11:32:58 CEST 2011
Revision: 40933
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=40933
Author: psy-fi
Date: 2011-10-11 09:32:57 +0000 (Tue, 11 Oct 2011)
Log Message:
-----------
smart stitching
================
*edge selection and switching between uv-uv edge selection mode brought back.
*Also face preview in edge selection mode brought back.
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-11 06:56:15 UTC (rev 40932)
+++ branches/soc-2011-onion-uv-tools/source/blender/editors/uvedit/uvedit_ops.c 2011-10-11 09:32:57 UTC (rev 40933)
@@ -2240,7 +2240,8 @@
stitch_set_face_preview_buffer_position(element_iter->face, preview);
uniqueIndex = state->map[element_iter - state->elementMap->buf];
- if(!(state->uvs[uniqueIndex]->flag & STITCH_STITCHABLE)){
+
+ if(state->mode == VERT_STITCH && !(state->uvs[uniqueIndex]->flag & STITCH_STITCHABLE)){
state->uvs[uniqueIndex]->flag |= STITCH_STITCHABLE;
if(state->snapIslands){
island_stitch_data[element_iter->island].addedForPreview = 1;
@@ -2252,8 +2253,10 @@
int uniqueIndex;
/* if no limit exists all uvs are stitchable */
stitch_set_face_preview_buffer_position(element_iter->face, preview);
+
uniqueIndex = state->map[element_iter - state->elementMap->buf];
- if(!(state->uvs[uniqueIndex]->flag & STITCH_STITCHABLE)){
+
+ if(state->mode == VERT_STITCH && !(state->uvs[uniqueIndex]->flag & STITCH_STITCHABLE)){
state->uvs[uniqueIndex]->flag |= STITCH_STITCHABLE;
if(state->snapIslands){
island_stitch_data[element_iter->island].addedForPreview = 1;
@@ -2280,7 +2283,7 @@
if(preview == NULL)
return 0;
preview->enabled = preview_enabled;
- preview->mode = VERT_STITCH;
+ preview->mode = state->mode;
/* each face holds its position in the preview buffer in tmp. -1 is uninitialized */
for(efa = state->em->faces.first; efa; efa = efa->next){
efa->tmp.l = -1;
@@ -2314,6 +2317,34 @@
preview->numOfUnstitchable++;
}
}
+ }else{
+ for(i = 0; i < state->selection_size; i++){
+ char stitchable1, stitchable2;
+ UvEdge *edge = (UvEdge *)state->selection_stack[i];
+ UvElement *element1 = state->uvs[edge->uv1];
+ UvElement *element2 = state->uvs[edge->uv2];
+
+ stitchable1 = determine_uv_stitchability(element1, state);
+ stitchable2 = determine_uv_stitchability(element2, state);
+
+ if(stitchable1 || stitchable2){
+ /* Update only uv face preview that need to be updated */
+ if(stitchable1){
+ stitch_setup_preview_for_uv_group(element1, state, island_stitch_data);
+ }
+ if(stitchable2){
+ stitch_setup_preview_for_uv_group(element2, state, island_stitch_data);
+ }
+ if(state->snapIslands){
+ island_stitch_data[element1->island].addedForPreview = 1;
+ }
+ edge->flag |= STITCH_STITCHABLE;
+ preview->numOfStitchable++;
+ }else{
+ /* Add to preview */
+ preview->numOfUnstitchable++;
+ }
+ }
}
/*****************************************
* Setup preview for stitchable islands *
@@ -2655,7 +2686,7 @@
BLI_ghash_free(stitch_state->edgeHash, NULL, NULL);
stitch_state->edgeHash = BLI_ghash_new(uv_edge_hash, uv_edge_compare, "stitch_edge_hash");
for(i = 0; i < stitch_state->total_edges; i++){
- BLI_ghash_insert(stitch_state->edgeHash, &stitch_state->edges + i, NULL);
+ BLI_ghash_insert(stitch_state->edgeHash, stitch_state->edges + i, stitch_state->edges + i);
}
for(i = 0; i < stitch_state->total_edges; i++){
@@ -2859,6 +2890,7 @@
break;
}
return OPERATOR_RUNNING_MODAL;
+
case IKEY:
if(event->val == KM_PRESS){
/* Here we just increase the number, it will be modded
@@ -2871,14 +2903,58 @@
break;
}
return OPERATOR_RUNNING_MODAL;
+
/* Use Edge selection */
case MKEY:
if(event->val == KM_PRESS){
- if(stitch_state->mode == EDGE_STITCH)
+ void **new_selection = MEM_mallocN(sizeof(*new_selection)*stitch_state->elementMap->totalUVs, "uv_stitch_selection_stack");
+
+ if(stitch_state->mode == EDGE_STITCH){
+ int i;
+ int total_uvs_selected = 0;
+
+ for(i = 0; i < stitch_state->selection_size; i++){
+ UvEdge *edge = stitch_state->selection_stack[i];
+
+ if(!(stitch_state->uvs[edge->uv1]->flag & STITCH_SELECTED)){
+ stitch_state->uvs[edge->uv1]->flag |= STITCH_SELECTED;
+ new_selection[total_uvs_selected++] = stitch_state->uvs[edge->uv1];
+ }
+ if(!(stitch_state->uvs[edge->uv2]->flag & STITCH_SELECTED)){
+ stitch_state->uvs[edge->uv2]->flag |= STITCH_SELECTED;
+ new_selection[total_uvs_selected++] = stitch_state->uvs[edge->uv2];
+ }
+
+ edge->flag &= ~STITCH_SELECTED;
+ }
+
stitch_state->mode = VERT_STITCH;
- else
+ MEM_freeN(stitch_state->selection_stack);
+ stitch_state->selection_size = total_uvs_selected;
+ }
+ else{
+ int i;
+ int total_edges_selected = 0;
+ for(i = 0; i < stitch_state->total_edges; i++){
+ UvEdge *edge = stitch_state->edges + i;
+
+ if(stitch_state->uvs[edge->uv1]->flag & STITCH_SELECTED && stitch_state->uvs[edge->uv2]->flag & STITCH_SELECTED){
+ edge->flag |= STITCH_SELECTED;
+ new_selection[total_edges_selected++] = edge;
+ }
+ }
+
+ /* Cleanup old uv element selection */
+ for(i = 0; i < stitch_state->selection_size; i++){
+ ((UvElement *)stitch_state->selection_stack[i])->flag &= ~STITCH_SELECTED;
+ }
stitch_state->mode = EDGE_STITCH;
+ MEM_freeN(stitch_state->selection_stack);
+ stitch_state->selection_size = total_edges_selected;
+ }
+ stitch_state->selection_stack = new_selection;
+
if(!stitch_process_data(stitch_state, scene, 0, 1)){
return stitch_cancel(C, op);
}
@@ -2907,8 +2983,8 @@
if(hit.efa)
{
/* Add vertex to selection, deselect all common uv's of vert other
- * than selected and update the preview. This behavior was decided because stitching
- * becomes dependent on the order of stitching different uv's corresponding to the same vertex */
+ * than selected and update the preview. This behavior was decided so that
+ * you can do stuff like deselect the opposite stitchable vertex and the initial still gets deselected */
if(stitch_state->mode == VERT_STITCH)
{
int uniqueIndex;
@@ -2942,42 +3018,38 @@
}
else
{
- /* same as above but for two verts. Maybe make a function for this after implementation is concrete */
- UvElement *element = stitch_state->elementMap->vert[hit.vert];
+ UvEdge tmp_edge, *edge;
+ int nverts = hit.efa->v4? 4 : 3;
+ UvElement *element1 = get_uv_element(stitch_state->elementMap, hit.efa, hit.edge);
+ UvElement *element2 = get_uv_element(stitch_state->elementMap, hit.efa, (hit.edge+1)%nverts);
- for(; element; element = element->next)
- {
- int nverts = element->face->v4 ? 4 : 3;
- int nextflag = 0;
- if((nextflag = (*(&element->face->v1 + (1 + element->tfindex)%nverts))->tmp.l == hit.vert2) ||
- (*(&element->face->v1 + (element->tfindex - 1 + nverts)%nverts))->tmp.l == hit.vert2)
- {
- MTFace *tface = CustomData_em_get(&stitch_state->em->fdata, element->face->data, CD_MTFACE);
- if(element->face == hit.efa)
- {
- if(nextflag)
- {
- if(event->ctrl){
- uvedit_uv_deselect(scene, element->face, tface, element->tfindex);
- }
- else{
- uvedit_uv_select(scene, element->face, tface, element->tfindex);
- }
- }else{
- if(event->ctrl){
- uvedit_uv_deselect(scene, element->face, tface, (element->tfindex - 1 + nverts)%nverts);
- }
- else{
- uvedit_uv_select(scene, element->face, tface, (element->tfindex - 1 + nverts)%nverts);
- }
+ int uniqueIndex = stitch_state->map[element1 - stitch_state->elementMap->buf];
+ int uniqueIndex2 = stitch_state->map[element2 - stitch_state->elementMap->buf];
+
+ if(uniqueIndex2 > uniqueIndex){
+ tmp_edge.uv1 = uniqueIndex;
+ tmp_edge.uv2 = uniqueIndex2;
+ }else{
+ tmp_edge.uv1 = uniqueIndex2;
+ tmp_edge.uv2 = uniqueIndex;
+ }
+
+ edge = (UvEdge *)BLI_ghash_lookup(stitch_state->edgeHash, &tmp_edge);
+
+ /* Add edge to selection */
+ if(!event->ctrl){
+ if(!(edge->flag & STITCH_SELECTED)){
+ edge->flag |= STITCH_SELECTED;
+ stitch_state->selection_stack[stitch_state->selection_size++] = edge;
+ }
+ }else{
+ if(edge->flag & STITCH_SELECTED){
+ int i;
+ for(i = 0; i < stitch_state->selection_size; i++){
+ if(((UvEdge *)stitch_state->selection_stack[i]) == edge){
+ --stitch_state->selection_size;
+ stitch_state->selection_stack[i] = stitch_state->selection_stack[stitch_state->selection_size];
}
- }else{
- if(nextflag)
- {
- uvedit_uv_deselect(scene, element->face, tface, element->tfindex);
- }else{
- uvedit_uv_deselect(scene, element->face, tface, (element->tfindex - 1 + nverts)%nverts);
- }
}
}
}
More information about the Bf-blender-cvs
mailing list