Index: cdt.c =================================================================== --- cdt.c (revision 33746) +++ cdt.c (revision 33747) @@ -465,6 +465,7 @@ retriangulation_region_t region = {NULL, NULL}; pointlist_node_t *points_to_attach, *prev_point_node; point_t *split_edge_endp[2] = {NULL, NULL}; + void *split_edge_user_data; int i, j; /* find enclosing triangle */ @@ -486,6 +487,9 @@ if (crossing_edge->is_constrained) { for (j = 0; j < 2; j++) split_edge_endp[j] = enclosing_triangle->e[i]->endp[j]; + split_edge_user_data = crossing_edge->data; + if (cdt->ev_split_constrained_edge_pre != NULL) + cdt->ev_split_constrained_edge_pre(cdt, crossing_edge, new_p); crossing_edge->is_constrained = 0; } break; @@ -521,8 +525,11 @@ /* recreate, now splitted, constrained edge */ if (split_edge_endp[0] != NULL) { - cdt_insert_constrained_edge(cdt, split_edge_endp[0], new_p); - cdt_insert_constrained_edge(cdt, new_p, split_edge_endp[1]); + edge_t *e1 = cdt_insert_constrained_edge(cdt, split_edge_endp[0], new_p); + edge_t *e2 = cdt_insert_constrained_edge(cdt, new_p, split_edge_endp[1]); + e1->data = e2->data = split_edge_user_data; + if (cdt->ev_split_constrained_edge_post != NULL) + cdt->ev_split_constrained_edge_post(cdt, e1, e2, new_p); } return 0; } Index: cdt.h =================================================================== --- cdt.h (revision 33746) +++ cdt.h (revision 33747) @@ -33,15 +33,20 @@ #include "edge.h" #include "triangle.h" +typedef struct cdt_s cdt_t; -typedef struct { +struct cdt_s { vtpoint_t points; vtedge_t edges; vttriangle_t triangles; + /* optional event callbacks (may be NULL to ignore) */ + void (*ev_split_constrained_edge_pre)(cdt_t *cdt, edge_t *cedge, point_t *pt); /* called before removing a constrained edge that gets split at pt */ + void (*ev_split_constrained_edge_post)(cdt_t *cdt, edge_t *ne1, edge_t *ne2, point_t *pt); /* called after creating the two new constrained edges around pt */ + pos_t bbox_tl; pos_t bbox_br; -} cdt_t; +}; void cdt_init(cdt_t *cdt, coord_t bbox_x1, coord_t bbox_y1, coord_t bbox_x2, coord_t bbox_y2); Index: cdt_test.c =================================================================== --- cdt_test.c (revision 33746) +++ cdt_test.c (revision 33747) @@ -50,6 +50,20 @@ cdt_free(&cdt); } +static int print_events = 0; + +static void ev_split_constrained_edge_pre(cdt_t *cdt, edge_t *cedge, point_t *pt) +{ + if (print_events) + printf("split_constrained_edge_pre at %d;%d\n", pt->pos.x, pt->pos.y); +} + +static void ev_split_constrained_edge_post(cdt_t *cdt, edge_t *ne1, edge_t *ne2, point_t *pt) +{ + if (print_events) + printf("split_constrained_edge_post at %d;%d\n", pt->pos.x, pt->pos.y); +} + static void cmd_init(char *args) { long x1, y1, x2, y2; @@ -58,6 +72,8 @@ return; } cdt_init(&cdt, x1, y1, x2, y2); + cdt.ev_split_constrained_edge_pre = ev_split_constrained_edge_pre; + cdt.ev_split_constrained_edge_post = ev_split_constrained_edge_post; } static void cmd_free(char *args) @@ -195,6 +211,17 @@ fclose(f); } +static void cmd_print_events(char *args) +{ + switch(*args) { + case '1': case 'y': case 'Y': case 't': case 'T': print_events = 1; break; + case '0': case 'n': case 'N': case 'f': case 'F': print_events = 0; break; + default: + fprintf(stderr, "print_events: invalid boolean value '%s'\n", args); + return; + } +} + int main(void) { char line[1024], *cmd, *args; @@ -224,6 +251,7 @@ else if (strcmp(cmd, "ins_cedge") == 0) cmd_ins_cedge(args); else if (strcmp(cmd, "del_cedge") == 0) cmd_del_cedge(args); else if (strcmp(cmd, "dump_anim") == 0) cmd_dump_anim(args); + else if (strcmp(cmd, "print_events") == 0) cmd_print_events(args); else fprintf(stderr, "syntax error: unknown command '%s'\n", cmd); } return 0; Index: regression/split_cedge.cdt =================================================================== --- regression/split_cedge.cdt (revision 33746) +++ regression/split_cedge.cdt (revision 33747) @@ -9,6 +9,8 @@ # p4--------p3 # +# there should be one split printed, pre and post +print_events yes # create the initial square init 0 0 1000 1000