From 934e20184668c6f6a13420df5fc679d06f270af8 Mon Sep 17 00:00:00 2001 From: Mitya Selivanov Date: Sun, 6 Oct 2024 06:43:36 +0200 Subject: Implement adding and removing nodes --- examples/graph.c | 185 ++++++++++++++++++++++++++++++++++++++----------------- 1 file changed, 130 insertions(+), 55 deletions(-) (limited to 'examples') diff --git a/examples/graph.c b/examples/graph.c index 7f9870f..6cb8198 100755 --- a/examples/graph.c +++ b/examples/graph.c @@ -167,87 +167,162 @@ void update_edge(i64 edge_index) { world.edges[edge_index].hover = d <= e.width / 2 && d >= -e.width / 2 && l >= 0 && l <= r; } -void update_graph(void) { - b8 hover_node = 0; +void remove_edge(i64 edge_index) { + assert(check_edge_index(edge_index)); - // update all nodes - for (i64 i = 0; i < MAX_NUM_NODES; ++i) - if (world.nodes[i].enabled) { - update_node(i); - if (world.nodes[i].hover) - hover_node = 1; - } + world.edges[edge_index].enabled = 0; +} + +void remove_node(i64 node_index) { + assert(check_node_index(node_index)); - // update all edges for (i64 i = 0; i < MAX_NUM_EDGES; ++i) - if (world.edges[i].enabled) { - if (hover_node) - world.edges[i].hover = 0; - else - update_edge(i); - } + if (world.edges[i].enabled && (world.edges[i].src == node_index || world.edges[i].dst == node_index)) + remove_edge(i); + + world.nodes[node_index].enabled = 0; } -i32 main(i32 argc, c8 **argv) { - (void) argc; - (void) argv; +void add_node(f64 x, f64 y) { + i64 node_index = 0; - platform = (Platform) { - .title = "Graph", - .frame_width = 960, - .frame_height = 720, - }; + while (node_index < MAX_NUM_NODES && world.nodes[node_index].enabled) + ++node_index; - p_init(); + assert(node_index < MAX_NUM_NODES); - world.nodes[0] = (Node) { + world.nodes[node_index] = (Node) { .enabled = 1, - .x = 100, - .y = 100, + .x = x, + .y = y, .radius = 50, }; +} - world.nodes[1] = (Node) { - .enabled = 1, - .x = 300, - .y = 100, - .radius = 50, - }; +void add_edge(i64 src, i64 dst) { + assert(check_node_index(src)); + assert(check_node_index(dst)); - world.nodes[2] = (Node) { - .enabled = 1, - .x = 120, - .y = 300, - .radius = 60, - }; + if (src == dst) + return; - world.edges[0] = (Edge) { - .enabled = 1, - .src = 0, - .dst = 1, - .width = 30, - }; + for (i64 i = 0; i < MAX_NUM_EDGES; ++i) + if (world.edges[i].enabled && world.edges[i].src == src && world.edges[i].dst == dst) + return; + + i64 edge_index = 0; - world.edges[1] = (Edge) { + while (edge_index < MAX_NUM_EDGES && world.edges[edge_index].enabled) + ++edge_index; + + assert(edge_index < MAX_NUM_EDGES); + + world.edges[edge_index] = (Edge) { .enabled = 1, - .src = 0, - .dst = 2, + .src = src, + .dst = dst, .width = 30, }; +} - world.edges[2] = (Edge) { - .enabled = 1, - .src = 1, - .dst = 2, - .width = 30, +i32 main(i32 argc, c8 **argv) { + (void) argc; + (void) argv; + + platform = (Platform) { + .title = "Graph", + .frame_width = 960, + .frame_height = 720, }; + p_init(); + + add_node(100, 100); + add_node(300, 100); + add_node(120, 300); + + add_edge(0, 1); + add_edge(0, 2); + add_edge(1, 2); + + b8 adding_edge = 0; + i64 adding_src = 0; + i64 adding_dst = 0; + while (!platform.done) { p_wait_events(); + // Input events + + b8 hover_node = 0; + + for (i64 i = 0; i < MAX_NUM_NODES; ++i) + if (world.nodes[i].enabled) { + update_node(i); + if (world.nodes[i].hover) + hover_node = 1; + } + + for (i64 i = 0; i < MAX_NUM_EDGES; ++i) + if (world.edges[i].enabled) { + if (hover_node) + world.edges[i].hover = 0; + else + update_edge(i); + } + + if (platform.key_pressed[KEY_DELETE]) { + for (i64 i = 0; i < MAX_NUM_EDGES; ++i) + if (world.edges[i].enabled && world.edges[i].hover) + remove_edge(i); + + for (i64 i = 0; i < MAX_NUM_NODES; ++i) + if (world.nodes[i].enabled && world.nodes[i].hover) + remove_node(i); + } + + if (platform.key_pressed[BUTTON_LEFT]) + add_node(platform.cursor_x, platform.cursor_y); + + if (platform.key_pressed[BUTTON_RIGHT]) + for (i64 i = 0; i < MAX_NUM_NODES; ++i) + if (world.nodes[i].enabled && world.nodes[i].hover) { + adding_edge = 1; + adding_src = i; + adding_src = i; + break; + } + + if (adding_edge) + for (i64 i = 0; i < MAX_NUM_NODES; ++i) + if (world.nodes[i].enabled && world.nodes[i].hover) { + adding_dst = i; + break; + } + + if (adding_edge && !platform.key_down[BUTTON_RIGHT]) { + adding_edge = 0; + add_edge(adding_src, adding_dst); + } + + // Render + fill_rectangle(OP_SET, 0xffffff, 0, 0, platform.frame_width, platform.frame_height); - update_graph(); + if (adding_edge) { + f64 x0 = world.nodes[adding_src].x; + f64 y0 = world.nodes[adding_src].y; + f64 x1 = platform.cursor_x; + f64 y1 = platform.cursor_y; + + if (adding_src != adding_dst) { + x1 = world.nodes[adding_dst].x; + y1 = world.nodes[adding_dst].y; + } + + fill_line(OP_SET, 0x7f007f, x0, y0, x1, y1, 30); + } + draw_graph(); p_render_frame(); -- cgit v1.2.3