ddt_ex

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | Submodules | LICENSE

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 }