main.c (7343B)
1 /* 2 * This example is created form the gs_project_template 3 * See the LICENSE file for details 4 */ 5 6 #define GS_IMPL 7 #include <gs/gs.h> 8 9 #define GS_IMMEDIATE_DRAW_IMPL 10 #include <gs/util/gs_idraw.h> 11 12 #define GS_GUI_IMPL 13 #include <gs/util/gs_gui.h> 14 15 typedef struct app_t 16 { 17 gs_command_buffer_t cb; 18 gs_immediate_draw_t gsi; 19 gs_gui_context_t gui; 20 } app_t; 21 22 #define GS_DDT_IMPL 23 #include "gs_ddt/gs_ddt.h" 24 25 static int bg, window = 1, embeded, summons; 26 27 static void toggle_bg(int argc, char** argv); 28 static void toggle_window(int argc, char** argv); 29 static void toggle_embedded(int argc, char** argv); 30 static void help(int argc, char** argv); 31 static void echo(int argc, char** argv); 32 static void spam(int argc, char** argv); 33 void summon(int argc, char** argv); 34 void sz(int argc, char** argv); 35 36 gs_ddt_command_t commands[] = { 37 { 38 .func = echo, 39 .name = "echo", 40 .desc = "repeat what was entered", 41 }, 42 { 43 .func = spam, 44 .name = "spam", 45 .desc = "send the word arg1, arg2 amount of times", 46 }, 47 { 48 .func = help, 49 .name = "help", 50 .desc = "sends a list of commands", 51 }, 52 { 53 .func = toggle_bg, 54 .name = "bg", 55 .desc = "toggles background", 56 }, 57 { 58 .func = toggle_window, 59 .name = "window", 60 .desc = "toggles gui window", 61 }, 62 { 63 .func = toggle_embedded, 64 .name = "embed", 65 .desc = "places the ddt inside the window", 66 }, 67 { 68 .func = summon, 69 .name = "summon", 70 .desc = "summons a gui window", 71 }, 72 { 73 .func = sz, 74 .name = "sz", 75 .desc = "change ddt size", 76 }, 77 }; 78 79 gs_ddt_t ddt = { 80 .tb = "", 81 .cb = "", 82 .commands = commands, 83 .commands_len = gs_array_size(commands), 84 .size = 0.4, 85 .open_speed = 0.2, 86 .close_speed = 0.3, 87 .autoscroll = 1, 88 }; 89 90 void 91 toggle_bg(int argc, char** argv) 92 { 93 gs_ddt_printf(&ddt, "Background turned %s\n", (bg = !bg) ? "on" : "off"); 94 } 95 96 void 97 sz(int argc, char** argv) 98 { 99 if (argc != 2) { 100 gs_ddt_printf(&ddt, "[sz]: needs 1 argument!\n"); 101 return; 102 } 103 float sz = atof(argv[1]); 104 if (sz > 1 || sz < 0) { 105 gs_ddt_printf(&ddt, "[sz]: number needs to be between (0, 1)"); 106 return; 107 } 108 ddt.size = sz; 109 110 gs_ddt_printf(&ddt, "ddt size is now %f\n", sz); 111 } 112 113 void 114 toggle_window(int argc, char** argv) 115 { 116 if (window && embeded) 117 gs_ddt_printf(&ddt, "Unable to turn off window, ddt is embeded!\n"); 118 else 119 gs_ddt_printf(&ddt, "GUI Window turned %s\n", (window = !window) ? "on" : "off"); 120 } 121 122 void 123 toggle_embedded(int argc, char** argv) 124 { 125 if (!window && !embeded) 126 gs_ddt_printf(&ddt, "Unable to embed into window, open window first!\n"); 127 else 128 gs_ddt_printf(&ddt, "ddt embedded turned %s\n", (embeded = !embeded) ? "on" : "off"); 129 } 130 131 void 132 summon(int argc, char** argv) 133 { 134 gs_ddt_printf(&ddt, "A summoner has cast his spell! A window has appeared!!!!\n"); 135 summons++; 136 } 137 138 void 139 spam(int argc, char** argv) 140 { 141 if (argc != 3) goto spam_invalid_command; 142 int count = atoi(argv[2]); 143 if (!count) goto spam_invalid_command; 144 while (count--) gs_ddt_printf(&ddt, "%s\n", argv[1]); 145 return; 146 spam_invalid_command: 147 gs_ddt_printf(&ddt, "[spam]: invalid usage. It should be 'spam word [int count]''\n"); 148 } 149 150 void 151 echo(int argc, char** argv) 152 { 153 for (int i = 1; i < argc; i++) 154 gs_ddt_printf(&ddt, "%s ", argv[i]); 155 gs_ddt_printf(&ddt, "\n"); 156 } 157 158 void 159 help(int argc, char** argv) 160 { 161 for (int i = 0; i < gs_array_size(commands); i++) { 162 if (commands[i].name) gs_ddt_printf(&ddt, "* Command: %s\n", commands[i].name); 163 if (commands[i].desc) gs_ddt_printf(&ddt, "- desc: %s\n", commands[i].desc); 164 } 165 } 166 167 void app_init() 168 { 169 app_t* app = gs_user_data(app_t); 170 app->cb = gs_command_buffer_new(); 171 app->gsi = gs_immediate_draw_new(gs_platform_main_window()); 172 gs_gui_init(&app->gui, gs_platform_main_window()); 173 } 174 175 void app_update() 176 { 177 app_t* app = gs_user_data(app_t); 178 gs_command_buffer_t* cb = &app->cb; 179 gs_immediate_draw_t* gsi = &app->gsi; 180 gs_gui_context_t* gui = &app->gui; 181 182 gs_vec2 fbs = gs_platform_framebuffer_sizev(gs_platform_main_window()); 183 const float t = gs_platform_elapsed_time() * 0.0001f; 184 185 if (gs_platform_key_pressed(GS_KEYCODE_ESC)) { 186 ddt.open = !ddt.open; 187 } else if (gs_platform_key_pressed(GS_KEYCODE_TAB) && ddt.open) { 188 ddt.autoscroll = !ddt.autoscroll; 189 } 190 191 if (bg) { 192 gsi_camera3D(gsi, fbs.x, fbs.y); 193 gsi_rotatev(gsi, gs_deg2rad(90.f), GS_ZAXIS); gsi_rotatev(gsi, t, GS_YAXIS); 194 gsi_sphere(gsi, 0.f, 0.f, 0.f, 1.f, 50, 150, 200, 50, GS_GRAPHICS_PRIMITIVE_LINES); 195 } 196 gsi_camera2D(gsi, fbs.x, fbs.y); 197 gsi_text(gsi, fbs.x * 0.5f - 198.f, fbs.y * 0.5f, "ESC to open term, TAB toggle autoscroll, help for more", NULL, false, 255, 255, 255, 255); 198 gsi_renderpass_submit(gsi, cb, fbs.x, fbs.y, gs_color(10, 10, 10, 255)); 199 200 // Render gui 201 gs_gui_begin(gui, NULL); 202 203 gs_gui_layout_t l; 204 if (window && gs_gui_window_begin(gui, "App", gs_gui_rect(100, 100, 200, 200))) { 205 l = *gs_gui_get_layout(gui); 206 gs_gui_layout_row(gui, 1, (int[]){-1}, 0); 207 gs_gui_text(gui, "Hello, Gunslinger."); 208 gs_gui_window_end(gui); 209 } 210 211 int s = summons; 212 while (s--) { 213 gs_gui_push_id(gui, &s, sizeof(s)); 214 if (gs_gui_window_begin(gui, "Summon", gs_gui_rect(100, 100, 200, 200))) { 215 gs_gui_layout_row(gui, 1, (int[]){-1}, 0); 216 gs_gui_text(gui, "At your Service!"); 217 gs_gui_window_end(gui); 218 } 219 gs_gui_pop_id(gui); 220 } 221 222 gs_vec2 fb = gui->framebuffer_size; 223 gs_gui_rect_t screen; 224 if (embeded) 225 screen = l.body; 226 else 227 screen = gs_gui_rect(0, 0, fb.x, fb.y); 228 gs_ddt(&ddt, gui, screen, NULL); 229 230 gs_gui_end(gui); 231 gs_gui_render(gui, cb); 232 233 // Submit command buffer for GPU 234 gs_graphics_command_buffer_submit(cb); 235 } 236 237 void app_shutdown() 238 { 239 app_t* app = gs_user_data(app_t); 240 gs_immediate_draw_free(&app->gsi); 241 gs_command_buffer_free(&app->cb); 242 gs_gui_free(&app->gui); 243 } 244 245 gs_app_desc_t gs_main(int32_t argc, char** argv) 246 { 247 return (gs_app_desc_t) { 248 .user_data = gs_malloc_init(app_t), 249 .window_width = 800, 250 .window_height = 600, 251 .init = app_init, 252 .update = app_update, 253 .shutdown = app_shutdown 254 }; 255 }