[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [41351] 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:36:41 CEST 2011
Revision: 41351
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=41351
Author: psy-fi
Date: 2011-10-28 20:36:40 +0000 (Fri, 28 Oct 2011)
Log Message:
-----------
smart stitching
===================
*Completely remove old evaluation function
*Add new shortcuts to area header.
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 19:40:32 UTC (rev 41350)
+++ branches/soc-2011-onion-uv-tools/source/blender/editors/uvedit/uvedit_ops.c 2011-10-28 20:36:40 UTC (rev 41351)
@@ -1392,7 +1392,7 @@
/* This function updates the header of the UV editor when the stitch tool updates its settings */
static void stitch_update_header(StitchState *stitch_state, bContext *C)
{
- static char str[] = "Select(V {+Ctrl deselect}) Toggle(T) %c Vertex %c Edge, %c Preview(P), %c Limit(L), %c Snap(S), %c Midpoints(M), Ctrl+Wheel(limit adjust): %.2f";
+ static char str[] = "Select(V {+Ctrl deselect}) Toggle(T) %c Vertex %c Edge, %c Preview(P), %c Limit(L), %c Snap(S), %c Midpoints(M), (Ctrl+Wheel/-+)Limit Adjust: %.2f, Switch Static Island(I) ";
char msg[256];
ScrArea *sa= CTX_wm_area(C);
char mode = (stitch_state->mode == VERT_STITCH);
@@ -1532,581 +1532,8 @@
island_stitch_data[element->island].medianPoint[1] += (mt->uv[(element->tfindex + 1)%nverts][1] + mt->uv[element->tfindex][1]) / 2.0;
}
-#ifndef STITCHNEW
-/* This function prepares the data of the previewer for display */
-static int stitch_process_data(StitchState *state, int final, Scene *scene, int doIndexInit)
-{
- StitchPreviewer *preview = uv_get_stitch_previewer();
- UVVertAverage *uv_average;
- UvElementMap *elementMap = state->elementMap;
- UvElement *element;
- int i;
- int bufferIterator = 0;
- EditFace *editFace, *efa;
- //**faceArray;
- EditVert *editVert;
- IslandStitchData *island_stitch_data = NULL;
- /* This holds uv's corresponding to the same vertex that must be updated if one of them is stitchable. */
- UvElement **commonVertMaps;
- MTFace *mt;
- short preview_enabled = preview->enabled;
-
- /* cleanup previous preview */
- stitch_preview_delete();
- preview = stitch_preview_init();
- if(preview == NULL)
- return OPERATOR_CANCELLED;
- preview->enabled = preview_enabled;
- preview->mode = state->mode;
- /* UV average is stored for every UV since potentially every UV can be stitched with another. Highly unlikely, I know but possible
- * nevertheless :p */
- uv_average = (UVVertAverage *)MEM_callocN(state->elementMap->totalUVs*sizeof(UVVertAverage), "stitch_averages");
-
- /* Store Indices to editVerts */
- if(doIndexInit){
- for(editVert = state->em->verts.first, i = 0; editVert; editVert = editVert->next, i++){
- editVert->tmp.l = i;
- }
- }
-
- /* Make face array and initialize position in preview buffer */
- for(editFace = state->em->faces.first; editFace; editFace = editFace->next){
- editFace->tmp.l = -1;
- }
-
- /* The maximum number of faces that a UV can be part of is totfaces. We allocate this here to avoid allocating
- * this too many times on the fly */
- commonVertMaps = MEM_mallocN(state->em->totface*sizeof(*commonVertMaps), "commonVertMaps");
-
- if(state->snapIslands){
- island_stitch_data = MEM_callocN(sizeof(*island_stitch_data)*state->elementMap->totalIslands, "stitch_island_data");
- }
-
- /* Iterate over all faces and find selected uv's */
- for(editFace = state->em->faces.first ; editFace; editFace=editFace->next){
- int vertsPerFace;
-
- mt = CustomData_em_get(&state->em->fdata, editFace->data, CD_MTFACE);
- vertsPerFace = editFace->v4 ? 4 : 3;
-
- for(i = 0; i < vertsPerFace; i++){
- /************ Vert stitching case **********************/
- if(state->mode == VERT_STITCH){
- if(uvedit_uv_selected(scene, editFace, mt, i))
- {
- int averageIndex;
- int iter = 0;
- int iter2;
- UvElement *el_iter;
- EditVert *vt = *(&(editFace->v1)+i);
- /* ...we'll iterate through all shared UV's of the corresponding vertex */
- el_iter = elementMap->vert[vt->tmp.l];
-
- /* First we need the UVMapVert that corresponds to our uv */
- for(;el_iter; el_iter = el_iter->next)
- {
- /* Here we assume face does not use the same vertex twice. */
- if(el_iter->face == editFace)
- {
- /* Assign first UV coincident */
- element = el_iter;
- averageIndex = element - elementMap->buf;
- }
- }
-
- /* Add preview only if it hasn't been added already */
- if(!(element->flag & (STITCH_STITCHABLE | STITCH_PROCESSED))){
- preview->numOfStitchable++;
- }
-
- uv_average[averageIndex].count ++;
- uv_average[averageIndex].uv[0] += mt->uv[i][0];
- uv_average[averageIndex].uv[1] += mt->uv[i][1];
-
- for(el_iter = elementMap->vert[vt->tmp.l], iter = 0; el_iter; el_iter = el_iter->next){
- MTFace *tmptface;
-
- if(el_iter == element){
- continue;
- }
-
- efa = el_iter->face;
- tmptface = CustomData_em_get(&state->em->fdata, efa->data, CD_MTFACE);
-
- if(fabs((mt->uv[i][0] - tmptface->uv[el_iter->tfindex][0]) < STD_UV_CONNECT_LIMIT) &&
- (fabs(mt->uv[i][1] - tmptface->uv[el_iter->tfindex][1]) < STD_UV_CONNECT_LIMIT))
- {
- /* if the uv being iterated is coincident with the original, just add it to be updated later if
- * original uv is stitchable */
- commonVertMaps[iter++] = el_iter;
- }
- else if((!state->use_limit) || ( (fabs(mt->uv[i][0] - tmptface->uv[el_iter->tfindex][0]) < state->limitDist
- && fabs(mt->uv[i][1] - tmptface->uv[el_iter->tfindex][1]) < state->limitDist) ))
- {
- commonVertMaps[iter++] = el_iter;
- element->flag |= STITCH_STITCHABLE;
- if(el_iter->separate){
- uv_average[averageIndex].count++;
- uv_average[averageIndex].uv[0] += tmptface->uv[el_iter->tfindex][0];
- uv_average[averageIndex].uv[1] += tmptface->uv[el_iter->tfindex][1];
- }
- }
- }
-
- element->flag |= STITCH_PROCESSED;
- /* here we update coincident uvs */
- if(element->flag & STITCH_STITCHABLE)
- {
- /* add original face to preview */
- if(state->snapIslands){
- island_stitch_data[element->island].addedForPreview = 1;
- }
- else {
- stitch_set_face_preview_buffer_position(editFace, preview);
- }
- for(iter2 = 0; iter2 < iter; iter2++)
- {
- int averageIndex2;
- el_iter = commonVertMaps[iter2];
- efa = el_iter->face;
- averageIndex2 = el_iter - elementMap->buf;
- /* Add preview only if it hasn't been added already */
- if(!(el_iter->flag & (STITCH_STITCHABLE | STITCH_PROCESSED))){
- preview->numOfStitchable++;
- }
- el_iter->flag |= STITCH_STITCHABLE;
- //el_iter->flag |= STITCH_PROCESSED;
-
- uv_average[averageIndex2].count += uv_average[averageIndex].count;
- uv_average[averageIndex2].uv[0] += uv_average[averageIndex].uv[0];
- uv_average[averageIndex2].uv[1] += uv_average[averageIndex].uv[1];
- if(state->snapIslands){
- island_stitch_data[el_iter->island].addedForPreview = 1;
- }
- else {
- stitch_set_face_preview_buffer_position(efa, preview);
- }
- }
- }
- }
- /****************** Edge stitching case *************************/
- } else {
- /* Is this edge selected? */
- if(uvedit_uv_selected(scene, editFace, mt, i))
- {
- EditVert *v1, *v2;
- /* The sep hold the first UVElement coincident with our elements. If edge
- * is stitchable we must update all these. */
- UvElement *el_iter, *element2, *el_sep1, *el_sep2, *iter_sep1, *iter_sep2;
- float uv1[2][2];
- int nverts, stack_iter;
- int stackSize1 = 0;
- int stackSize2 = 0;
- int index1, index2;
- UVVertAverage uv_average_tmp[2];
- /* need another one of these for each of the 2 verts*/
- UvElement **commonVertMaps2 = MEM_mallocN(state->em->totface*sizeof(UvElement *), "commonVertMaps2");
-
- memset(uv_average_tmp, 0, sizeof(uv_average_tmp));
-
- v1 = *(&editFace->v1 + i);
- v2 = *(&editFace->v1 + (i + 1)%vertsPerFace);
-
- /* Find the uv element that matches the current face */
- for(el_iter = elementMap->vert[v1->tmp.l]; el_iter; el_iter = el_iter->next){
- if(el_iter->separate)
- el_sep1 = el_iter;
- efa = el_iter->face;
- nverts = efa->v4 ? 4 : 3;
- if(efa == editFace){
- UvElement *el_iter2;
- element = el_iter;
- /* Find the uv element for the other uv too */
- for(el_iter2 = elementMap->vert[v2->tmp.l]; el_iter2; el_iter2 = el_iter2->next){
- if(el_iter2->separate)
- el_sep2 = el_iter2;
- if(el_iter2->face == efa){
- element2 = el_iter2;
- break;
- }
- }
- break;
- }
- }
-
- index1 = element - elementMap->buf;
- index2 = element2 - elementMap->buf;
-
- element->flag |= STITCH_PROCESSED;
- element->flag |= STITCH_EDGE_PREVIEW;
- preview->numOfStitchable++;
-
- uv_average_tmp[0].count++;
- uv_average_tmp[1].count++;
-
- uv_average_tmp[0].uv[0] = uv1[0][0] = mt->uv[element->tfindex][0];
- uv_average_tmp[0].uv[1] = uv1[0][1] = mt->uv[element->tfindex][1];
- uv_average_tmp[1].uv[0] = uv1[1][0] = mt->uv[(element2->tfindex)][0];
- uv_average_tmp[1].uv[1] = uv1[1][1] = mt->uv[(element2->tfindex)][1];
-
- /* Now iterate through all faces and find potential stitchable edges */
- for(el_iter = elementMap->vert[v1->tmp.l]; el_iter; el_iter = el_iter->next){
- char vertCheck = 0;
- float uv2[2][2];
- MTFace *tmptface;
- efa = el_iter->face;
- nverts = (efa->v4)? 4 : 3;
- if(el_iter->separate)
- iter_sep1 = el_iter;
- /* Check to see if both vertices exist on the edge of the new face */
- if((vertCheck = (*(&efa->v1 + (el_iter->tfindex + 1)%nverts) == v2))
- || (*(&efa->v1 + (el_iter->tfindex + nverts - 1)%nverts) == v2)){
-
- tmptface = CustomData_em_get(&state->em->fdata, efa->data, CD_MTFACE);
-
- /* Take uv's of second face */
- uv2[0][0] = tmptface->uv[el_iter->tfindex][0];
- uv2[0][1] = tmptface->uv[el_iter->tfindex][1];
- uv2[1][0] = (vertCheck)? tmptface->uv[(el_iter->tfindex + 1)%nverts][0] : tmptface->uv[(el_iter->tfindex + nverts - 1)%nverts][0];
- uv2[1][1] = (vertCheck)? tmptface->uv[(el_iter->tfindex + 1)%nverts][1] : tmptface->uv[(el_iter->tfindex + nverts - 1)%nverts][1];
-
- /* Actual checks */
- if(fabs((uv1[0][0] - uv2[0][0]) < STD_UV_CONNECT_LIMIT) &&
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list