[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