[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [13948] trunk/blender/source/blender: Added a feature to the UV editor- Average UV islands, this averages selected UV islands, in proportion to the faces area in 3d space.

Campbell Barton ideasman42 at gmail.com
Mon Mar 3 02:44:35 CET 2008


Revision: 13948
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=13948
Author:   campbellbarton
Date:     2008-03-03 02:44:35 +0100 (Mon, 03 Mar 2008)

Log Message:
-----------
Added a feature to the UV editor- Average UV islands, this averages selected UV islands, in proportion to the faces area in 3d space.

Renamed 'Pack Charts' to 'Pack Islands' (according to google, uv islands is a more common term)

Modified Paths:
--------------
    trunk/blender/source/blender/include/BDR_unwrapper.h
    trunk/blender/source/blender/src/header_image.c
    trunk/blender/source/blender/src/parametrizer.c
    trunk/blender/source/blender/src/parametrizer.h
    trunk/blender/source/blender/src/space.c
    trunk/blender/source/blender/src/unwrapper.c

Modified: trunk/blender/source/blender/include/BDR_unwrapper.h
===================================================================
--- trunk/blender/source/blender/include/BDR_unwrapper.h	2008-03-03 00:43:37 UTC (rev 13947)
+++ trunk/blender/source/blender/include/BDR_unwrapper.h	2008-03-03 01:44:35 UTC (rev 13948)
@@ -41,6 +41,7 @@
 void unwrap_lscm(short seamcut); /* unwrap faces selected in 3d view */
 void minimize_stretch_tface_uv(void); /* optimize faces selected in uv editor */
 void pack_charts_tface_uv(void);
+void average_charts_tface_uv(void);
 
 /* for live mode: no undo pushes, caching for quicky re-unwrap */
 void unwrap_lscm_live_begin(void);

Modified: trunk/blender/source/blender/src/header_image.c
===================================================================
--- trunk/blender/source/blender/src/header_image.c	2008-03-03 00:43:37 UTC (rev 13947)
+++ trunk/blender/source/blender/src/header_image.c	2008-03-03 01:44:35 UTC (rev 13948)
@@ -1043,6 +1043,9 @@
 	case 13:
 		pack_charts_tface_uv();
 		break;
+	case 14:
+		average_charts_tface_uv();
+		break;
 	}
 }
 
@@ -1075,7 +1078,8 @@
 
 	uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");	
 
-	uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Pack Charts|Ctrl P", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 13, "");
+	uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Pack Islands|Ctrl P", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 13, "");
+	uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Average Islands Scale|Ctrl A", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 14, "");
 	uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Minimize Stretch|Ctrl V", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 12, "");
 	uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Limit Stitch...|Shift V", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 3, "");
 	uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Stitch|V", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 4, "");

Modified: trunk/blender/source/blender/src/parametrizer.c
===================================================================
--- trunk/blender/source/blender/src/parametrizer.c	2008-03-03 00:43:37 UTC (rev 13947)
+++ trunk/blender/source/blender/src/parametrizer.c	2008-03-03 01:44:35 UTC (rev 13948)
@@ -4164,6 +4164,64 @@
 	MEM_freeN(boxarray);
 }
 
+
+void param_average(ParamHandle *handle)
+{
+	PChart *chart;
+	int i;
+	float tot_uvarea = 0.0f, tot_facearea = 0.0f;
+	float tot_fac, fac;
+	float minv[2], maxv[2], trans[2];
+	PHandle *phandle = (PHandle*)handle;
+	
+	if (phandle->ncharts == 0)
+		return;
+	
+	for (i = 0; i < phandle->ncharts; i++) {
+		PFace *f;
+		chart = phandle->charts[i];
+		
+		chart->u.pack.area = 0.0f; /* 3d area */
+		chart->u.pack.rescale = 0.0f; /* UV area, abusing rescale for tmp storage, oh well :/ */
+		
+		for (f=chart->faces; f; f=f->nextlink) {
+			chart->u.pack.area += p_face_area(f);
+			chart->u.pack.rescale += fabs(p_face_uv_area_signed(f));
+		}
+		
+		tot_facearea += chart->u.pack.area;
+		tot_uvarea += chart->u.pack.rescale;
+	}
+	
+	if (tot_facearea == tot_uvarea || tot_facearea==0.0f || tot_uvarea==0.0f) {
+		/* nothing to do */
+		return;
+	}
+	
+	tot_fac = tot_facearea/tot_uvarea;
+	
+	for (i = 0; i < phandle->ncharts; i++) {
+		chart = phandle->charts[i];
+		if (chart->u.pack.area != 0.0f && chart->u.pack.rescale != 0.0f) {
+			fac = chart->u.pack.area / chart->u.pack.rescale;
+			
+			/* Get the island center */
+			p_chart_uv_bbox(chart, minv, maxv);
+			trans[0] = (minv[0] + maxv[0]) /-2.0f;
+			trans[1] = (minv[1] + maxv[1]) /-2.0f;
+			
+			/* Move center to 0,0 */
+			p_chart_uv_translate(chart, trans);
+			p_chart_uv_scale(chart, sqrt(fac / tot_fac));
+			
+			/* Move to original center */
+			trans[0] = -trans[0];
+			trans[1] = -trans[1];
+			p_chart_uv_translate(chart, trans);
+		}
+	}
+}
+
 void param_flush(ParamHandle *handle)
 {
 	PHandle *phandle = (PHandle*)handle;

Modified: trunk/blender/source/blender/src/parametrizer.h
===================================================================
--- trunk/blender/source/blender/src/parametrizer.h	2008-03-03 00:43:37 UTC (rev 13947)
+++ trunk/blender/source/blender/src/parametrizer.h	2008-03-03 01:44:35 UTC (rev 13948)
@@ -71,6 +71,10 @@
 
 void param_pack(ParamHandle *handle);
 
+/* Average area for all charts */
+
+void param_average(ParamHandle *handle);
+
 /* Flushing */
 
 void param_flush(ParamHandle *handle);

Modified: trunk/blender/source/blender/src/space.c
===================================================================
--- trunk/blender/source/blender/src/space.c	2008-03-03 00:43:37 UTC (rev 13947)
+++ trunk/blender/source/blender/src/space.c	2008-03-03 01:44:35 UTC (rev 13948)
@@ -5190,7 +5190,11 @@
 				mouse_select_sima();
 				break;
 			case AKEY:
-				select_swap_tface_uv();
+				if(G.qual==0) {
+					select_swap_tface_uv();
+				} else if(G.qual==LR_CTRLKEY) {
+					average_charts_tface_uv();
+				}
 				break;
 			case BKEY:
 				if(G.qual==LR_SHIFTKEY)

Modified: trunk/blender/source/blender/src/unwrapper.c
===================================================================
--- trunk/blender/source/blender/src/unwrapper.c	2008-03-03 00:43:37 UTC (rev 13947)
+++ trunk/blender/source/blender/src/unwrapper.c	2008-03-03 01:44:35 UTC (rev 13948)
@@ -434,7 +434,7 @@
 	param_flush(handle);
 	param_delete(handle);
 
-	BIF_undo_push("UV pack charts");
+	BIF_undo_push("UV pack islands");
 
 	object_uvs_changed(OBACT);
 
@@ -442,6 +442,27 @@
 	allqueue(REDRAWIMAGE, 0);
 }
 
+
+void average_charts_tface_uv(void)
+{
+	EditMesh *em = G.editMesh;
+	ParamHandle *handle;
+	
+	if(!EM_texFaceCheck()) return;
+
+	handle = construct_param_handle(em, 1, 0, 1);
+	param_average(handle);
+	param_flush(handle);
+	param_delete(handle);
+
+	BIF_undo_push("UV average island scale");
+
+	object_uvs_changed(OBACT);
+
+	allqueue(REDRAWVIEW3D, 0);
+	allqueue(REDRAWIMAGE, 0);
+}
+
 /* LSCM live mode */
 
 static ParamHandle *liveHandle = NULL;





More information about the Bf-blender-cvs mailing list