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 }