Commit: 923e9d17583db189b0ba58771d8fcac2ccea0e44
Author: Phil Gosch
Date:   Fri Jul 22 14:13:07 2016 +0200
Branches: soc-2016-uv_tools
https://developer.blender.org/rB923e9d17583db189b0ba58771d8fcac2ccea0e44

WIP Collision Free Region computation

===================================================================

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 6c7dcc5..755274a 100644
--- a/source/blender/editors/uvedit/uvedit_parametrizer.c
+++ b/source/blender/editors/uvedit/uvedit_parametrizer.c
@@ -678,6 +678,11 @@ bool p_rect_intersect(float min1[2], float max1[2], float 
min2[2], float max2[2]
        return true;
 }
 
+int p_float_to_int_range(float f, int range)
+{
+       return (int)(f * (float)(range));
+}
+
 /* Topological Utilities */
 
 static PEdge *p_wheel_edge_next(PEdge *e)
@@ -5040,7 +5045,7 @@ void p_convex_hull_restore_direction(PConvexHull *item)
 
 void p_convex_hull_grow(PConvexHull *chull, float margin)
 {
-
+       /* ToDo SaphireS */
 }
 
 PNoFitPolygon *p_inner_fit_polygon_create(PConvexHull *item)
@@ -5085,21 +5090,6 @@ PNoFitPolygon *p_inner_fit_polygon_create(PConvexHull 
*item)
        return nfp;
 }
 
-PNoFitPolygon *p_collision_free_region_create(PNoFitPolygon **nfps, 
PNoFitPolygon *ifp)
-{
-       PNoFitPolygon *cfr = (PNoFitPolygon *)MEM_callocN(sizeof(*cfr), 
"PNoFitPolygon");
-       cfr->nverts = 0;
-       cfr->final_pos = NULL;
-
-       /* ToDo SaphireS */
-
-       /* NFPs Union */
-
-       /*cfr = ifp - U(nfps) */
-
-       return cfr;
-}
-
 bool p_point_inside_nfp(PNoFitPolygon *nfp, float p[2]) 
 {
        /* raycast to the right of vert, odd number of intersections means 
inside */
@@ -5141,6 +5131,46 @@ bool p_temp_cfr_check(PNoFitPolygon **nfps, 
PNoFitPolygon *ifp, float p[2], int
        return true;
 }
 
+PNoFitPolygon *p_collision_free_region_create(PNoFitPolygon **nfps, 
PNoFitPolygon *ifp, int n_nfps)
+{
+       PNoFitPolygon *cfr = (PNoFitPolygon *)MEM_callocN(sizeof(*cfr), 
"PCollisionFreeRegion");
+       cfr->nverts = 100;
+       cfr->final_pos = (PVert **)MEM_mallocN(sizeof(PPointUV *) * 
cfr->nverts, "PNFPPoints");;
+       PPointUV *p;
+       int i, j, k = 0;
+       float pos[2];
+
+       for (i = 0; i <= n_nfps; i++) {
+               if (nfps[i]){
+                       for (j = 0; j < nfps[i]->nverts; j++) {
+                               p = nfps[i]->final_pos[j];
+                               pos[0] = p->x;
+                               pos[1] = p->y;
+                               if (p_temp_cfr_check(nfps, ifp, pos, n_nfps, 
i)) {
+                                       /* Add point to CFR */
+                                       cfr->final_pos[k] = p;
+                                       k++;
+                                       if (k == (cfr->nverts - 1)) {
+                                               /* realloc */
+                                               cfr->nverts += 100;
+                                               cfr->final_pos = 
MEM_recallocN_id(cfr->final_pos, sizeof(PPointUV *) * cfr->nverts, 
"PNFPPoints");
+                                       }
+                               }
+                       }
+               }
+       }
+
+       /*for (i = k; i < cfr->nverts; i++) {
+               MEM_freeN(cfr->final_pos[i]);
+       } */
+
+       cfr->nverts = k;
+
+       /* ToDo SaphireS: Add intersection points of nfps */
+
+       return cfr;
+}
+
 /* Make sure vert order for item is CCW and for fixed is CW! */
 PNoFitPolygon *p_no_fit_polygon_create(PConvexHull *item, PConvexHull *fixed)
 {
@@ -5234,6 +5264,7 @@ void p_place_chart(PChart* item, PConvexHull *ch_item,  
PPointUV *pos)
 bool p_chart_pack_individual(PHandle *phandle,  PChart *item)
 {
        PNoFitPolygon **nfps = (PNoFitPolygon 
**)MEM_callocN(sizeof(PNoFitPolygon *) * phandle->ncharts, "PNoFitPolygons");
+       PNoFitPolygon *cfr;
        PConvexHull *ch_item = item->u.ipack.convex_hull;
        PChart *fixed;
        float end_pos[2], randf1, randf2;
@@ -5266,10 +5297,11 @@ bool p_chart_pack_individual(PHandle *phandle,  PChart 
*item)
        /* compute inner fit polygon (IFP) */
        printf("IFP construction start!\n");
        PNoFitPolygon *ifp = p_inner_fit_polygon_create(item_inv);
-       nfps[phandle->ncharts] = ifp;
+       nfps[phandle->ncharts] = ifp; /* ToDo: Remove, made obsolete by cfr 
computation */
        printf("IFP construction done!\n");
 
        /* compute collsion free region (CFR) */
+       cfr = p_collision_free_region_create(nfps, ifp, phandle->ncharts);
 
        /* Choose placement point */
        if (init) {
@@ -5281,37 +5313,51 @@ bool p_chart_pack_individual(PHandle *phandle,  PChart 
*item)
        }
        else {
                while (!found) {
-                       cur_iter++;
-                       randf1 = BLI_rng_get_float(phandle->rng);
-                       /*printf("-randf1 choosen as: %f\n", randf1);*/
-                       /* ToDo SaphireS: Add IFP to points being considered 
until a proper CFR computation is in place */
-                       rand1 = (int)(randf1 * (float)(phandle->ncharts + 1));
-                       //rand1 = (int)(randf1 * (float)(phandle->ncharts));
-
-                       if (nfps[rand1]) {
-
-                               randf2 = BLI_rng_get_float(phandle->rng);
-                               /*printf("--randf2 choosen as: %f\n", randf2);*/
-                               rand2 = (int)(randf2 * 
(float)(nfps[rand1]->nverts));
-
-                               if (nfps[rand1]->final_pos[rand2]) {
-                                       end_pos[0] = 
nfps[rand1]->final_pos[rand2]->x;
-                                       end_pos[1] = 
nfps[rand1]->final_pos[rand2]->y;
-                                       printf("-rand1 choosen as: %i\n", 
rand1);
-                                       printf("--rand2 choosen as: %i\n", 
rand2);
-                                       found = p_temp_cfr_check(nfps, ifp, 
end_pos, phandle->ncharts, rand1);
-                               }
+                       /* Old method, randomly choosing a point */
+                       //cur_iter++;
+                       ///*randf1 = BLI_rng_get_float(phandle->rng);*/
+                       ///*printf("-randf1 choosen as: %f\n", randf1);*/
+                       ///* ToDo SaphireS: Add IFP to points being considered 
until a proper CFR computation is in place */
+                       //rand1 = 
p_float_to_int_range(item->u.ipack.sa_params[1], phandle->ncharts + 1); 
+                       //
+                       ///* ToDo: Replace with cfr */
+                       //if (nfps[rand1]) {
+
+                       //      //randf2 = BLI_rng_get_float(phandle->rng);
+                       //      /*printf("--randf2 choosen as: %f\n", randf2);*/
+                       //      rand2 = 
p_float_to_int_range(item->u.ipack.sa_params[2], nfps[rand1]->nverts); /* ToDo: 
Actual point amount in cfr */
+
+                       //      if (nfps[rand1]->final_pos[rand2]) {
+                       //              end_pos[0] = 
nfps[rand1]->final_pos[rand2]->x;
+                       //              end_pos[1] = 
nfps[rand1]->final_pos[rand2]->y;
+                       //              printf("-rand1 choosen as: %i\n", 
rand1);
+                       //              printf("--rand2 choosen as: %i\n", 
rand2);
+                       //              found = p_temp_cfr_check(nfps, ifp, 
end_pos, phandle->ncharts, rand1);
+                       //      }
+                       //}
+
+                       //if (cur_iter >= max_iter) {
+                       //      found = false;
+                       //      break;
+                       //}
+
+                       /* New method, cfr */
+                       rand1 = 
p_float_to_int_range(item->u.ipack.sa_params[1], cfr->nverts);
+
+                       if (cfr->final_pos[rand1]) {
+                               end_pos[0] = cfr->final_pos[rand1]->x;
+                               end_pos[1] = cfr->final_pos[rand1]->y;
+                               found = true;
                        }
-
-                       if (cur_iter >= max_iter) {
-                               found = false;
+                       else {
+                               printf("Error: cfr->final_pos[%i] doesn't 
exist!\n", rand1);
                                break;
                        }
                }
        }
 
        if (found) {
-               /* Place chart according to rng (simulated annealing) 
parameters */
+               /* Place chart */
                p_place_chart(item, item_inv, end_pos);
 
                /* ToDo SaphireS: Verify placement? */
@@ -5324,6 +5370,7 @@ bool p_chart_pack_individual(PHandle *phandle,  PChart 
*item)
        printf("-restoring angles/edges done!\n");
 
        /* CleanUp, pay attention to also delete IFP which is part of nfps */
+       MEM_freeN(cfr);
        for (j = 0; j <= phandle->ncharts; j++) {
                if (nfps[j]) {
                        p_no_fit_polygon_delete(nfps[j]);
@@ -5333,7 +5380,6 @@ bool p_chart_pack_individual(PHandle *phandle,  PChart 
*item)
        printf("-freeing stuff done!\n");
        p_flush_uvs(phandle, item);  /* ToDo SaphireS: Needs update to work ... 
*/
 
-
        return found;
 }
 
@@ -5388,7 +5434,6 @@ bool p_compute_packing_solution(PHandle *phandle /* ToDo 
SaphireS: Simulated Ann
 
        /* Set initial overall scale */
 
-       /* Average Islands Scale? Start with box packing then scale up? */
 
        /* Place UV islands one by one */
        for (i = 0; i < phandle->ncharts; i++) {
@@ -5502,27 +5547,44 @@ void param_irregular_pack_begin(ParamHandle *handle, 
float *w_area, float margin
        *w_area = 1.0f - used_area;
 }
 
-void param_irregular_pack_iter(ParamHandle *handle, float *w_area, unsigned 
int seed)
+void param_irregular_pack_iter(ParamHandle *handle, float *w_area, unsigned 
int seed, int rot_step)
 {
        PHandle *phandle = (PHandle *)handle;
        PChart* chart;
-       float randf1;
-       int rand;
+       float randf, rot, rand_value, rot_rand, place_rand;
+       int rand_chart, rand_param;
 
        BLI_rng_seed(phandle->rng, seed);
 
        param_assert(phandle->state == PHANDLE_STATE_PACK);
 
        /* packing solution for random part, based on last solution */
-       randf1 = BLI_rng_get_float(phandle->rng);
-       rand = (int)(randf1 * (float)(phandle->ncharts));
-       chart = phandle->charts[rand];
+       randf = BLI_rng_get_float(phandle->rng);
+       rand_chart = p_float_to_int_range(randf, phandle->ncharts);
+       chart = phandle->charts[rand_chart];
        chart->u.ipack.convex_hull->placed = false;
 
-       /* Set random SA parameter of chosen chart to new value */
-
        /* Set initial scale of charts so finding a better solution is possible 
*/
 
+       /* Set random SA parameter of chosen chart to new value */
+       randf = BLI_rng_get_float(phandle->rng);
+       rand_param = p_float_to_int_range(randf, 3); /* 0 = theta, 1 = m, 2 = f 
*/
+       rand_value = BLI_rng_get_float(phandle->rng);
+       rand_value -= 0.5f;
+
+       if (rand_param == 0) { 
+               rot_rand = fabsf(remainderf(chart->u.ipack.sa_params[0] + 
rand_value, 1.0f));
+               printf("SA param rot_rand for chart[%i]: %f\n", rand_chart, 
rot_rand);
+               rot = (int)(rot_rand * (float)rot_step) * (2 * M_PI / 
(float)rot_step);
+               printf("SA param rot for chart[%i]: %f\n", rand_chart, rot);
+               p_chart_rotate(chart, rot);
+       }
+       else {
+               place_rand = fabsf(remainderf(chart->u.ipack.sa_params[2] + 
rand_value, 1.0f));
+               chart->u.ipack.sa_params[2] = place_rand;
+               printf("SA param place_rand for chart[%i]: %f\n", rand_chart, 
place_rand);
+       }
+
        /* Find placement for part */
        if (p_compute_packing_solution(phandle)) {
                printf("packing solution 
found---------------------------------------------\n");
diff --git a/source/blender/editors/uvedit/uvedit_parametrizer.h 
b/source/blender/editors/uvedit/uvedit_parametrizer.h
index c7dd919..dafc088 100644
--- a/source/blender/editors/uvedit/uvedit_parametrizer.h
+++ b/source/blender/editors/uvedit/uvedit_parametrizer.h
@@ -106,7 +106,7 @@ void param_pack(ParamHandle *handle, float margin, bool 
do_rotate);
 /* Packing 2.0 */
 
 void param_irregular_pack_begin(ParamHandle *handle, float *w_area, float 
margin, int rot_step);
-void param_irregular_pack_iter(ParamHandle *handle, float *w_area, unsigned 
int seed);
+void param_irregular_pack_iter(ParamHandle *handle, float *w_area, unsigned 
int seed, int rot_step);
 void param_irregular_pack_end(ParamHandle *handle);
 void param_store_packing_solution(ParamHandle *handle);
 void param_restore_packing_solution(ParamHandle *handle);
diff --git a/source/blender/editors/uvedit/uvedit_unwrap_ops.c 
b/source/blender/editors/uvedit/uvedit_unwrap_ops.c
index 4b9781f..be04657 100644
--- a/source/blender/editors/uved

@@ Diff output truncated at 10240 characters. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to