[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