Compare commits
12 Commits
373e48216d
...
main
Author | SHA1 | Date | |
---|---|---|---|
f419378183 | |||
46a4802ce6 | |||
4ed86611b5 | |||
|
b447e9d5a1 | ||
|
65d69bd570 | ||
9570f31dc7 | |||
547764764c | |||
29bcfabda9 | |||
f03dad33a2 | |||
8078a72deb | |||
f2faa56e5f | |||
a68d6997a5 |
1
.gitignore
vendored
1
.gitignore
vendored
@@ -1,3 +1,4 @@
|
|||||||
.cache
|
.cache
|
||||||
compile_commands.json
|
compile_commands.json
|
||||||
main
|
main
|
||||||
|
*.dSYM
|
||||||
|
2
compile
2
compile
@@ -8,7 +8,7 @@ INCLUDE="\
|
|||||||
-Iintern/wizapp/aliases \
|
-Iintern/wizapp/aliases \
|
||||||
-Iintern/wizapp/cpath/include \
|
-Iintern/wizapp/cpath/include \
|
||||||
-Iintern/wizapp/dstr/include \
|
-Iintern/wizapp/dstr/include \
|
||||||
$(find intern/wizapp/mem/include/ -type d | xargs -I{} printf "-I{} ") \
|
$(find intern/wizapp/mem/include -type d | xargs -I{} echo -n "-I{} ") \
|
||||||
"
|
"
|
||||||
SRC="\
|
SRC="\
|
||||||
intern/wizapp/cpath/src/*.c \
|
intern/wizapp/cpath/src/*.c \
|
||||||
|
@@ -7,11 +7,15 @@
|
|||||||
#define MAX_NODES 1024
|
#define MAX_NODES 1024
|
||||||
#define IO_INPUT_COUNT 0
|
#define IO_INPUT_COUNT 0
|
||||||
#define OP_INPUT_COUNT 2
|
#define OP_INPUT_COUNT 2
|
||||||
|
#define EMPTY_NODE 0
|
||||||
|
#define NODE_START 1
|
||||||
|
#define CONNECTION_START 1
|
||||||
|
|
||||||
typedef i32 (*node_func)(i32 a, i32 b);
|
typedef i32 (*node_func)(i32 a, i32 b);
|
||||||
typedef enum node_type node_type;
|
typedef enum node_type node_type;
|
||||||
typedef union node_data node_data;
|
typedef union node_data node_data;
|
||||||
typedef struct node node;
|
typedef struct node node;
|
||||||
|
typedef struct noodle noodle;
|
||||||
|
|
||||||
enum node_type {
|
enum node_type {
|
||||||
NODE_TYPE_IO,
|
NODE_TYPE_IO,
|
||||||
@@ -25,13 +29,21 @@ union node_data {
|
|||||||
node_func func;
|
node_func func;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct noodle {
|
||||||
|
line ln;
|
||||||
|
u64 connected_node;
|
||||||
|
u64 connection_idx;
|
||||||
|
};
|
||||||
|
|
||||||
struct node {
|
struct node {
|
||||||
rect rec;
|
rect rec;
|
||||||
ui_elem_colours colours;
|
ui_elem_colours colours;
|
||||||
node_type type;
|
node_type type;
|
||||||
node_data data;
|
node_data data;
|
||||||
u64 inputs;
|
u64 inputs;
|
||||||
line *noodles;
|
u64 connected;
|
||||||
|
noodle *noodles;
|
||||||
|
noodle **connected_noodles;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // !NODES_H
|
#endif // !NODES_H
|
||||||
|
15
include/ui.h
15
include/ui.h
@@ -7,8 +7,6 @@
|
|||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
|
|
||||||
#define MAX_UI_ELEMENTS 8192
|
#define MAX_UI_ELEMENTS 8192
|
||||||
#define RESERVED_UI_SLOT 0
|
|
||||||
#define UI_ELEM_START_INDEX 1
|
|
||||||
|
|
||||||
#define BUTTON_WIDTH 100
|
#define BUTTON_WIDTH 100
|
||||||
#define BUTTON_HEIGHT 40
|
#define BUTTON_HEIGHT 40
|
||||||
@@ -21,6 +19,8 @@
|
|||||||
typedef enum ui_elem_type ui_elem_type;
|
typedef enum ui_elem_type ui_elem_type;
|
||||||
typedef struct ui_elem ui_elem;
|
typedef struct ui_elem ui_elem;
|
||||||
typedef struct ui_ctx ui_ctx;
|
typedef struct ui_ctx ui_ctx;
|
||||||
|
typedef struct ui_elem_colours ui_elem_colours;
|
||||||
|
typedef enum noodle_action noodle_action;
|
||||||
|
|
||||||
enum ui_elem_type {
|
enum ui_elem_type {
|
||||||
UI_ELEM_NODE,
|
UI_ELEM_NODE,
|
||||||
@@ -39,12 +39,17 @@ struct ui_elem {
|
|||||||
ui_elem_type type;
|
ui_elem_type type;
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef struct ui_elem_colours ui_elem_colours;
|
|
||||||
struct ui_elem_colours {
|
struct ui_elem_colours {
|
||||||
colour fill;
|
colour fill;
|
||||||
colour border;
|
colour border;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum noodle_action {
|
||||||
|
NOODLE_ACTION_NONE,
|
||||||
|
NOODLE_ACTION_DRAGGING,
|
||||||
|
NOODLE_ACTION_RELEASED,
|
||||||
|
};
|
||||||
|
|
||||||
struct ui_ctx {
|
struct ui_ctx {
|
||||||
u64 count;
|
u64 count;
|
||||||
i64 hovered;
|
i64 hovered;
|
||||||
@@ -66,7 +71,7 @@ bool ui_button(const window *wnd, ui_ctx *ctx, rect rect,
|
|||||||
ui_elem_colours colours);
|
ui_elem_colours colours);
|
||||||
bool ui_node(const window *wnd, ui_ctx *ctx, rect rect,
|
bool ui_node(const window *wnd, ui_ctx *ctx, rect rect,
|
||||||
ui_elem_colours colours);
|
ui_elem_colours colours);
|
||||||
bool ui_noodle(const window *wnd, ui_ctx *ctx, line ln, ui_elem_colours colours,
|
noodle_action ui_noodle(const window *wnd, ui_ctx *ctx, line ln,
|
||||||
rect parent_node);
|
ui_elem_colours colours, rect parent_node);
|
||||||
|
|
||||||
#endif // !UI_H
|
#endif // !UI_H
|
||||||
|
280
src/compositor.c
280
src/compositor.c
@@ -9,7 +9,6 @@
|
|||||||
#include <SDL2/SDL_render.h>
|
#include <SDL2/SDL_render.h>
|
||||||
#include <SDL2/SDL_video.h>
|
#include <SDL2/SDL_video.h>
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
|
||||||
#define MAX_WINDOWS 2
|
#define MAX_WINDOWS 2
|
||||||
@@ -26,15 +25,16 @@ struct compositor {
|
|||||||
u32 active_window;
|
u32 active_window;
|
||||||
SDL_Event event;
|
SDL_Event event;
|
||||||
bool running;
|
bool running;
|
||||||
i64 node_hovered;
|
|
||||||
u64 count;
|
u64 count;
|
||||||
node *nodes;
|
node *nodes;
|
||||||
bool move_node;
|
node *back_nodes;
|
||||||
ui_ctx ctx;
|
ui_ctx ctx;
|
||||||
};
|
};
|
||||||
|
|
||||||
void add_node(compositor *comp, node_type type, node_data data, u64 inputs,
|
internal void add_node(compositor *comp, node_type type, node_data data,
|
||||||
i32 x, i32 y, ui_elem_colours colours);
|
u64 inputs, i32 x, i32 y, ui_elem_colours colours);
|
||||||
|
internal void update_node_graph(compositor *comp, const window *wnd);
|
||||||
|
internal void draw_node_graph(compositor *comp, const window *wnd);
|
||||||
|
|
||||||
i32 run_main_loop(void) {
|
i32 run_main_loop(void) {
|
||||||
if (SDL_Init(SDL_INIT_EVERYTHING) != 0) {
|
if (SDL_Init(SDL_INIT_EVERYTHING) != 0) {
|
||||||
@@ -47,6 +47,8 @@ i32 run_main_loop(void) {
|
|||||||
mem_arena_init(&comp.arena, ARENA_CAPACITY);
|
mem_arena_init(&comp.arena, ARENA_CAPACITY);
|
||||||
|
|
||||||
comp.nodes = (node *)mem_arena_alloc(comp.arena, sizeof(node) * MAX_NODES);
|
comp.nodes = (node *)mem_arena_alloc(comp.arena, sizeof(node) * MAX_NODES);
|
||||||
|
comp.back_nodes =
|
||||||
|
(node *)mem_arena_alloc(comp.arena, sizeof(node) * MAX_NODES);
|
||||||
|
|
||||||
window *main_window = &(comp.windows[0]);
|
window *main_window = &(comp.windows[0]);
|
||||||
window *toolbox = &(comp.windows[1]);
|
window *toolbox = &(comp.windows[1]);
|
||||||
@@ -87,16 +89,16 @@ i32 run_main_loop(void) {
|
|||||||
handle_ui_events(&(comp.windows[comp.active_window - 1]), &(comp.ctx),
|
handle_ui_events(&(comp.windows[comp.active_window - 1]), &(comp.ctx),
|
||||||
&(comp.event));
|
&(comp.event));
|
||||||
|
|
||||||
switch (comp.event.type) {
|
if (comp.event.type == SDL_QUIT) {
|
||||||
case SDL_QUIT:
|
|
||||||
comp.running = false;
|
comp.running = false;
|
||||||
break;
|
}
|
||||||
case SDL_WINDOWEVENT:
|
|
||||||
switch (comp.event.window.event) {
|
if (comp.event.type == SDL_WINDOWEVENT) {
|
||||||
case SDL_WINDOWEVENT_CLOSE:
|
if (comp.event.window.event == SDL_WINDOWEVENT_CLOSE) {
|
||||||
comp.running = false;
|
comp.running = false;
|
||||||
break;
|
}
|
||||||
case SDL_WINDOWEVENT_ENTER: {
|
|
||||||
|
if (comp.event.window.event == SDL_WINDOWEVENT_ENTER) {
|
||||||
u32 id = comp.event.window.windowID;
|
u32 id = comp.event.window.windowID;
|
||||||
window *wnd = NULL;
|
window *wnd = NULL;
|
||||||
|
|
||||||
@@ -110,29 +112,24 @@ i32 run_main_loop(void) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!wnd) {
|
if (wnd) {
|
||||||
break;
|
SDL_RaiseWindow(wnd->window);
|
||||||
}
|
}
|
||||||
|
|
||||||
SDL_RaiseWindow(wnd->window);
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
break;
|
if (comp.event.type == SDL_DROPFILE) {
|
||||||
case SDL_DROPFILE:
|
|
||||||
if (comp.event.drop.windowID == main_window->id) {
|
if (comp.event.drop.windowID == main_window->id) {
|
||||||
node_data data = (node_data){.path = comp.event.drop.file};
|
node_data data = (node_data){.path = comp.event.drop.file};
|
||||||
|
|
||||||
add_node(&comp, NODE_TYPE_IO, data, IO_INPUT_COUNT, comp.ctx.mouse_x,
|
add_node(&comp, NODE_TYPE_IO, data, IO_INPUT_COUNT, comp.ctx.mouse_x,
|
||||||
comp.ctx.mouse_y, io_node_colours);
|
comp.ctx.mouse_y, io_node_colours);
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
update_node_graph(&comp, main_window);
|
||||||
|
|
||||||
for (u64 i = 0; i < MAX_WINDOWS; ++i) {
|
for (u64 i = 0; i < MAX_WINDOWS; ++i) {
|
||||||
clear_window(&(comp.windows[i]), bg_colour);
|
clear_window(&(comp.windows[i]), bg_colour);
|
||||||
}
|
}
|
||||||
@@ -153,56 +150,7 @@ i32 run_main_loop(void) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for (u64 i = 0; i < comp.count; ++i) {
|
draw_node_graph(&comp, main_window);
|
||||||
node *node_elem = &(comp.nodes[i]);
|
|
||||||
|
|
||||||
f64 angle = 90.0;
|
|
||||||
f64 angle_delta = 25.0;
|
|
||||||
i64 delta_multiplier = node_elem->inputs % 2 == 0 ? -1 : 0;
|
|
||||||
|
|
||||||
for (u64 j = 0; j < comp.nodes[i].inputs; ++j) {
|
|
||||||
f64 new_angle = angle + angle_delta * delta_multiplier;
|
|
||||||
line *ln = &(node_elem->noodles[j]);
|
|
||||||
|
|
||||||
if (ln->p0.x == ln->p1.x && ln->p0.y == ln->p1.y) {
|
|
||||||
point origin = {node_elem->rec.topleft.x + node_elem->rec.w / 2,
|
|
||||||
node_elem->rec.topleft.y + node_elem->rec.h / 2};
|
|
||||||
|
|
||||||
*ln = line_from_origin(origin, new_angle, DEFAULT_NOODLE_LENGTH);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ui_noodle(main_window, &(comp.ctx), *ln, node_elem->colours,
|
|
||||||
node_elem->rec)) {
|
|
||||||
ln->p0.x += comp.ctx.rel_x;
|
|
||||||
ln->p0.y += comp.ctx.rel_y;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (delta_multiplier > 0) {
|
|
||||||
angle = new_angle;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (delta_multiplier == 0) {
|
|
||||||
delta_multiplier = -1;
|
|
||||||
} else {
|
|
||||||
delta_multiplier *= -1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ui_node(main_window, &(comp.ctx), node_elem->rec,
|
|
||||||
node_elem->colours)) {
|
|
||||||
node_elem->rec.topleft.x += comp.ctx.rel_x;
|
|
||||||
node_elem->rec.topleft.y += comp.ctx.rel_y;
|
|
||||||
|
|
||||||
for (u64 j = 0; j < comp.nodes[i].inputs; ++j) {
|
|
||||||
line *ln = &(node_elem->noodles[j]);
|
|
||||||
|
|
||||||
ln->p0.x += comp.ctx.rel_x;
|
|
||||||
ln->p0.y += comp.ctx.rel_y;
|
|
||||||
ln->p1.x += comp.ctx.rel_x;
|
|
||||||
ln->p1.y += comp.ctx.rel_y;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for (u64 i = 0; i < MAX_WINDOWS; ++i) {
|
for (u64 i = 0; i < MAX_WINDOWS; ++i) {
|
||||||
swap_buffers(&(comp.windows[i]));
|
swap_buffers(&(comp.windows[i]));
|
||||||
@@ -222,15 +170,25 @@ i32 run_main_loop(void) {
|
|||||||
return EXIT_SUCCESS;
|
return EXIT_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
void add_node(compositor *comp, node_type type, node_data data, u64 inputs,
|
internal void add_node(compositor *comp, node_type type, node_data data,
|
||||||
i32 x, i32 y, ui_elem_colours colours) {
|
u64 inputs, i32 x, i32 y, ui_elem_colours colours) {
|
||||||
if (comp->count + 1 >= MAX_NODES) {
|
if (comp->count + 1 >= MAX_NODES) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
u64 alloc_size = inputs * sizeof(line);
|
u64 alloc_size = inputs * sizeof(noodle);
|
||||||
line *noodles = mem_arena_alloc(comp->arena, alloc_size);
|
noodle *noodles = mem_arena_alloc(comp->arena, alloc_size);
|
||||||
if (!noodles) {
|
noodle *back_noodles = mem_arena_alloc(comp->arena, alloc_size);
|
||||||
|
if (!noodles || !back_noodles) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
u64 connected_alloc_size = MAX_NODES * sizeof(noodle *);
|
||||||
|
noodle **connected_noodles =
|
||||||
|
mem_arena_alloc(comp->arena, connected_alloc_size);
|
||||||
|
noodle **connected_back_noodles =
|
||||||
|
mem_arena_alloc(comp->arena, connected_alloc_size);
|
||||||
|
if (!connected_noodles || !connected_back_noodles) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -241,12 +199,174 @@ void add_node(compositor *comp, node_type type, node_data data, u64 inputs,
|
|||||||
.h = NODE_HEIGHT,
|
.h = NODE_HEIGHT,
|
||||||
};
|
};
|
||||||
|
|
||||||
comp->nodes[(comp->count)++] = (node){
|
u64 idx = ++(comp->count);
|
||||||
|
|
||||||
|
comp->nodes[idx] = comp->back_nodes[idx] = (node){
|
||||||
.rec = rec,
|
.rec = rec,
|
||||||
.colours = colours,
|
.colours = colours,
|
||||||
.type = type,
|
.type = type,
|
||||||
.data.path = data.path,
|
.data.path = data.path,
|
||||||
.inputs = inputs,
|
.inputs = inputs,
|
||||||
|
.connected = 0,
|
||||||
.noodles = noodles,
|
.noodles = noodles,
|
||||||
|
.connected_noodles = connected_noodles,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
comp->back_nodes[idx].noodles = back_noodles;
|
||||||
|
comp->back_nodes[idx].connected_noodles = connected_back_noodles;
|
||||||
|
}
|
||||||
|
|
||||||
|
internal void update_node_graph(compositor *comp, const window *wnd) {
|
||||||
|
for (u64 i = NODE_START; i <= comp->count; ++i) {
|
||||||
|
node *node_elem = &(comp->nodes[i]);
|
||||||
|
const node *back_node = &(comp->back_nodes[i]);
|
||||||
|
|
||||||
|
node_elem->rec = back_node->rec;
|
||||||
|
node_elem->connected = back_node->connected;
|
||||||
|
|
||||||
|
for (u64 j = 0; j < node_elem->inputs; ++j) {
|
||||||
|
noodle *ndl = &(node_elem->noodles[j]);
|
||||||
|
const noodle *back_ndl = &(back_node->noodles[j]);
|
||||||
|
|
||||||
|
*ndl = *back_ndl;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (u64 j = CONNECTION_START; j <= back_node->connected; ++j) {
|
||||||
|
node_elem->connected_noodles[j] = back_node->connected_noodles[j];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
internal void draw_node_graph(compositor *comp, const window *wnd) {
|
||||||
|
for (u64 i = NODE_START; i <= comp->count; ++i) {
|
||||||
|
node *node_elem = &(comp->nodes[i]);
|
||||||
|
node *back_node = &(comp->back_nodes[i]);
|
||||||
|
|
||||||
|
f64 angle = 90.0;
|
||||||
|
f64 angle_delta = 25.0;
|
||||||
|
i64 delta_multiplier = node_elem->inputs % 2 == 0 ? -1 : 0;
|
||||||
|
|
||||||
|
for (u64 j = 0; j < node_elem->inputs; ++j) {
|
||||||
|
f64 new_angle = angle + angle_delta * delta_multiplier;
|
||||||
|
noodle *ndl = &(node_elem->noodles[j]);
|
||||||
|
noodle *back_ndl = &(back_node->noodles[j]);
|
||||||
|
|
||||||
|
if (ndl->ln.p0.x == ndl->ln.p1.x && ndl->ln.p0.y == ndl->ln.p1.y) {
|
||||||
|
point origin = {node_elem->rec.topleft.x + node_elem->rec.w / 2,
|
||||||
|
node_elem->rec.topleft.y + node_elem->rec.h / 2};
|
||||||
|
|
||||||
|
back_ndl->ln =
|
||||||
|
line_from_origin(origin, new_angle, DEFAULT_NOODLE_LENGTH);
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (ui_noodle(wnd, &(comp->ctx), ndl->ln, node_elem->colours,
|
||||||
|
node_elem->rec)) {
|
||||||
|
case NOODLE_ACTION_DRAGGING:
|
||||||
|
back_ndl->ln.p0.x += comp->ctx.rel_x;
|
||||||
|
back_ndl->ln.p0.y += comp->ctx.rel_y;
|
||||||
|
break;
|
||||||
|
case NOODLE_ACTION_RELEASED: {
|
||||||
|
bool connected = false;
|
||||||
|
bool disconnect = false;
|
||||||
|
|
||||||
|
for (u64 k = NODE_START; k <= comp->count; ++k) {
|
||||||
|
if (k == i) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
const node *nd = &(comp->nodes[k]);
|
||||||
|
node *back_node = &(comp->back_nodes[k]);
|
||||||
|
|
||||||
|
if (aabb(nd->rec, comp->ctx.mouse_x, comp->ctx.mouse_y)) {
|
||||||
|
point p0 = {nd->rec.topleft.x + nd->rec.w / 2,
|
||||||
|
nd->rec.topleft.y + nd->rec.h / 2};
|
||||||
|
|
||||||
|
back_ndl->ln.p0 = p0;
|
||||||
|
|
||||||
|
connected = true;
|
||||||
|
disconnect = back_ndl->connected_node != EMPTY_NODE &&
|
||||||
|
back_ndl->connected_node != k;
|
||||||
|
|
||||||
|
if (back_ndl->connected_node != k) {
|
||||||
|
back_ndl->connected_node = k;
|
||||||
|
u64 idx = ++(back_node->connected);
|
||||||
|
back_ndl->connection_idx = idx;
|
||||||
|
back_node->connected_noodles[idx] = back_ndl;
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
} else {
|
||||||
|
if (back_ndl->connected_node != EMPTY_NODE) {
|
||||||
|
disconnect = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (disconnect) {
|
||||||
|
u64 conntection_idx = back_ndl->connection_idx;
|
||||||
|
u64 node_idx = back_ndl->connected_node;
|
||||||
|
|
||||||
|
node *connected_node = &(comp->back_nodes[node_idx]);
|
||||||
|
|
||||||
|
if (conntection_idx == connected_node->connected) {
|
||||||
|
connected_node->connected_noodles[conntection_idx] = NULL;
|
||||||
|
} else {
|
||||||
|
connected_node->connected_noodles[conntection_idx] =
|
||||||
|
connected_node->connected_noodles[connected_node->connected];
|
||||||
|
connected_node->connected_noodles[connected_node->connected] = NULL;
|
||||||
|
|
||||||
|
connected_node->connected_noodles[conntection_idx]->connection_idx =
|
||||||
|
conntection_idx;
|
||||||
|
}
|
||||||
|
|
||||||
|
connected_node->connected -= 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!connected) {
|
||||||
|
back_ndl->ln.p0 = ndl->ln.p1;
|
||||||
|
back_ndl->connected_node = EMPTY_NODE;
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (delta_multiplier > 0) {
|
||||||
|
angle = new_angle;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (delta_multiplier == 0) {
|
||||||
|
delta_multiplier = -1;
|
||||||
|
} else {
|
||||||
|
delta_multiplier *= -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ui_node(wnd, &(comp->ctx), node_elem->rec, node_elem->colours)) {
|
||||||
|
back_node->rec.topleft.x += comp->ctx.rel_x;
|
||||||
|
back_node->rec.topleft.y += comp->ctx.rel_y;
|
||||||
|
|
||||||
|
for (u64 j = 0; j < node_elem->inputs; ++j) {
|
||||||
|
noodle *ndl = &(node_elem->noodles[j]);
|
||||||
|
noodle *back_ndl = &(back_node->noodles[j]);
|
||||||
|
|
||||||
|
if (ndl->connected_node == EMPTY_NODE) {
|
||||||
|
back_ndl->ln.p0.x += comp->ctx.rel_x;
|
||||||
|
back_ndl->ln.p0.y += comp->ctx.rel_y;
|
||||||
|
}
|
||||||
|
|
||||||
|
back_ndl->ln.p1.x += comp->ctx.rel_x;
|
||||||
|
back_ndl->ln.p1.y += comp->ctx.rel_y;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (u64 j = CONNECTION_START; j <= back_node->connected; ++j) {
|
||||||
|
noodle *ndl = back_node->connected_noodles[j];
|
||||||
|
|
||||||
|
ndl->ln.p0.x += comp->ctx.rel_x;
|
||||||
|
ndl->ln.p0.y += comp->ctx.rel_y;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
34
src/ui.c
34
src/ui.c
@@ -26,34 +26,31 @@ void reset_ui_ctx(ui_ctx *ctx) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void handle_ui_events(const window *wnd, ui_ctx *ctx, const SDL_Event *event) {
|
void handle_ui_events(const window *wnd, ui_ctx *ctx, const SDL_Event *event) {
|
||||||
switch (event->type) {
|
if (event->type == SDL_MOUSEMOTION) {
|
||||||
case SDL_MOUSEMOTION:
|
|
||||||
if (wnd->id == event->motion.windowID) {
|
if (wnd->id == event->motion.windowID) {
|
||||||
ctx->mouse_x = event->motion.x;
|
ctx->mouse_x = event->motion.x;
|
||||||
ctx->mouse_y = event->motion.y;
|
ctx->mouse_y = event->motion.y;
|
||||||
ctx->rel_x += event->motion.xrel;
|
ctx->rel_x += event->motion.xrel;
|
||||||
ctx->rel_y += event->motion.yrel;
|
ctx->rel_y += event->motion.yrel;
|
||||||
ctx->wnd = wnd;
|
ctx->wnd = wnd;
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
case SDL_MOUSEBUTTONDOWN:
|
}
|
||||||
|
|
||||||
|
if (event->type == SDL_MOUSEBUTTONDOWN) {
|
||||||
if (wnd->id == event->button.windowID) {
|
if (wnd->id == event->button.windowID) {
|
||||||
ctx->mouse_x = event->button.x;
|
ctx->mouse_x = event->button.x;
|
||||||
ctx->mouse_y = event->button.y;
|
ctx->mouse_y = event->button.y;
|
||||||
ctx->mouse_down = true;
|
ctx->mouse_down = true;
|
||||||
ctx->wnd = wnd;
|
ctx->wnd = wnd;
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
case SDL_MOUSEBUTTONUP:
|
}
|
||||||
|
|
||||||
|
if (event->type == SDL_MOUSEBUTTONUP) {
|
||||||
if (wnd->id == event->button.windowID) {
|
if (wnd->id == event->button.windowID) {
|
||||||
ctx->mouse_x = event->button.x;
|
ctx->mouse_x = event->button.x;
|
||||||
ctx->mouse_y = event->button.y;
|
ctx->mouse_y = event->button.y;
|
||||||
ctx->mouse_up = true;
|
ctx->mouse_up = true;
|
||||||
ctx->wnd = wnd;
|
ctx->wnd = wnd;
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -141,10 +138,10 @@ bool ui_node(const window *wnd, ui_ctx *ctx, rect rect,
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ui_noodle(const window *wnd, ui_ctx *ctx, line ln, ui_elem_colours colours,
|
noodle_action ui_noodle(const window *wnd, ui_ctx *ctx, line ln,
|
||||||
rect parent_node) {
|
ui_elem_colours colours, rect parent_node) {
|
||||||
if (ctx->count + 1 >= MAX_UI_ELEMENTS) {
|
if (ctx->count + 1 >= MAX_UI_ELEMENTS) {
|
||||||
return false;
|
return NOODLE_ACTION_NONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
u64 id = get_id(ctx);
|
u64 id = get_id(ctx);
|
||||||
@@ -220,24 +217,25 @@ bool ui_noodle(const window *wnd, ui_ctx *ctx, line ln, ui_elem_colours colours,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (wnd != ctx->wnd || (ctx->active >= 0 && ctx->active != id)) {
|
if (wnd != ctx->wnd || (ctx->active >= 0 && ctx->active != id)) {
|
||||||
return false;
|
return NOODLE_ACTION_NONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ctx->mouse_up) {
|
if (ctx->mouse_up) {
|
||||||
if (ctx->hovered == ctx->active && ctx->hovered == id) {
|
if (ctx->hovered == ctx->active && ctx->hovered == id) {
|
||||||
ctx->hovered = ctx->active = -1;
|
ctx->hovered = ctx->active = -1;
|
||||||
|
return NOODLE_ACTION_RELEASED;
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return NOODLE_ACTION_NONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ctx->hovered == id && ctx->active == id) {
|
if (ctx->hovered == id && ctx->active == id) {
|
||||||
return true;
|
return NOODLE_ACTION_DRAGGING;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!aabb(bounding_box, ctx->mouse_x, ctx->mouse_y) ||
|
if (!aabb(bounding_box, ctx->mouse_x, ctx->mouse_y) ||
|
||||||
aabb(parent_node, ctx->mouse_x, ctx->mouse_y)) {
|
aabb(parent_node, ctx->mouse_x, ctx->mouse_y)) {
|
||||||
return false;
|
return NOODLE_ACTION_NONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
ctx->hovered = id;
|
ctx->hovered = id;
|
||||||
@@ -246,7 +244,7 @@ bool ui_noodle(const window *wnd, ui_ctx *ctx, line ln, ui_elem_colours colours,
|
|||||||
ctx->active = id;
|
ctx->active = id;
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
return NOODLE_ACTION_NONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
internal u64 get_id(ui_ctx *ctx) {
|
internal u64 get_id(ui_ctx *ctx) {
|
||||||
|
Reference in New Issue
Block a user