revolver

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

simple_triangle.c (4527B)


      1 //////////////////////////////////////////////////////////////////
      2 // simple_triangle.c
      3 
      4 #include "revolver_inc.h"
      5 #include "revolver_inc.c"
      6 
      7 //////////////////////////////////////////////////////////////////
      8 // data
      9 
     10 f32 v_data[] = {
     11      0.0,  0.5, 1, 0, 0,
     12     -0.5, -0.5, 0, 1, 0,
     13      0.5, -0.5, 0, 0, 1,
     14 };
     15 
     16 rv_str8 v_src = S("#version 330 core\n" rv_strify(
     17     layout(location = 0) in vec2 a_pos;
     18     layout(location = 1) in vec3 a_color;
     19     precision mediump float;
     20     out vec3 f_color;
     21     void main()
     22     {
     23         gl_Position = vec4(a_pos, 0.0, 1.0);
     24         f_color = a_color;
     25     }
     26 ));
     27 
     28 rv_str8 f_src = S("#version 330 core\n" rv_strify(
     29     precision mediump float;
     30     in vec3 f_color;
     31     out vec4 frag_color;
     32     void main()
     33     {
     34         frag_color = vec4(f_color, 1.0);
     35     }
     36 ));
     37 
     38 //////////////////////////////////////////////////////////////////
     39 
     40 int main(void) {
     41     rv_window_desc_t desc = {.name = S("App"), .attach_render = true};
     42     rv_window_handle_t* window = rv_create_window(desc);
     43 
     44     rv_arena* arena = rv_arena_alloc();
     45     rv_render_pass_list_t rpass_list = {0};
     46 
     47     // make render objects
     48     rv_vbo_t*      vbo      = rv_push_compound(arena, rv_vbo_t,     {.data   = v_data,     .size = sizeof(v_data)});
     49     rv_shader_t*   vertex   = rv_push_compound(arena, rv_shader_t,  {.source = v_src,      .type = RV_SHADER_TYPE_VERTEX});
     50     rv_shader_t*   fragment = rv_push_compound(arena, rv_shader_t,  {.source = f_src,      .type = RV_SHADER_TYPE_FRAGMENT});
     51     rv_pipeline_t* pip       = rv_push(arena, rv_pipeline_t);
     52 
     53     // construct pipeline
     54     rv_pipeline_push_shader(arena, pip, vertex);
     55     rv_pipeline_push_shader(arena, pip, fragment);
     56     rv_pipeline_push_vattr(arena,  pip, RV_VATTR_TYPE_FLOAT2, 0, 0);
     57     rv_pipeline_push_vattr(arena,  pip, RV_VATTR_TYPE_FLOAT3, 0, 0);
     58 
     59     // instructions to create render objects
     60     rv_command_list_t create_instructions = {0};
     61     rv_cmd_push_obj(arena, &create_instructions, RV_COMMAND_OBJ_VERTEX,   RV_RENDER_OBJ_OP_CREATE, vbo);
     62     rv_cmd_push_obj(arena, &create_instructions, RV_COMMAND_OBJ_SHADER,   RV_RENDER_OBJ_OP_CREATE, vertex);
     63     rv_cmd_push_obj(arena, &create_instructions, RV_COMMAND_OBJ_SHADER,   RV_RENDER_OBJ_OP_CREATE, fragment);
     64     rv_cmd_push_obj(arena, &create_instructions, RV_COMMAND_OBJ_PIPELINE, RV_RENDER_OBJ_OP_CREATE, pip);
     65 
     66     // instructions to render
     67     rv_command_list_t render_instructions = {0};
     68     rv_cmd_push_obj(arena,  &render_instructions, RV_COMMAND_OBJ_PIPELINE, RV_RENDER_OBJ_OP_BIND, pip);
     69     rv_cmd_push_obj(arena,  &render_instructions, RV_COMMAND_OBJ_VERTEX,   RV_RENDER_OBJ_OP_BIND, vbo);
     70     rv_cmd_push_type(arena, &render_instructions, RV_COMMAND_DRAW)->draw.count = 3;
     71     rv_cmd_push_obj(arena,  &render_instructions, RV_COMMAND_OBJ_PIPELINE, RV_RENDER_OBJ_OP_BIND, NULL);
     72 
     73     // copy over create commands
     74     rv_render_pass_t* create_rpass = rv_render_push_render_pass(arena, &rpass_list);
     75     rv_render_copy_commands(arena, &create_rpass->commands, &create_instructions);
     76 
     77     while(1) {
     78         rv_temp_arena scratch = rv_scratch_begin(0, 0);
     79 
     80         // pick renderpass
     81         rv_render_pass_t* rpass = rv_render_push_render_pass(scratch.arena, &rpass_list);
     82 
     83         // process events
     84         for (rv_event_t* e = rv_get_events(scratch.arena, 0); e; e = e->next) {
     85             if (e->type == RV_EVENT_WINDOW_CLOSE) {
     86                 if (e->window_close == window) {
     87                     goto exit_program;
     88                 }
     89             }
     90             if (e->type == RV_EVENT_WINDOW_RESIZE) {
     91                 // set viewport
     92                 rv_command_t* viewport = rv_cmd_push_type(scratch.arena, &rpass->commands, RV_COMMAND_SET_VIEWPORT);
     93                 viewport->viewport = rv_v4(.xy = {0, 0}, .zw = rv_window_size(window));
     94             }
     95         }
     96 
     97 
     98         { // clear
     99             rv_command_t* clear = rv_cmd_push_type(scratch.arena, &rpass->commands, RV_COMMAND_CLEAR);
    100             rv_render_clear_desc_t* clear_desc = rv_render_push_clear_desc(scratch.arena, clear, RV_RENDER_CLEAR_FLAG_COLOR);
    101             clear_desc->color_v = rv_v4(0.1, 0.1, 0.1, 1.0);
    102         }
    103 
    104         { // draw custom shader
    105             // copy render commands
    106             rv_render_copy_commands(scratch.arena, &rpass->commands, &render_instructions);
    107         }
    108 
    109         if (window) { // render screen
    110             rv_window_render_commit(window, &rpass_list);
    111         }
    112         rv_scratch_end(scratch);
    113         rpass_list = (rv_render_pass_list_t){0};
    114     }
    115 exit_program:
    116 
    117     return 0;
    118 }