Index: trunk/src/libgrbs/collision.c =================================================================== --- trunk/src/libgrbs/collision.c (revision 1330) +++ trunk/src/libgrbs/collision.c (revision 1331) @@ -16,14 +16,14 @@ return 1; } -static int coll_check_arc(grbs_t *grbs, grbs_2net_t *tn, grbs_arc_t *arc) +static grbs_2net_t *coll_check_arc(grbs_t *grbs, grbs_2net_t *tn, grbs_arc_t *arc) { if (!grbs_arc_is_outmost(grbs, arc)) /* do not check collision on inner arcs */ - return 0; + return NULL; #warning TODO: callback: use ->new_* if exist or plain fields - return 0; + return NULL; } static void coll_report(grbs_t *grbs, grbs_2net_t *tn, grbs_2net_t *coll_tn, grbs_arc_t *coll_arc) @@ -38,3 +38,8 @@ coll_report(grbs, tn, grbs_arc_parent_2net(coll_arc), coll_arc); } +static void coll_report_tn(grbs_t *grbs, grbs_2net_t *tn, grbs_2net_t *coll_tn) +{ + if (grbs->coll_report_cb != NULL) + grbs->coll_report_cb(grbs, tn, coll_tn, NULL); +} Index: trunk/src/libgrbs/route_next.c =================================================================== --- trunk/src/libgrbs/route_next.c (revision 1330) +++ trunk/src/libgrbs/route_next.c (revision 1331) @@ -68,6 +68,7 @@ static grbs_addr_t *grbs_implement_incident(grbs_t *grbs, grbs_2net_t *tn, grbs_addr_t *from, double from_r, double from_a, grbs_point_t *to_pt, int segi, int new_at_from, grbs_addr_type_t curving, int concave_dir) { grbs_point_t *from_pt = addr_point(from); + grbs_2net_t *coll_tn; if (new_at_from) { /* when creating a new go-around arc, we first place start (new_sa), so @@ -80,7 +81,10 @@ res->obj.arc->new_da = 0; res->obj.arc->new_adir = (curving == ADDR_ARC_CONCAVE) ? concave_dir : grbs_get_adir(to_pt->x, to_pt->y, from_pt->x, from_pt->y, from_r, from_a); res->obj.arc->new_in_use = 1; - if (coll_check_arc(grbs, tn, res->obj.arc)) { + coll_tn = coll_check_arc(grbs, tn, res->obj.arc); + if (coll_tn != NULL) { + failprintf("arc collision failed\n"); + coll_report_tn(grbs, tn, coll_tn); grbs_arc_free(grbs, res->obj.arc); grbs_addr_free_last(grbs); return NULL; @@ -102,6 +106,7 @@ { grbs_point_t *from_pt = addr_point(from), *to_pt; grbs_arc_t *to_arc; + grbs_2net_t *coll_tn; assert((from->type & ADDR_ARC_CONVEX) || (from->type & ADDR_ARC_CONCAVE)); assert(from->type & ADDR_ARC_END); @@ -122,7 +127,10 @@ to_arc->new_adir = ((to->type & 0x0F) == ADDR_ARC_CONVEX) ? grbs_get_adir(from_pt->x, from_pt->y, to_pt->x, to_pt->y, to_r, to_a) : to_concave_dir; to_arc->new_in_use = 1; - if (coll_check_arc(grbs, tn, to_arc)) { + coll_tn = coll_check_arc(grbs, tn, to_arc); + if (coll_tn != NULL) { + failprintf("arc collision failed\n"); + coll_report_tn(grbs, tn, coll_tn); to_arc->new_in_use = 0; return NULL; } @@ -373,6 +381,7 @@ grbs_arc_t *from_under_me = NULL, *from_above_me = NULL; grbs_arc_t *to_under_me = NULL, *to_above_me = NULL; grbs_arc_t *arc, *to_arc, *tou; + grbs_2net_t *coll_tn; double from_ang, to_ang, to_r, to_d; int swapped = 0; @@ -509,8 +518,12 @@ } } - if (coll_check_arc(grbs, tn, from->obj.arc)) + coll_tn = coll_check_arc(grbs, tn, from->obj.arc); + if (coll_tn != NULL) { + failprintf("arc collision failed\n"); + coll_report_tn(grbs, tn, coll_tn); return NULL; + } to_arc->segi = arc->segi; to_arc->new_r = to_r;