1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
|
#include "cglm/types.h"
#include "events.h"
#include "graphics.h"
#include "text.h"
#include "utils.h"
#include "window.h"
#define WAYC_APP_NAME "Wayclock"
#define WAYC_APP_WIDTH 1280
#define WAYC_APP_HEIGHT 1080
#define WAYC_FONT "assets/AdwaitaMono-Regular.ttf"
#define WAYC_ATLAS_WIDTH 512
#define WAYC_ATLAS_HEIGHT 512
#define WAYC_FONT_SIZE 48
#define WAYC_CLEAR_COLOR vec4{0.1f, 0.2f, 0.2f, 1.0f}
#define WAYC_LOCATION vec2{100.0f, 100.0f}
struct app_s {
struct renderer_s* renderer;
struct text_group_s* text_group;
struct font_context_s* font_context;
struct font_s* font;
};
void wayc_frame(struct app_s* app, struct window_s* window,
struct eventloop_s* loop) {
wayc_notnull(window);
wayc_notnull(loop);
wayc_notnull(app);
struct renderer_s* renderer = app->renderer;
struct font_s* font = app->font;
struct text_mesh_s text_mesh;
if (!wayc_text_mesh_init(&text_mesh, "Hello, Wayclock!", 15, font,
WAYC_LOCATION))
wayc_panic("Failed to initialize text mesh");
wayc_defer(wayc_text_mesh_deinit(&text_mesh));
wayc_renderer_begin(renderer);
wayc_text_group_begin(app->text_group);
wayc_text_group_end(app->text_group, app->font_context);
wayc_renderer_end(renderer);
}
void wayc_handle(u8* user, struct eventloop_s* loop, struct event_s* event) {
wayc_notnull(loop);
wayc_notnull(event);
struct app_s* app = (struct app_s*)user;
struct renderer_s* renderer = app->renderer;
struct window_s* window = event->window;
union event_data_u data = event->data;
switch (event->kind) {
case EVENT_KIND_CLOSE:
wayc_eventloop_unregister(loop, window->id);
break;
case EVENT_KIND_RESIZE: {
struct event_resize_s resize = data.resize;
wayc_renderer_resize(renderer, resize.width, resize.height);
} break;
case EVENT_KIND_FRAME:
wayc_frame(app, window, loop);
break;
default:
break;
}
}
int main() {
struct eventloop_s loop;
if (wayc_eventloop_init(&loop, wayc_handle) != EVENTLOOP_ERROR_NONE)
wayc_panic("Failed to initialize event loop");
wayc_defer(wayc_eventloop_deinit(&loop));
struct graphics_s graphics;
if (wayc_graphics_init(&graphics, &loop.state) != GRAPHICS_ERROR_NONE)
wayc_panic("Failed to initialize graphics");
wayc_defer(wayc_graphics_deinit(&graphics));
struct window_s window;
if (wayc_window_init(&window, WAYC_APP_NAME, &loop) != WINDOW_ERROR_NONE)
wayc_panic("Failed to initialize window");
window_id_t winid = wayc_eventloop_register(&loop, &window);
window.id = winid;
wayc_defer({
wayc_eventloop_unregister(&loop, winid);
wayc_window_deinit(&window);
});
struct renderer_s renderer;
if (wayc_renderer_init(&renderer, &window, &graphics, WAYC_APP_WIDTH,
WAYC_APP_HEIGHT,
WAYC_CLEAR_COLOR) != RENDERER_ERROR_NONE)
wayc_panic("Failed to initialize renderer");
wayc_defer(wayc_renderer_deinit(&renderer));
wayc_renderer_use(&renderer);
wayc_window_redraw(&window, &loop);
struct font_context_s font_context;
if (wayc_font_context_init(&font_context) != FONT_CONTEXT_ERROR_NONE)
wayc_panic("Failed to initialize font context");
wayc_defer(wayc_font_context_deinit(&font_context));
struct font_s font;
if (wayc_font_init(&font, &font_context, WAYC_FONT, WAYC_FONT_SIZE,
WAYC_ATLAS_WIDTH, WAYC_ATLAS_HEIGHT) != FONT_ERROR_NONE)
wayc_panic("Failed to initialize font");
wayc_defer(wayc_font_deinit(&font));
struct text_group_s text_group;
if (!wayc_text_group_init(&text_group, &font, 128))
wayc_panic("Failed to initialize text group");
struct app_s app = {&renderer, &text_group, &font_context, &font};
while (wayc_eventloop_running(&loop)) {
wayc_eventloop_update(&loop, (u8*)&app);
wayc_window_redraw(&window, &loop);
}
return 0;
}
|