Commit: 39592039be4ca619a1a6be91dbb738cf920ca7dd Author: Phil Gosch Date: Tue Jul 19 19:48:54 2016 +0200 Branches: soc-2016-uv_tools https://developer.blender.org/rB39592039be4ca619a1a6be91dbb738cf920ca7dd
WIP Simulated Annealing Stubs for storing the best solution and initial scaling of charts =================================================================== 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 =================================================================== diff --git a/source/blender/editors/uvedit/uvedit_parametrizer.c b/source/blender/editors/uvedit/uvedit_parametrizer.c index 71124f5..4e5582b 100644 --- a/source/blender/editors/uvedit/uvedit_parametrizer.c +++ b/source/blender/editors/uvedit/uvedit_parametrizer.c @@ -582,6 +582,18 @@ static void p_chart_uv_scale_origin(PChart *chart, float scale) p_chart_uv_translate(chart, trans); } +static void p_scale_charts(PHandle *handle, float scale) +{ + PChart *chart; + int i; + + for (i = 0; i < handle->ncharts; i++) { + chart = handle->charts[i]; + + p_chart_uv_scale(chart, scale); + } +} + static void UNUSED_FUNCTION(p_chart_uv_from_array)(PChart *chart, float (*points)[2]) { PVert *v; @@ -5408,7 +5420,7 @@ void param_irregular_pack_begin(ParamHandle *handle, float *w_area) PFace *f; int npoint, right, i, j; unsigned int seed = 31415926; - float used_area; + float used_area, init_scale, init_value = 0.9f; param_assert(phandle->state == PHANDLE_STATE_CONSTRUCTED); phandle->state = PHANDLE_STATE_PACK; @@ -5427,7 +5439,10 @@ void param_irregular_pack_begin(ParamHandle *handle, float *w_area) } /* Set initial scale of charts */ - /* ToDo SaphireS: Idea: set initial scale so that combined chart area is about 1.0 of UV area */ + /* ToDo: Do this in p_compute_packing_solution */ + /*used_area = p_face_uv_area_combined(handle); + init_scale = (1.0f / used_area) * init_value; + p_scale_charts(handle, init_scale);*/ /* Compute convex hull for each chart -> CW */ chart->u.ipack.convex_hull = p_convex_hull_new(chart); @@ -5856,6 +5871,25 @@ void param_flush_restore(ParamHandle *handle) } } +void param_store_packing_solution(ParamHandle *handle) +{ + PHandle *phandle = (PHandle *)handle; + PChart *chart; + int i; + + for (i = 0; i < phandle->ncharts; i++) { + chart = phandle->charts[i]; + //chart->u.ipack.best_pos->x = chart->uv[0]; + //chart->u.ipack.best_pos->y = chart->uv[1]; + //chart->u.ipack.best_scale = chart-> ? + } +} + +void param_restore_packing_solution(ParamHandle *handle) +{ + +} + /* XXX (SaphireS): Remove */ void param_test(ParamHandle *handle) { diff --git a/source/blender/editors/uvedit/uvedit_parametrizer.h b/source/blender/editors/uvedit/uvedit_parametrizer.h index 710d4fd..0935a8d 100644 --- a/source/blender/editors/uvedit/uvedit_parametrizer.h +++ b/source/blender/editors/uvedit/uvedit_parametrizer.h @@ -108,6 +108,8 @@ void param_pack(ParamHandle *handle, float margin, bool do_rotate); void param_irregular_pack_begin(ParamHandle *handle); void param_irregular_pack_iter(ParamHandle *handle, float *w_area, unsigned int seed); void param_irregular_pack_end(ParamHandle *handle); +void param_store_packing_solution(ParamHandle *handle); +void param_restore_packing_solution(ParamHandle *handle); /* Average area for all charts */ diff --git a/source/blender/editors/uvedit/uvedit_unwrap_ops.c b/source/blender/editors/uvedit/uvedit_unwrap_ops.c index 2708f97..b8b2e83 100644 --- a/source/blender/editors/uvedit/uvedit_unwrap_ops.c +++ b/source/blender/editors/uvedit/uvedit_unwrap_ops.c @@ -901,7 +901,7 @@ static void irregular_pack_islands_iteration(bContext *C, wmOperator *op, bool i float wasted_area = 0.0f, dE, r1, r2; float a = 0.95f; /*ToDo SaphireS: Make operator parameter for testing */ /* ToDo Saphires: Find optimal parameter */ - float k = 5.670367e-8f; /* Stefan-Boltzman constant-like parameter */ + float k = 0.5f; /* Stefan-Boltzman constant-like parameter */ int local_iter_max = 50; pi->iter_global++; @@ -923,6 +923,7 @@ static void irregular_pack_islands_iteration(bContext *C, wmOperator *op, bool i if (dE < 0) { /* Current solution is new best solution */ /* ToDo SaphireS: Store last best solution */ + param_store_packing_solution(pi->handle); pi->wasted_area_last = wasted_area; } else { @@ -933,6 +934,7 @@ static void irregular_pack_islands_iteration(bContext *C, wmOperator *op, bool i if (r1 < r2) { /* Current solution is new best solution */ /* ToDo SaphireS: Store last best solution */ + param_store_packing_solution(pi->handle); pi->wasted_area_last = wasted_area; } else { @@ -950,7 +952,7 @@ static void irregular_pack_islands_iteration(bContext *C, wmOperator *op, bool i if (sa) { BLI_snprintf(str, sizeof(str), - IFACE_("Pack Islands (irregular). Iteration: %i, Wasted UV Area: %f"), pi->iter_global, pi->wasted_area_last); + IFACE_("Pack Islands (irregular). Iteration: %i, Wasted UV Area (Best Solution): %f"), pi->iter_global, pi->wasted_area_last); ED_area_headerprint(sa, str); } @@ -971,10 +973,13 @@ static void irregular_pack_islands_exit(bContext *C, wmOperator *op, bool cancel if (pi->timer) WM_event_remove_timer(CTX_wm_manager(C), CTX_wm_window(C), pi->timer); - if (cancel) - param_flush_restore(pi->handle); /* Restore UVs */ - else + if (cancel) { + param_flush_restore(pi->handle); /* Restore original UVs */ + } + else { + param_restore_packing_solution(pi->handle); /* Restore best solution*/ param_flush(pi->handle); /* Keep new UVs */ + } param_irregular_pack_end(pi->handle); param_delete(pi->handle); _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org https://lists.blender.org/mailman/listinfo/bf-blender-cvs