[Bf-blender-cvs] [afa59d1] soc-2016-uv_tools: Added "Pack islands" option to Unwrap operator, to give artists the possibility to not automatically pack after unwrapping
Phil Gosch
noreply at git.blender.org
Mon May 23 19:20:32 CEST 2016
Commit: afa59d100a043e17e22fab5abb4376bc5efda7e2
Author: Phil Gosch
Date: Wed May 4 23:15:34 2016 +0200
Branches: soc-2016-uv_tools
https://developer.blender.org/rBafa59d100a043e17e22fab5abb4376bc5efda7e2
Added "Pack islands" option to Unwrap operator, to give artists the possibility to not automatically pack after unwrapping
===================================================================
M source/blender/editors/uvedit/uvedit_parametrizer.c
M source/blender/editors/uvedit/uvedit_parametrizer.h
M source/blender/editors/uvedit/uvedit_unwrap_ops.c
M source/blender/makesdna/DNA_scene_types.h
===================================================================
diff --git a/source/blender/editors/uvedit/uvedit_parametrizer.c b/source/blender/editors/uvedit/uvedit_parametrizer.c
index 59f9cd1..45c0649 100644
--- a/source/blender/editors/uvedit/uvedit_parametrizer.c
+++ b/source/blender/editors/uvedit/uvedit_parametrizer.c
@@ -4657,6 +4657,52 @@ void param_scale(ParamHandle *handle, float x, float y)
}
}
+void param_scale_bounds(ParamHandle *handle)
+{
+ PHandle *phandle = (PHandle *)handle;
+ PChart *chart;
+ int i;
+
+ for (i = 0; i < phandle->ncharts; i++) {
+ chart = phandle->charts[i];
+
+ float tot_width, tot_height, scale;
+ float minv[2], maxv[2], trans[2];
+
+ /* Compute bounds of chart */
+ p_chart_uv_bbox(chart, minv, maxv);
+
+ /* Move center to 0,0 */
+ trans[0] = (minv[0] + maxv[0]) / -2.0f;
+ trans[1] = (minv[1] + maxv[1]) / -2.0f;
+ p_chart_uv_translate(chart, trans);
+
+ /* Compute width/height of bounds */
+ if (signf(minv[0]) != signf(maxv[0]))
+ tot_width = fabsf(minv[0]) + fabsf(maxv[0]);
+ else
+ tot_width = maxv[0] - minv[0];
+
+ if (signf(minv[1]) != signf(maxv[1]))
+ tot_height = fabsf(minv[1]) + fabsf(maxv[1]);
+ else
+ tot_height = maxv[1] - minv[1];
+
+ if (tot_height > tot_width)
+ scale = 1.0f / tot_height;
+ else
+ scale = 1.0f / tot_width;
+
+ /* Scale to fit UV area */
+ p_chart_uv_scale(chart, scale);
+
+ /* Move chart to center of UV Space*/
+ trans[0] = 0.5f;
+ trans[1] = 0.5f;
+ p_chart_uv_translate(chart, trans);
+ }
+}
+
void param_flush(ParamHandle *handle)
{
PHandle *phandle = (PHandle *)handle;
diff --git a/source/blender/editors/uvedit/uvedit_parametrizer.h b/source/blender/editors/uvedit/uvedit_parametrizer.h
index eaea781..efbaae7 100644
--- a/source/blender/editors/uvedit/uvedit_parametrizer.h
+++ b/source/blender/editors/uvedit/uvedit_parametrizer.h
@@ -109,6 +109,10 @@ void param_average(ParamHandle *handle);
void param_scale(ParamHandle *handle, float x, float y);
+/* Scale to bounds */
+
+void param_scale_bounds(ParamHandle *handle);
+
/* Flushing */
void param_flush(ParamHandle *handle);
diff --git a/source/blender/editors/uvedit/uvedit_unwrap_ops.c b/source/blender/editors/uvedit/uvedit_unwrap_ops.c
index 8e4ba4c..1d16146 100644
--- a/source/blender/editors/uvedit/uvedit_unwrap_ops.c
+++ b/source/blender/editors/uvedit/uvedit_unwrap_ops.c
@@ -1146,6 +1146,7 @@ void ED_unwrap_lscm(Scene *scene, Object *obedit, const short sel)
const bool fill_holes = (scene->toolsettings->uvcalc_flag & UVCALC_FILLHOLES) != 0;
const bool correct_aspect = (scene->toolsettings->uvcalc_flag & UVCALC_NO_ASPECT_CORRECT) == 0;
+ const bool pack_islands = (scene->toolsettings->uvcalc_flag & UVCALC_PACKISLANDS) != 0;
bool use_subsurf;
modifier_unwrap_state(obedit, scene, &use_subsurf);
@@ -1160,7 +1161,10 @@ void ED_unwrap_lscm(Scene *scene, Object *obedit, const short sel)
param_lscm_end(handle);
param_average(handle);
- param_pack(handle, scene->toolsettings->uvcalc_margin, false);
+ if (pack_islands)
+ param_pack(handle, scene->toolsettings->uvcalc_margin, false);
+ else
+ param_scale_bounds(handle);
param_flush(handle);
@@ -1175,6 +1179,7 @@ static int unwrap_exec(bContext *C, wmOperator *op)
int method = RNA_enum_get(op->ptr, "method");
const bool fill_holes = RNA_boolean_get(op->ptr, "fill_holes");
const bool correct_aspect = RNA_boolean_get(op->ptr, "correct_aspect");
+ const bool pack_islands = RNA_boolean_get(op->ptr, "pack_islands");
const bool use_subsurf = RNA_boolean_get(op->ptr, "use_subsurf_data");
bool use_subsurf_final;
float obsize[3];
@@ -1215,6 +1220,9 @@ static int unwrap_exec(bContext *C, wmOperator *op)
if (correct_aspect) scene->toolsettings->uvcalc_flag &= ~UVCALC_NO_ASPECT_CORRECT;
else scene->toolsettings->uvcalc_flag |= UVCALC_NO_ASPECT_CORRECT;
+ if (pack_islands) scene->toolsettings->uvcalc_flag |= UVCALC_PACKISLANDS;
+ else scene->toolsettings->uvcalc_flag &= ~UVCALC_PACKISLANDS;
+
if (use_subsurf) scene->toolsettings->uvcalc_flag |= UVCALC_USESUBSURF;
else scene->toolsettings->uvcalc_flag &= ~UVCALC_USESUBSURF;
@@ -1258,6 +1266,8 @@ void UV_OT_unwrap(wmOperatorType *ot)
"Virtual fill holes in mesh before unwrapping, to better avoid overlaps and preserve symmetry");
RNA_def_boolean(ot->srna, "correct_aspect", 1, "Correct Aspect",
"Map UVs taking image aspect ratio into account");
+ RNA_def_boolean(ot->srna, "pack_islands", 1, "Pack Islands",
+ "Pack UV islands after unwrapping");
RNA_def_boolean(ot->srna, "use_subsurf_data", 0, "Use Subsurf Modifier",
"Map UVs taking vertex position after subsurf into account");
RNA_def_float_factor(ot->srna, "margin", 0.001f, 0.0f, 1.0f, "Margin", "Space between islands", 0.0f, 1.0f);
diff --git a/source/blender/makesdna/DNA_scene_types.h b/source/blender/makesdna/DNA_scene_types.h
index 1bf044f..1f9b52c 100644
--- a/source/blender/makesdna/DNA_scene_types.h
+++ b/source/blender/makesdna/DNA_scene_types.h
@@ -2040,6 +2040,7 @@ typedef enum ImagePaintMode {
#define UVCALC_NO_ASPECT_CORRECT 2 /* would call this UVCALC_ASPECT_CORRECT, except it should be default with old file */
#define UVCALC_TRANSFORM_CORRECT 4 /* adjust UV's while transforming to avoid distortion */
#define UVCALC_USESUBSURF 8 /* Use mesh data after subsurf to compute UVs*/
+#define UVCALC_PACKISLANDS 16 /* Pack Islands after unwrapping*/
/* toolsettings->uv_flag */
#define UV_SYNC_SELECTION 1
More information about the Bf-blender-cvs
mailing list