test.c (2988B)
1 2 3 #include "revolver_inc.h" 4 #include "revolver_inc.c" 5 6 7 int main(void) { 8 rv_window_desc_t desc = {.name = S("App"), .attach_render = true,}; 9 rv_window_handle_t* window = rv_create_window(desc); 10 11 rv_arena* arena = rv_arena_alloc(); 12 rv_render_pass_list_t rpass_list = {0}; 13 14 rv_ascii_font_t* font = rv_ascii_font_from_file(arena, S("/usr/share/fonts/ttf/IosevkaSlab-Regular.ttc"), 30); 15 rv_texture_t* tex = rv_tex_load_from_file(arena, S("chad.jpeg"), false); 16 17 rv_render_pass_t* create_rpass = rv_render_push_render_pass(arena, &rpass_list); 18 19 rv_cmd_push_obj(arena, &create_rpass->commands, RV_COMMAND_OBJ_TEXTURE, RV_RENDER_OBJ_OP_CREATE, tex); 20 rv_cmd_push_obj(arena, &create_rpass->commands, RV_COMMAND_OBJ_TEXTURE, RV_RENDER_OBJ_OP_CREATE, font->tex); 21 22 rv_idraw2d_ctx rvi = {0}; 23 rvi2d_create(&rvi, arena, &create_rpass->commands); 24 25 while(1) { 26 rv_temp_arena scratch = rv_scratch_begin(0, 0); 27 rv_vec2 window_size = rv_window_size(window); 28 29 // pick renderpass 30 rv_render_pass_t* rpass = rv_render_push_render_pass(scratch.arena, &rpass_list); 31 32 bool32 vsync = true; 33 34 // process events 35 for (rv_event_t* e = rv_get_events(scratch.arena, 0); e; e = e->next) { 36 if (e->type == RV_EVENT_WINDOW_CLOSE) { 37 if (e->window_close == window) { 38 goto exit_program; 39 } 40 } 41 if (e->type == RV_EVENT_WINDOW_RESIZE) { 42 // set viewport 43 rv_command_t* viewport = rv_cmd_push_type(scratch.arena, &rpass->commands, RV_COMMAND_SET_VIEWPORT); 44 viewport->viewport = rv_v4(.xy = {0, 0}, .zw = rv_window_size(window)); 45 vsync = false; 46 } 47 } 48 49 { // clear 50 rv_command_t* clear = rv_cmd_push_type(scratch.arena, &rpass->commands, RV_COMMAND_CLEAR); 51 rv_render_clear_desc_t* clear_desc = rv_render_push_clear_desc(scratch.arena, clear, RV_RENDER_CLEAR_FLAG_COLOR); 52 clear_desc->color_v = rv_v4(0.1, 0.1, 0.1, 1.0); 53 } 54 55 { // draw image 56 rvi2d_camera(&rvi, window_size); 57 58 f32 screen_ratio = window_size.x / window_size.y; 59 f32 image_ratio = tex->size.x / tex->size.y; 60 rvi2d_tex(&rvi, tex); 61 if (screen_ratio > image_ratio) { 62 rvi2d_rect(&rvi, rv_rct(0, 0, window_size.x * image_ratio/screen_ratio, window_size.y), RV_COLOR_WHITE); 63 } else { 64 rvi2d_rect(&rvi, rv_rct(0, 0, window_size.x, window_size.y * screen_ratio/image_ratio), RV_COLOR_WHITE); 65 } 66 rvi2d_tex(&rvi, NULL); 67 68 } 69 70 rvi2d_draw_and_reset(&rvi, scratch.arena, &rpass->commands); 71 72 if (window) { // render screen 73 rv_window_render_commit(window, &rpass_list); 74 } 75 rv_scratch_end(scratch); 76 rpass_list = (rv_render_pass_list_t){0}; 77 } 78 exit_program: 79 80 return 0; 81 }