summaryrefslogtreecommitdiff
path: root/examples
diff options
context:
space:
mode:
Diffstat (limited to 'examples')
-rwxr-xr-xexamples/graph.c185
1 files changed, 130 insertions, 55 deletions
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();