[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [38389] branches/soc-2011-onion/source/ blender/editors/uvedit/uvedit_ops.c: some cleanup, and snapping related code (still nothing functional)
Antony Riakiotakis
kalast at gmail.com
Thu Jul 14 13:32:34 CEST 2011
Revision: 38389
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=38389
Author: psy-fi
Date: 2011-07-14 11:32:33 +0000 (Thu, 14 Jul 2011)
Log Message:
-----------
some cleanup, and snapping related code (still nothing functional)
Modified Paths:
--------------
branches/soc-2011-onion/source/blender/editors/uvedit/uvedit_ops.c
Modified: branches/soc-2011-onion/source/blender/editors/uvedit/uvedit_ops.c
===================================================================
--- branches/soc-2011-onion/source/blender/editors/uvedit/uvedit_ops.c 2011-07-14 09:54:03 UTC (rev 38388)
+++ branches/soc-2011-onion/source/blender/editors/uvedit/uvedit_ops.c 2011-07-14 11:32:33 UTC (rev 38389)
@@ -1127,13 +1127,13 @@
/* stitch state object */
typedef struct StitchState {
/* edge or vertex stitch mode */
- short mode;
+ char mode;
/* use limit flag */
- short use_limit;
+ char use_limit;
/* limit to operator, same as original operator */
float limitDist;
- /* operate on vertex uvs or whole edge uvs */
- short operationMode;
+ /* snap uv islands together during stitching */
+ char snapIslands;
/* editmesh, cached for use in modal handler */
EditMesh *em;
/* vertmap, contains vertices sharing uv's in linked lists. */
@@ -1223,7 +1223,7 @@
(!mode)? '*':' ',
uv_get_stitch_previewer()->enabled?'*':' ',
stitch_state->use_limit?'*':' ',
- ' ',
+ stitch_state->snapIslands?'*' :' ',
stitch_state->limitDist);
ED_area_headerprint(sa, msg);
}
@@ -1244,6 +1244,18 @@
}
}
+struct IslandStitchData;
+
+/* This is a straightforward implementation, couunt the uv's in the island that will move and take the mean displacement and apply it to all
+ * elements of the island except from the stitchable */
+typedef struct IslandStitchData{
+ /* rotation can be used only for edges, for vertices there is no such notion */
+ float rotation;
+ float translation;
+ int numOfElements;
+}IslandStitchData;
+
+
/* This function prepares the data of the previewer for display */
static int stitch_process_data(StitchState *state, int final, Scene *scene, int doIndexInit)
{
@@ -1256,7 +1268,9 @@
EditFace *editFace, *efa;
//**faceArray;
EditVert *editVert;
- /* This holds uv's that must be updated if the initial uv is stitchable. */
+ 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;
@@ -1283,322 +1297,323 @@
/* Make face array and initialize position in preview buffer */
for(editFace = state->em->faces.first, i = 0; editFace; editFace = editFace->next, i++){
- editFace->tmp.l = -1;
- }
+ 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(UvElement *), "commonVertMaps");
+ /* 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->vmap->numOfIslands, "stitch_island_data");
+ }
- /* Count number of points/faces so that we allocate appropriate buffer */
- for(editFace = state->em->faces.first ; editFace; editFace=editFace->next){
- mt = CustomData_em_get(&state->em->fdata, editFace->data, CD_MTFACE);
- /* if face has any UV's selected... */
- if(mt->flag & FACE_UVS_SELECTED){
- int vertsPerFace = editFace->v4 ? 4 : 3;
+ /* Iterate over all faces and find selected uv's */
+ for(editFace = state->em->faces.first ; editFace; editFace=editFace->next){
+ mt = CustomData_em_get(&state->em->fdata, editFace->data, CD_MTFACE);
+ /* if face has any UV's selected... */
+ if(mt->flag & FACE_UVS_SELECTED){
+ int vertsPerFace = editFace->v4 ? 4 : 3;
- for(i = 0; i < vertsPerFace; i++){
- /************ Vert stitching case **********************/
- if(state->mode == VERT_STITCH){
- if(mt->flag & TF_SEL_MASK(i))
+ for(i = 0; i < vertsPerFace; i++){
+ /************ Vert stitching case **********************/
+ if(state->mode == VERT_STITCH){
+ if(mt->flag & TF_SEL_MASK(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 = vmap->vert[vt->tmp.l];
+ /* Original vertex will be previewed, of course */
+ preview->numOfOrig++;
+
+ /* First we need the UVMapVert that corresponds to our uv */
+ for(;el_iter; el_iter = el_iter->next)
{
- 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 = vmap->vert[vt->tmp.l];
- /* Original vertex will be previewed, of course */
- preview->numOfOrig++;
-
- /* 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)
{
- /* 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 - vmap->buf;
- }
+ /* Assign first UV coincident */
+ element = el_iter;
+ averageIndex = element - vmap->buf;
}
+ }
- uv_average[averageIndex].count ++;
- uv_average[averageIndex].uv[0] += mt->uv[i][0];
- uv_average[averageIndex].uv[1] += mt->uv[i][1];
+ 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 = vmap->vert[vt->tmp.l], iter = 0; el_iter; el_iter = el_iter->next){
- MTFace *tmptface;
+ for(el_iter = vmap->vert[vt->tmp.l], iter = 0; el_iter; el_iter = el_iter->next){
+ MTFace *tmptface;
- if(el_iter == element){
- continue;
- }
+ if(el_iter == element){
+ continue;
+ }
- efa = el_iter->face;
- tmptface = CustomData_em_get(&state->em->fdata, efa->data, CD_MTFACE);
+ 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;
+ 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];
}
- 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)
+ element->flag |= STITCH_PROCESSED;
+ /* here we update coincident uvs */
+ if(element->flag & STITCH_STITCHABLE)
+ {
+ /* add original face to preview */
+ stitch_update_face_preview_index(editFace, preview);
+ for(iter2 = 0; iter2 < iter; iter2++)
{
- /* add original face to preview */
- stitch_update_face_preview_index(editFace, preview);
- for(iter2 = 0; iter2 < iter; iter2++)
- {
- int averageIndex2;
- el_iter = commonVertMaps[iter2];
- efa = el_iter->face;
- averageIndex2 = el_iter - vmap->buf;
- preview->numOfOrig++;
+ int averageIndex2;
+ el_iter = commonVertMaps[iter2];
+ efa = el_iter->face;
+ averageIndex2 = el_iter - vmap->buf;
+ preview->numOfOrig++;
- el_iter->flag |= STITCH_STITCHABLE;
- //el_iter->flag |= STITCH_PROCESSED;
+ 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];
+ 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];
- stitch_update_face_preview_index(efa, preview);
- }
+ stitch_update_face_preview_index(efa, preview);
}
}
- /****************** Edge stitching case *************************/
- } else
+ }
+ /****************** Edge stitching case *************************/
+ } else {
+ /* Is this edge selected? */
+ if(mt->flag & TF_SEL_MASK(i) && mt->flag & TF_SEL_MASK((i+1)%vertsPerFace))
{
- /* Is this edge selected? */
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list