[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [19768] trunk/blender/source/blender/src/ parametrizer.c: packing from the UV window with margin had a problem with feedback, so running again and again would give different results.

Campbell Barton ideasman42 at gmail.com
Fri Apr 17 08:21:50 CEST 2009


Revision: 19768
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=19768
Author:   campbellbarton
Date:     2009-04-17 08:21:49 +0200 (Fri, 17 Apr 2009)

Log Message:
-----------
packing from the UV window with margin had a problem with feedback, so running again and again would give different results.
Scale the margin by the combined area of all boxes to give predictable results.

Modified Paths:
--------------
    trunk/blender/source/blender/src/parametrizer.c

Modified: trunk/blender/source/blender/src/parametrizer.c
===================================================================
--- trunk/blender/source/blender/src/parametrizer.c	2009-04-17 02:33:14 UTC (rev 19767)
+++ trunk/blender/source/blender/src/parametrizer.c	2009-04-17 06:21:49 UTC (rev 19768)
@@ -4134,6 +4134,7 @@
 	PChart *chart;
 	int i, unpacked=0;
 	float trans[2];
+	double area= 0.0;
 	
 	PHandle *phandle = (PHandle*)handle;
 	
@@ -4146,6 +4147,7 @@
 	/* we may not use all these boxes */
 	boxarray = MEM_mallocN( phandle->ncharts*sizeof(boxPack), "boxPack box");
 	
+	
 	for (i = 0; i < phandle->ncharts; i++) {
 		chart = phandle->charts[i];
 		
@@ -4158,14 +4160,40 @@
 		
 		p_chart_uv_bbox(chart, trans, chart->u.pack.size);
 		
-		trans[0] = -(trans[0] - margin);
-		trans[1] = -(trans[1] - margin);
+		trans[0] = -trans[0];
+		trans[1] = -trans[1];
 		
 		p_chart_uv_translate(chart, trans);
 		
-		box->w =  (chart->u.pack.size[0] + trans[0]) + margin*2;
-		box->h =  (chart->u.pack.size[1] + trans[1]) + margin*2;
+		box->w =  chart->u.pack.size[0] + trans[0];
+		box->h =  chart->u.pack.size[1] + trans[1];
 		box->index = i; /* warning this index skips PCHART_NOPACK boxes */
+		
+		if(margin>0.0f)
+			area += sqrt(box->w*box->h);
+	}	
+	
+	if(margin>0.0f) {
+		/* multiply the margin by the area to give pradictable results not dependant on UV scale,
+		 * ...Without using the area running pack multiple times also gives a bad feedback loop.
+		 * multiply by 0.1 so the margin value from the UI can be from 0.0 to 1.0 but not give a massive margin */
+		margin = (margin*(float)area) * 0.1;
+		unpacked= 0;
+		for (i = 0; i < phandle->ncharts; i++) {
+			chart = phandle->charts[i];
+			
+			if (chart->flag & PCHART_NOPACK) {
+				unpacked++;
+				continue;
+			}
+			
+			box = boxarray+(i-unpacked);
+			trans[0] = margin * area;
+			trans[1] = margin * area;
+			p_chart_uv_translate(chart, trans);
+			box->w += (margin * area) *2;
+			box->h += (margin * area) *2;
+		}
 	}
 	
 	boxPack2D(boxarray, phandle->ncharts-unpacked, &tot_width, &tot_height);





More information about the Bf-blender-cvs mailing list