[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [41352] branches/soc-2011-onion-uv-tools/ source/blender/editors/uvedit/uvedit_ops.c: smart stitching
Antony Riakiotakis
kalast at gmail.com
Fri Oct 28 22:54:45 CEST 2011
Revision: 41352
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=41352
Author: psy-fi
Date: 2011-10-28 20:54:45 +0000 (Fri, 28 Oct 2011)
Log Message:
-----------
smart stitching
===================
*Optimization, store the uvelement that corresponds to an edges first uv to the edge. Boundary edges (the ones that matter) are certain to have a 1-1 relationship with this uvelement. This makes it possible to avoid costly lookups during selection storage and rotation calculation (coming soon)
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-28 20:36:40 UTC (rev 41351)
+++ branches/soc-2011-onion-uv-tools/source/blender/editors/uvedit/uvedit_ops.c 2011-10-28 20:54:45 UTC (rev 41352)
@@ -1279,6 +1279,8 @@
unsigned int uv2;
/* general use flag (Used to check if edge is boundary here, and propagates to adjacency elements) */
char flag;
+ /* element that guarantees element->face has the face on element->tfindex and element->tfindex+1 is the second uv */
+ UvElement *element;
}UvEdge;
#define STITCHNEW
@@ -1382,7 +1384,7 @@
}
-/* getter method */
+/* "getter method" */
StitchPreviewer *uv_get_stitch_previewer(void)
{
return _stitch_preview;
@@ -2417,13 +2419,15 @@
int nverts = efa->v4 ? 4 : 3;
for(i = 0; i < nverts; i++){
- int offset1, itmp1 = get_uv_element(stitch_state->elementMap, efa, i) - stitch_state->elementMap->buf;
+ UvElement *element = get_uv_element(stitch_state->elementMap, efa, i);
+ int offset1, itmp1 = element - stitch_state->elementMap->buf;
int offset2, itmp2 = get_uv_element(stitch_state->elementMap, efa, (i+1)%nverts) - stitch_state->elementMap->buf;
offset1 = stitch_state->map[itmp1];
offset2 = stitch_state->map[itmp2];
edges[counter].flag = 0;
+ edges[counter].element = element;
/* using an order policy, sort uvs according to address space. This avoids
* Having two different UvEdges with the same uvs on different positions */
if(offset1 < offset2){
@@ -2483,7 +2487,7 @@
stitch_state->selection_size = 0;
- /* Fill selection stack */
+ /***** Fill selection stack *******/
/* Load old selection if redoing operator with different settings */
if(RNA_property_is_set(op->ptr, "selection")){
@@ -2619,56 +2623,11 @@
RNA_int_set(&itemptr, "face_index", element->face->tmp.l);
RNA_int_set(&itemptr, "element_index", element->tfindex);
}else{
- char matchfound = 0;
UvEdge *edge = (UvEdge *)stitch_state->selection_stack[i];
- UvElement *element1 = stitch_state->uvs[edge->uv1];
- UvElement *element2 = stitch_state->uvs[edge->uv2];
- UvElement *element_iter = element1;
+ UvElement *element = edge->element;
- do{
- UvElement *testElement;
- int nverts;
- int uniqueIndex;
- EditFace *efa = element_iter->face;
- nverts = efa->v4? 4 : 3;
-
- testElement = get_uv_element(stitch_state->elementMap, efa, (element_iter->tfindex + 1)%nverts);
- uniqueIndex = stitch_state->map[testElement - stitch_state->elementMap->buf];
- if(uniqueIndex == edge->uv2){
- RNA_int_set(&itemptr, "face_index", element_iter->face->tmp.l);
- RNA_int_set(&itemptr, "element_index", element_iter->tfindex);
- matchfound = 1;
- break;
- }
-
- element_iter = element_iter->next;
- }while(element_iter && !element_iter->separate);
-
- if(matchfound)
- continue;
-
- element_iter = element2;
- do{
- UvElement *testElement;
- int nverts;
- int uniqueIndex;
- EditFace *efa = element_iter->face;
- nverts = efa->v4? 4 : 3;
-
- testElement = get_uv_element(stitch_state->elementMap, efa, (element_iter->tfindex + 1)%nverts);
- uniqueIndex = stitch_state->map[testElement - stitch_state->elementMap->buf];
- if(uniqueIndex == edge->uv1){
- RNA_int_set(&itemptr, "face_index", element_iter->face->tmp.l);
- RNA_int_set(&itemptr, "element_index", element_iter->tfindex);
- matchfound = 1;
- break;
- }
-
- element_iter = element_iter->next;
- }while(element_iter && !element_iter->separate);
-
- if(!matchfound)
- printf("stitch error, can't find face that includes selected edge\n");
+ RNA_int_set(&itemptr, "face_index", element->face->tmp.l);
+ RNA_int_set(&itemptr, "element_index", element->tfindex);
}
}
More information about the Bf-blender-cvs
mailing list