[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [14751] trunk/blender/source/blender/src:
Brecht Van Lommel
brechtvanlommel at pandora.be
Thu May 8 22:38:38 CEST 2008
Revision: 14751
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=14751
Author: blendix
Date: 2008-05-08 22:38:38 +0200 (Thu, 08 May 2008)
Log Message:
-----------
Bugfix: unwrap pinning did not work correct with aspect ratio option.
Modified Paths:
--------------
trunk/blender/source/blender/src/parametrizer.c
trunk/blender/source/blender/src/parametrizer.h
trunk/blender/source/blender/src/parametrizer_intern.h
trunk/blender/source/blender/src/unwrapper.c
Modified: trunk/blender/source/blender/src/parametrizer.c
===================================================================
--- trunk/blender/source/blender/src/parametrizer.c 2008-05-08 20:10:50 UTC (rev 14750)
+++ trunk/blender/source/blender/src/parametrizer.c 2008-05-08 20:38:38 UTC (rev 14751)
@@ -389,7 +389,7 @@
/* Loading / Flushing */
-static void p_vert_load_pin_select_uvs(PVert *v)
+static void p_vert_load_pin_select_uvs(PHandle *handle, PVert *v)
{
PEdge *e;
int nedges = 0, npins = 0;
@@ -404,13 +404,13 @@
v->flag |= PVERT_SELECT;
if (e->flag & PEDGE_PIN) {
- pinuv[0] += e->orig_uv[0];
- pinuv[1] += e->orig_uv[1];
+ pinuv[0] += e->orig_uv[0]*handle->aspx;
+ pinuv[1] += e->orig_uv[1]*handle->aspy;
npins++;
}
else {
- v->uv[0] += e->orig_uv[0];
- v->uv[1] += e->orig_uv[1];
+ v->uv[0] += e->orig_uv[0]*handle->aspx;
+ v->uv[1] += e->orig_uv[1]*handle->aspy;
}
nedges++;
@@ -430,27 +430,27 @@
}
}
-static void p_flush_uvs(PChart *chart)
+static void p_flush_uvs(PHandle *handle, PChart *chart)
{
PEdge *e;
for (e=chart->edges; e; e=e->nextlink) {
if (e->orig_uv) {
- e->orig_uv[0] = e->vert->uv[0];
- e->orig_uv[1] = e->vert->uv[1];
+ e->orig_uv[0] = e->vert->uv[0]/handle->aspx;
+ e->orig_uv[1] = e->vert->uv[1]/handle->aspy;
}
}
}
-static void p_flush_uvs_blend(PChart *chart, float blend)
+static void p_flush_uvs_blend(PHandle *handle, PChart *chart, float blend)
{
PEdge *e;
float invblend = 1.0f - blend;
for (e=chart->edges; e; e=e->nextlink) {
if (e->orig_uv) {
- e->orig_uv[0] = blend*e->old_uv[0] + invblend*e->vert->uv[0];
- e->orig_uv[1] = blend*e->old_uv[1] + invblend*e->vert->uv[1];
+ e->orig_uv[0] = blend*e->old_uv[0] + invblend*e->vert->uv[0]/handle->aspx;
+ e->orig_uv[1] = blend*e->old_uv[1] + invblend*e->vert->uv[1]/handle->aspy;
}
}
}
@@ -2813,7 +2813,7 @@
}
}
-static PBool p_chart_lscm_solve(PChart *chart)
+static PBool p_chart_lscm_solve(PHandle *handle, PChart *chart)
{
PVert *v, *pin1 = chart->u.lscm.pin1, *pin2 = chart->u.lscm.pin2;
PFace *f;
@@ -2830,7 +2830,7 @@
for (v=chart->verts; v; v=v->nextlink)
if (v->flag & PVERT_PIN)
- p_vert_load_pin_select_uvs(v); /* reload for live */
+ p_vert_load_pin_select_uvs(handle, v); /* reload for live */
if (chart->u.lscm.pin1) {
nlLockVariable(2*pin1->u.id);
@@ -3860,6 +3860,8 @@
handle->construction_chart = p_chart_new(handle);
handle->state = PHANDLE_STATE_ALLOCATED;
handle->arena = BLI_memarena_new((1<<16));
+ handle->aspx = 1.0f;
+ handle->aspy = 1.0f;
handle->hash_verts = phash_new((PHashLink**)&handle->construction_chart->verts, 1);
handle->hash_edges = phash_new((PHashLink**)&handle->construction_chart->edges, 1);
@@ -3868,6 +3870,14 @@
return (ParamHandle*)handle;
}
+void param_aspect_ratio(ParamHandle *handle, float aspx, float aspy)
+{
+ PHandle *phandle = (PHandle*)handle;
+
+ phandle->aspx = aspx;
+ phandle->aspy = aspy;
+}
+
void param_delete(ParamHandle *handle)
{
PHandle *phandle = (PHandle*)handle;
@@ -3968,7 +3978,7 @@
p_chart_fill_boundaries(chart, outer);
for (v=chart->verts; v; v=v->nextlink)
- p_vert_load_pin_select_uvs(v);
+ p_vert_load_pin_select_uvs(handle, v);
}
phandle->ncharts = j;
@@ -4005,7 +4015,7 @@
chart = phandle->charts[i];
if (chart->u.lscm.context) {
- result = p_chart_lscm_solve(chart);
+ result = p_chart_lscm_solve(phandle, chart);
if (result && !(chart->flag & PCHART_NOPACK))
p_chart_rotate_minimum_area(chart);
@@ -4128,6 +4138,9 @@
if (phandle->ncharts == 0)
return;
+ if(phandle->aspx != phandle->aspy)
+ param_scale(handle, 1.0f/phandle->aspx, 1.0f/phandle->aspy);
+
/* we may not use all these boxes */
boxarray = MEM_mallocN( phandle->ncharts*sizeof(boxPack), "boxPack box");
@@ -4170,9 +4183,11 @@
p_chart_uv_scale(chart, scale);
}
MEM_freeN(boxarray);
+
+ if(phandle->aspx != phandle->aspy)
+ param_scale(handle, phandle->aspx, phandle->aspy);
}
-
void param_average(ParamHandle *handle)
{
PChart *chart;
@@ -4255,9 +4270,9 @@
continue;
if (phandle->blend == 0.0f)
- p_flush_uvs(chart);
+ p_flush_uvs(phandle, chart);
else
- p_flush_uvs_blend(chart, phandle->blend);
+ p_flush_uvs_blend(phandle, chart, phandle->blend);
}
}
Modified: trunk/blender/source/blender/src/parametrizer.h
===================================================================
--- trunk/blender/source/blender/src/parametrizer.h 2008-05-08 20:10:50 UTC (rev 14750)
+++ trunk/blender/source/blender/src/parametrizer.h 2008-05-08 20:38:38 UTC (rev 14751)
@@ -26,6 +26,8 @@
ParamHandle *param_construct_begin();
+void param_aspect_ratio(ParamHandle *handle, float aspx, float aspy);
+
void param_face_add(ParamHandle *handle,
ParamKey key,
int nverts,
Modified: trunk/blender/source/blender/src/parametrizer_intern.h
===================================================================
--- trunk/blender/source/blender/src/parametrizer_intern.h 2008-05-08 20:10:50 UTC (rev 14750)
+++ trunk/blender/source/blender/src/parametrizer_intern.h 2008-05-08 20:38:38 UTC (rev 14751)
@@ -184,6 +184,8 @@
PChart **charts;
int ncharts;
+ float aspx, aspy;
+
RNG *rng;
float blend;
} PHandle;
Modified: trunk/blender/source/blender/src/unwrapper.c
===================================================================
--- trunk/blender/source/blender/src/unwrapper.c 2008-05-08 20:10:50 UTC (rev 14750)
+++ trunk/blender/source/blender/src/unwrapper.c 2008-05-08 20:38:38 UTC (rev 14751)
@@ -200,6 +200,19 @@
ParamHandle *handle;
handle = param_construct_begin();
+
+ if ((G.scene->toolsettings->uvcalc_flag & UVCALC_NO_ASPECT_CORRECT)==0) {
+ EditMesh *em = G.editMesh;
+ EditFace *efa = EM_get_actFace(1);
+ if (efa) {
+ float aspx, aspy;
+ MTFace *tface = CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
+ image_final_aspect(tface->tpage, &aspx, &aspy);
+
+ if (aspx!=aspy)
+ param_aspect_ratio(handle, aspx, aspy);
+ }
+ }
/* we need the vert indicies */
for (ev= em->verts.first, a=0; ev; ev= ev->next, a++)
@@ -314,22 +327,7 @@
param_lscm_begin(handle, PARAM_FALSE, abf);
param_lscm_solve(handle);
param_lscm_end(handle);
-
- /* scale before packing */
- if ((G.scene->toolsettings->uvcalc_flag & UVCALC_NO_ASPECT_CORRECT)==0) {
- EditFace *efa = EM_get_actFace(1);
- if (efa) {
- float aspx, aspy;
- MTFace *tface = CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
- image_final_aspect(tface->tpage, &aspx, &aspy);
-
- if (aspx!=aspy) {
- param_scale(handle, 1.0, aspx/aspy);
- }
- }
- }
-
param_pack(handle);
param_flush(handle);
More information about the Bf-blender-cvs
mailing list