Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBrecht Van Lommel <brechtvanlommel@gmail.com>2018-12-21 13:43:28 +0300
committerBrecht Van Lommel <brechtvanlommel@gmail.com>2018-12-21 18:34:08 +0300
commite56aa4ff0c6b2a1746d5c39e297c9f6f56c4b492 (patch)
tree2dfe9e2dd8de893bf3988abe213db1041822e1fe /source/blender/editors/uvedit/uvedit_parametrizer.c
parentbf168a05cd388c02359e52e4ae674c89f13c96a6 (diff)
Fix T59668: UV unwrap pinning bugs.
With multi object editing it creates the charts twice, which broke some logic in the unwrapper.
Diffstat (limited to 'source/blender/editors/uvedit/uvedit_parametrizer.c')
-rw-r--r--source/blender/editors/uvedit/uvedit_parametrizer.c33
1 files changed, 18 insertions, 15 deletions
diff --git a/source/blender/editors/uvedit/uvedit_parametrizer.c b/source/blender/editors/uvedit/uvedit_parametrizer.c
index c2775014519..ded4a4899c7 100644
--- a/source/blender/editors/uvedit/uvedit_parametrizer.c
+++ b/source/blender/editors/uvedit/uvedit_parametrizer.c
@@ -208,7 +208,7 @@ typedef struct PChart {
} PChart;
enum PChartFlag {
- PCHART_NOPACK = 1
+ PCHART_HAS_PINS = 1
};
enum PHandleState {
@@ -996,6 +996,10 @@ static void p_split_vert(PChart *chart, PEdge *e)
PVert *v = e->vert;
PBool copy = P_TRUE;
+ if (e->flag & PEDGE_PIN) {
+ chart->flag |= PCHART_HAS_PINS;
+ }
+
if (e->flag & PEDGE_VERTEX_SPLIT)
return;
@@ -3062,9 +3066,6 @@ static void p_chart_lscm_begin(PChart *chart, PBool live, PBool abf)
chart->u.lscm.pin1 = pin1;
chart->u.lscm.pin2 = pin2;
}
- else {
- chart->flag |= PCHART_NOPACK;
- }
for (v = chart->verts; v; v = v->nextlink)
v->u.id = id++;
@@ -4350,7 +4351,7 @@ void param_lscm_solve(ParamHandle *handle)
if (chart->u.lscm.context) {
result = p_chart_lscm_solve(phandle, chart);
- if (result && !(chart->flag & PCHART_NOPACK))
+ if (result && !(chart->flag & PCHART_HAS_PINS))
p_chart_rotate_minimum_area(chart);
if (!result || (chart->u.lscm.pin1))
@@ -4457,7 +4458,7 @@ void param_smooth_area(ParamHandle *handle)
}
/* don't pack, just rotate (used for better packing) */
-static void param_pack_rotate(ParamHandle *handle)
+static void param_pack_rotate(ParamHandle *handle, bool ignore_pinned)
{
PChart *chart;
int i;
@@ -4470,7 +4471,7 @@ static void param_pack_rotate(ParamHandle *handle)
chart = phandle->charts[i];
- if (chart->flag & PCHART_NOPACK) {
+ if (ignore_pinned && (chart->flag & PCHART_HAS_PINS)) {
continue;
}
@@ -4490,7 +4491,7 @@ static void param_pack_rotate(ParamHandle *handle)
}
}
-void param_pack(ParamHandle *handle, float margin, bool do_rotate)
+void param_pack(ParamHandle *handle, float margin, bool do_rotate, bool ignore_pinned)
{
/* box packing variables */
BoxPack *boxarray, *box;
@@ -4508,7 +4509,7 @@ void param_pack(ParamHandle *handle, float margin, bool do_rotate)
/* this could be its own function */
if (do_rotate) {
- param_pack_rotate(handle);
+ param_pack_rotate(handle, ignore_pinned);
}
if (phandle->aspx != phandle->aspy)
@@ -4521,7 +4522,7 @@ void param_pack(ParamHandle *handle, float margin, bool do_rotate)
for (i = 0; i < phandle->ncharts; i++) {
chart = phandle->charts[i];
- if (chart->flag & PCHART_NOPACK) {
+ if (ignore_pinned && (chart->flag & PCHART_HAS_PINS)) {
unpacked++;
continue;
}
@@ -4537,7 +4538,7 @@ void param_pack(ParamHandle *handle, float margin, bool do_rotate)
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 */
+ box->index = i; /* warning this index skips PCHART_HAS_PINS boxes */
if (margin > 0.0f)
area += (double)sqrtf(box->w * box->h);
@@ -4552,7 +4553,7 @@ void param_pack(ParamHandle *handle, float margin, bool do_rotate)
for (i = 0; i < phandle->ncharts; i++) {
chart = phandle->charts[i];
- if (chart->flag & PCHART_NOPACK) {
+ if (ignore_pinned && (chart->flag & PCHART_HAS_PINS)) {
unpacked++;
continue;
}
@@ -4588,7 +4589,7 @@ void param_pack(ParamHandle *handle, float margin, bool do_rotate)
param_scale(handle, phandle->aspx, phandle->aspy);
}
-void param_average(ParamHandle *handle)
+void param_average(ParamHandle *handle, bool ignore_pinned)
{
PChart *chart;
int i;
@@ -4604,8 +4605,9 @@ void param_average(ParamHandle *handle)
PFace *f;
chart = phandle->charts[i];
- if (chart->flag & PCHART_NOPACK)
+ if (ignore_pinned && (chart->flag & PCHART_HAS_PINS)) {
continue;
+ }
chart->u.pack.area = 0.0f; /* 3d area */
chart->u.pack.rescale = 0.0f; /* UV area, abusing rescale for tmp storage, oh well :/ */
@@ -4629,8 +4631,9 @@ void param_average(ParamHandle *handle)
for (i = 0; i < phandle->ncharts; i++) {
chart = phandle->charts[i];
- if (chart->flag & PCHART_NOPACK)
+ if (ignore_pinned && (chart->flag & PCHART_HAS_PINS)) {
continue;
+ }
if (chart->u.pack.area != 0.0f && chart->u.pack.rescale != 0.0f) {
fac = chart->u.pack.area / chart->u.pack.rescale;