#pragma once #include "basic.h" #include #include #include #include #include "render_data.h" #include "user_interface.h" struct Frame_Buffer { u32 width = 640; u32 height = 480; u32 buffer = 0; u32 color_tex = 0; u32 depth_buffer = 0; }; struct Vertex_Buffer { u32 vao = 0; u32 vbo = 0; }; struct Uniform_Buffer { u32 ubo_buffer = 0; }; struct Texture { u32 texture = 0; s32 width = 0; s32 height = 0; s32 number_of_channels = 0; string name; }; struct Shader { u32 program = 0; }; struct Renderer { Shader shader; Shader alt_shader; Frame_Buffer frame_buffer; Vertex_Buffer vertex_buffer; Uniform_Buffer uniform_buffer; Texture texture; Mesh mesh; bool use_alt_shader = false; Matrix4 view_matrix = Matrix4(1.0f); Matrix4 projection_matrix = Matrix4(1.0f); User_Interface user_interface; Render_Data render_data; }; bool init_renderer(Renderer *renderer, u32 width, u32 height); void set_renderer_size(Renderer *renderer, u32 width, u32 height); void draw_renderer(Renderer *renderer); void upload_renderer_data(Renderer *renderer, Mesh *vertex_data); void cleanup_renderer(Renderer *renderer); bool init_frame_buffer(Frame_Buffer *frame_buffer, u32 width, u32 height); bool resize_frame_buffer(Frame_Buffer *frame_buffer, u32 width, u32 height); bool check_frame_buffer_complete(Frame_Buffer *frame_buffer); void bind_frame_buffer(Frame_Buffer *frame_buffer); void unbind_frame_buffer(Frame_Buffer *frame_buffer); void draw_frame_buffer(Frame_Buffer *frame_buffer); void cleanup_frame_buffer(Frame_Buffer *frame_buffer); bool init_vertex_buffer(Vertex_Buffer *vertex_buffer); void cleanup_vertex_buffer(Vertex_Buffer *vertex_buffer); void upload_vertex_buffer_data(Vertex_Buffer *vertex_buffer, Mesh *vertex_data); void bind_vertex_buffer(Vertex_Buffer *vertex_buffer); void unbind_vertex_buffer(); void draw_vertex_buffer(u32 mode, u32 start, u32 num); bool init_uniform_buffer(Uniform_Buffer *uniform_buffer); void upload_uniform_buffer_data(Uniform_Buffer *uniform_buffer, Matrix4 view_matrix, Matrix4 projection_matrix); void cleanup(Uniform_Buffer *uniform_buffer); bool load_texture(Texture *texture, string filepath); void bind_texture(Texture *texture); void unbind_texture(); void cleanup_texture(Texture *texture); bool load_shaders(Shader *shader, string vertex_shader_filepath, string fragment_shader_filepath); u32 load_shader(string filepath, u32 shader_type); void use_shader(Shader *shader); void cleanup_shader(Shader *shader);