[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