[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [49103] branches/soc-2012-bratwurst/source /blender/editors/uvedit/uvedit_unwrap_ops.c: Support mirror unwrap for normal unwrapping.
Antony Riakiotakis
kalast at gmail.com
Sat Jul 21 15:59:56 CEST 2012
Revision: 49103
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=49103
Author: psy-fi
Date: 2012-07-21 13:59:55 +0000 (Sat, 21 Jul 2012)
Log Message:
-----------
Support mirror unwrap for normal unwrapping. Only non-ngons in this
commit.
Modified Paths:
--------------
branches/soc-2012-bratwurst/source/blender/editors/uvedit/uvedit_unwrap_ops.c
Modified: branches/soc-2012-bratwurst/source/blender/editors/uvedit/uvedit_unwrap_ops.c
===================================================================
--- branches/soc-2012-bratwurst/source/blender/editors/uvedit/uvedit_unwrap_ops.c 2012-07-21 09:01:39 UTC (rev 49102)
+++ branches/soc-2012-bratwurst/source/blender/editors/uvedit/uvedit_unwrap_ops.c 2012-07-21 13:59:55 UTC (rev 49103)
@@ -212,14 +212,23 @@
short implicit, short fill, short sel,
short correct_aspect, short mirrored)
{
+ DerivedMesh *init_derived, *mirr_derived;
+ int tot_faces;
+ int *orig_verts;
+ int *orig_faces;
+ MPoly *face_array;
+ MVert *vert_array;
+ MLoop *loop_array;
BMEditMesh *em;
ScanFillContext sf_ctx;
ParamHandle *handle;
BMFace *efa;
+ MPoly *poly;
BMLoop *l;
BMEdge *eed;
BMIter iter, liter;
MTexPoly *tf;
+ int fi;
handle = param_construct_begin();
@@ -245,14 +254,31 @@
BM_mesh_elem_index_ensure(em->bm, BM_VERT);
if(mirrored) {
- MirrorModifierData *mmd = (MirrorModifierData *)obedit->modifiers.first;
+ MirrorModifierData mmd;
+ MirrorModifierData *real_mmd = (MirrorModifierData *)obedit->modifiers.first;
- /* we need to mirror the mesh */
+ mmd = *real_mmd;
+ init_derived = CDDM_from_BMEditMesh(em, NULL, 0, 0);
+ mirr_derived = mirror_make_derived_from_derived(&mmd, obedit, init_derived, TRUE);
+ if(mirr_derived != init_derived)
+ init_derived->release(init_derived);
+
+ tot_faces = mirr_derived->getNumPolys(mirr_derived);
+ orig_verts = CustomData_get_layer(&mirr_derived->vertData, CD_ORIGINDEX);
+ orig_faces = CustomData_get_layer(&mirr_derived->polyData, CD_ORIGINDEX);
+ face_array = mirr_derived->getPolyArray(mirr_derived);
+ loop_array = mirr_derived->getLoopArray(mirr_derived);
+ vert_array = mirr_derived->getVertArray(mirr_derived);
+ } else {
+ tot_faces = em->bm->totface;
}
+ EDBM_index_arrays_init(em, 0, 0, 1);
+
BLI_srand(0);
- BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) {
+ for (fi = 0; fi < tot_faces; fi++) {
+// BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) {
MTexPoly *tf;
ScanFillVert *sf_vert, *sf_vert_last, *sf_vert_first;
ScanFillFace *sf_tri;
@@ -261,8 +287,18 @@
BMLoop *ls[3];
float *co[4];
float *uv[4];
- int i, lsel;
+ int i, lsel, len;
+ if (mirrored) {
+ poly = face_array + fi;
+ len = poly->totloop;
+ efa = EDBM_face_at_index(em, orig_faces[fi]);
+ }
+ else {
+ efa = EDBM_face_at_index(em, fi);
+ len = efa->len;
+ }
+
if ((BM_elem_flag_test(efa, BM_ELEM_HIDDEN)) || (sel && BM_elem_flag_test(efa, BM_ELEM_SELECT) == 0))
continue;
@@ -277,26 +313,69 @@
if (implicit && !lsel)
continue;
+ if (mirrored)
+ key = (ParamKey)poly;
+ else
+ key = (ParamKey)efa;
- key = (ParamKey)efa;
-
tf = CustomData_bmesh_get(&em->bm->pdata, efa->head.data, CD_MTEXPOLY);
- if (efa->len == 3 || efa->len == 4) {
+ if (len == 3 || len == 4) {
/* for quads let parametrize split, it can make better decisions
* about which split is best for unwrapping than scanfill */
- i = 0;
- BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
- MLoopUV *luv = CustomData_bmesh_get(&em->bm->ldata, l->head.data, CD_MLOOPUV);
- vkeys[i] = (ParamKey)BM_elem_index_get(l->v);
- co[i] = l->v->co;
- uv[i] = luv->uv;
- pin[i] = (luv->flag & MLOOPUV_PINNED) != 0;
- select[i] = uvedit_uv_select_test(em, scene, l) != 0;
+ BM_ITER_ELEM_INDEX (l, &liter, efa, BM_LOOPS_OF_FACE, i) {
+ MLoopUV *luv;
+ if (mirrored) {
+ int orig_index = orig_verts[loop_array[poly->loopstart + i].v];
- i++;
- }
+ BMLoop *tmpl;
+ BMIter liter2;
+ int itmp;
+ int is_mirror;
+ for (itmp = 0; itmp < poly->totloop; itmp++)
+ if(orig_verts[loop_array[poly->loopstart + itmp].v] == ORIGINDEX_NONE)
+ is_mirror = TRUE;
+
+ vkeys[i] = (ParamKey)loop_array[poly->loopstart + i].v;
+
+ if(!is_mirror) {
+ luv = CustomData_bmesh_get(&em->bm->ldata, l->head.data, CD_MLOOPUV);
+
+ co[i] = l->v->co;
+ uv[i] = luv->uv;
+ pin[i] = (luv->flag & MLOOPUV_PINNED) != 0;
+ select[i] = uvedit_uv_select_test(em, scene, l) != 0;
+ } else {
+ if (orig_index != ORIGINDEX_NONE) {
+ BM_ITER_ELEM_INDEX (tmpl, &liter2, efa, BM_LOOPS_OF_FACE, itmp)
+ if (BM_elem_index_get(tmpl->v) == orig_index)
+ break;
+
+ luv = CustomData_bmesh_get(&em->bm->ldata, tmpl->head.data, CD_MLOOPUV);
+
+ co[i] = tmpl->v->co;
+ uv[i] = luv->uv;
+ pin[i] = (luv->flag & MLOOPUV_PINNED) != 0;
+ select[i] = uvedit_uv_select_test(em, scene, tmpl) != 0;
+ } else {
+ co[i] = vert_array[loop_array[poly->loopstart + i].v].co;
+ uv[i] = NULL;
+ pin[i] = FALSE;
+ select[i] = FALSE;
+ }
+ }
+ } else {
+ luv = CustomData_bmesh_get(&em->bm->ldata, l->head.data, CD_MLOOPUV);
+ vkeys[i] = (ParamKey)BM_elem_index_get(l->v);
+
+ co[i] = l->v->co;
+ uv[i] = luv->uv;
+ pin[i] = (luv->flag & MLOOPUV_PINNED) != 0;
+ select[i] = uvedit_uv_select_test(em, scene, l) != 0;
+ }
+ }
+
param_face_add(handle, key, i, vkeys, co, uv, pin, select, &tf->unwrap);
}
else {
@@ -360,6 +439,11 @@
}
}
+ if(mirrored)
+ mirr_derived->release(mirr_derived);
+ else
+ EDBM_index_arrays_free(em);
+
param_construct_end(handle, fill, implicit);
return handle;
More information about the Bf-blender-cvs
mailing list