[Bf-blender-cvs] [dcc8560] soc-2016-uv_tools: WIP: Packing computation
Phil Gosch
noreply at git.blender.org
Thu Jul 7 17:41:27 CEST 2016
Commit: dcc8560102b49a205a963d18b536df0065183167
Author: Phil Gosch
Date: Thu Jul 7 17:40:54 2016 +0200
Branches: soc-2016-uv_tools
https://developer.blender.org/rBdcc8560102b49a205a963d18b536df0065183167
WIP: Packing computation
More functionality and hooking up of functions
Contains even more debug prints and commented code
===================================================================
M source/blender/editors/uvedit/uvedit_parametrizer.c
===================================================================
diff --git a/source/blender/editors/uvedit/uvedit_parametrizer.c b/source/blender/editors/uvedit/uvedit_parametrizer.c
index 74e60d1..876a60d 100644
--- a/source/blender/editors/uvedit/uvedit_parametrizer.c
+++ b/source/blender/editors/uvedit/uvedit_parametrizer.c
@@ -161,6 +161,7 @@ typedef struct PConvexHull {
int ref_vert_index; /* vert with the highest y value, lowest y if reversed */
float min_v[2];
float max_v[2];
+ bool placed;
} PConvexHull;
typedef struct PPointUV{
@@ -4780,6 +4781,7 @@ PConvexHull *p_convex_hull_new(PChart *chart)
conv_hull->h_verts = points;
conv_hull->nverts = npoint;
conv_hull->right = right;
+ conv_hull->placed = false;
/* Fill max/min for initial positioning, with this we also know the bounding rectangle */
p_chart_uv_bbox(chart, conv_hull->min_v, conv_hull->max_v);
@@ -4923,6 +4925,7 @@ PConvexHull *p_convex_hull_reverse_vert_order(PConvexHull *hull)
conv_hull_inv->min_v[1] = hull->min_v[1];
conv_hull_inv->max_v[0] = hull->max_v[0];
conv_hull_inv->max_v[1] = hull->max_v[1];
+ conv_hull_inv->placed = false;
int i, j;
float miny = 1.0e30f;
@@ -5017,32 +5020,32 @@ PNoFitPolygon *p_no_fit_polygon_create(PConvexHull *item, PConvexHull *fixed)
/* ToDo SaphireS: Put this outside no fit polygon computation so it is only done once per item */
/* ref_vert_index now contains the vert with the lowest y value */
- PConvexHull *item_inv = p_convex_hull_reverse_direction(item);
+ //PConvexHull *item_inv = p_convex_hull_reverse_direction(item);
/* find reference verteices, store for later usage*/
- int min_y_item_index, max_y_fixed_index;
- float min_y_item = 1.0e30f, max_y_fixed = -1.0e30f;
+ /*int min_y_item_index, max_y_fixed_index;
+ float min_y_item = 1.0e30f, max_y_fixed = -1.0e30f;*/
- for (i = 0; i < item_inv->nverts; i++) {
- if (item_inv->h_verts[i]->uv[1] < min_y_item) {
- min_y_item = item_inv->h_verts[i]->uv[1];
+ /*for (i = 0; i < item->nverts; i++) {
+ if (item->h_verts[i]->uv[1] < min_y_item) {
+ min_y_item = item->h_verts[i]->uv[1];
min_y_item_index = i;
}
- }
- for (j = 0; j < fixed->nverts; j++) {
+ }*/
+ /*for (j = 0; j < fixed->nverts; j++) {
if (fixed->h_verts[j]->uv[1] > max_y_fixed) {
max_y_fixed = fixed->h_verts[j]->uv[1];
max_y_fixed_index = j;
}
- }
+ }*/
- printf("Max y fixed: x: %f y %f\n", fixed->h_verts[max_y_fixed_index]->uv[0], fixed->h_verts[max_y_fixed_index]->uv[1]);
- printf("Min y item: x: %f y %f\n", item_inv->h_verts[min_y_item_index]->uv[0], item_inv->h_verts[min_y_item_index]->uv[1]);
+ //printf("Max y fixed: x: %f y %f\n", fixed->h_verts[max_y_fixed_index]->uv[0], fixed->h_verts[max_y_fixed_index]->uv[1]);
+ //printf("Min y item: x: %f y %f\n", item_inv->h_verts[min_y_item_index]->uv[0], item_inv->h_verts[min_y_item_index]->uv[1]);
/* Assign to NFP */
for (i = 0; i < nfp->nverts; i++) {
if (i < item->nverts) {
- points[i] = item_inv->h_verts[i];
+ points[i] = item->h_verts[i];
}
else {
points[i] = fixed->h_verts[i - item->nverts];
@@ -5059,8 +5062,8 @@ PNoFitPolygon *p_no_fit_polygon_create(PConvexHull *item, PConvexHull *fixed)
for (j = 0; j < nfp->nverts; j++) {
printf("----Vert[%i]: dX: %f, dY: %f, angle: %f\n", j, points[j]->u.delta_edge[0], points[j]->u.delta_edge[1], points[j]->edge->u.horizontal_angle);
- if (compare_ff(points[j]->uv[0], item_inv->h_verts[min_y_item_index]->uv[0], FLT_EPSILON)
- && compare_ff(points[j]->uv[1], item_inv->h_verts[min_y_item_index]->uv[1], FLT_EPSILON)) {
+ if (compare_ff(points[j]->uv[0], item->h_verts[item->ref_vert_index]->uv[0], FLT_EPSILON)
+ && compare_ff(points[j]->uv[1], item->h_verts[item->ref_vert_index]->uv[1], FLT_EPSILON)) {
/* offset */
printf("Found item min y, offset = %i\n", j);
offset = j;
@@ -5087,8 +5090,8 @@ PNoFitPolygon *p_no_fit_polygon_create(PConvexHull *item, PConvexHull *fixed)
}
/* delete temporary inversed convex hull */
- p_convex_hull_delete(item_inv);
- p_convex_hull_restore_direction(item);
+ //p_convex_hull_delete(item_inv);
+ //p_convex_hull_restore_direction(item);
/* free memory */
MEM_freeN(points);
@@ -5114,46 +5117,70 @@ float p_binary_depth_search(int depth)
return 0.8f;
}
-bool p_chart_pack_individual(PChart *item, int ncharts)
+void p_place_chart(PChart* item, PConvexHull *ch_item, PPointUV *pos)
+{
+ float cur_pos[2], trans[2];
+
+ cur_pos[0] = ch_item->h_verts[ch_item->ref_vert_index]->uv[0];
+ cur_pos[1] = ch_item->h_verts[ch_item->ref_vert_index]->uv[1];
+
+ printf("ref_vert x: %f", cur_pos[0]);
+ printf("ref_vert y: %f", cur_pos[1]);
+ printf("end_pos x: %f", pos->x);
+ printf("end_pos y: %f", pos->y);
+
+ trans[0] = cur_pos[0] - pos->x;
+ trans[1] = cur_pos[1] - pos->y;
+
+ trans[0] = -trans[0];
+ trans[1] = -trans[1];
+
+ p_chart_uv_translate(item, trans);
+ printf("translation done!\n");
+}
+
+bool p_chart_pack_individual(PHandle *phandle, PChart *item)
{
/* ToDo SaphireS */
- PNoFitPolygon **nfps = (PNoFitPolygon **)MEM_callocN(sizeof(PNoFitPolygon *) * ncharts, "PNoFitPolygons");
+ PNoFitPolygon **nfps = (PNoFitPolygon **)MEM_callocN(sizeof(PNoFitPolygon *) * phandle->ncharts, "PNoFitPolygons");
PConvexHull *ch_item = item->u.ipack.convex_hull;
+ PChart *fixed;
float end_pos[2], cur_pos[2], trans[2];
+ int i;
/* Reverse winding direction of item convex hull */
/* ref_vert_index now contains the vert with the lowest y value */
PConvexHull *item_inv = p_convex_hull_reverse_direction(ch_item);
/* compute no fit polygons (NFPs) of item with already placed charts */
+ printf("NFPs construction start!\n");
+ for (i = 0; i < phandle->ncharts; i++) {
+ fixed = phandle->charts[i];
+ if (!(fixed->u.ipack.convex_hull->placed)) {
+ PConvexHull *ch_fixed = fixed->u.ipack.convex_hull;
+ PNoFitPolygon *nfp = p_no_fit_polygon_create(ch_item, ch_fixed);
+ nfps[i] = nfp;
+ }
+ else {
+ nfps[i] = NULL;
+ }
+ }
+ printf("NFPs construction done!\n");
/* compute inner fit polygon (IFP) */
printf("IFP construction start!\n");
PNoFitPolygon *ifp = p_inner_fit_polygon_create(item_inv);
printf("IFP construction done!\n");
+
/* compute collsion free region (CFR) */
/* Place chart according to rng (simulated annealing) parameters */
/* Use bottom left heuristic for now */
+ p_place_chart(item, item_inv, ifp->final_pos[0]);
- cur_pos[0] = item_inv->h_verts[item_inv->ref_vert_index]->uv[0];
- cur_pos[1] = item_inv->h_verts[item_inv->ref_vert_index]->uv[1];
- printf("ref_vert x: %f", cur_pos[0]);
- printf("ref_vert y: %f", cur_pos[1]);
-
- end_pos[0] = ifp->final_pos[0]->x;
- end_pos[1] = ifp->final_pos[0]->y;
- printf("end_pos x: %f", end_pos[0]);
- printf("end_pos y: %f", end_pos[1]);
+ /* ToDo SaphireS: Verify placement? */
- trans[0] = cur_pos[0] - end_pos[0];
- trans[1] = cur_pos[1] - end_pos[1];
-
- trans[0] = -trans[0];
- trans[1] = -trans[1];
-
- p_chart_uv_translate(item, trans);
- printf("translation done!\n");
+ ch_item->placed = true;
/* delete temporary inversed convex hull */
p_convex_hull_delete(item_inv);
@@ -5162,8 +5189,13 @@ bool p_chart_pack_individual(PChart *item, int ncharts)
/* CleanUp */
p_no_fit_polygon_delete(ifp);
+ /*for () {
+ p_no_fit_polygon_delete(nfps[i]);
+ }*/
MEM_freeN(nfps);
+ /* p_flush_uvs(phandle, item); */ /* ToDo SaphireS: Needs update to work ... */
+
return true;
}
@@ -5185,12 +5217,14 @@ bool p_compute_packing_solution(PHandle *phandle /* ToDo SaphireS: Simulated Ann
chart = phandle->charts[i];
float scale = 1.0f;
- while (!p_chart_pack_individual(chart, phandle->ncharts)){
- /* binary depth search for scaling down the current chart */
- scale = p_binary_depth_search(depth);
+ if (!(chart->u.ipack.convex_hull->placed)) {
+ while (!p_chart_pack_individual(phandle, chart, phandle->ncharts)){
+ /* binary depth search for scaling down the current chart */
+ scale = p_binary_depth_search(depth);
- /* scale chart */
- p_chart_uv_scale(chart, scale);
+ /* scale chart */
+ p_chart_uv_scale(chart, scale);
+ }
}
}
More information about the Bf-blender-cvs
mailing list