#ifndef RENDERER_H #define RENDERER_H struct sys_window; struct sprite_scope; #define RENDERER_TEXTURE_MAX_WIDTH 16384 #define RENDERER_TEXTURE_MAX_HEIGHT 16384 typedef u32 vidx; struct renderer_canvas; /* ========================== * * Shaders * ========================== */ enum shader_kind { SHADER_NONE, SHADER_TEXTURE, SHADER_GRID, NUM_SHADERS }; struct renderer_cmd_parameters { enum shader_kind kind; union { struct { struct renderer_handle texture; /* Overrides sprite if set */ struct sprite_tag sprite; } texture_params; }; }; PACK(struct texture_shader_vertex { struct v2 pos; struct v2 uv; u32 color; }); PACK(struct grid_shader_vertex { struct v2 pos; u32 color; f32 line_thickness; f32 line_spacing; struct v2 offset; }); /* ========================== * * Startup * ========================== */ struct renderer_startup_receipt { i32 _; }; struct renderer_startup_receipt renderer_startup(struct sys_window *window); /* ========================== * * Canvas * ========================== */ struct renderer_canvas *renderer_canvas_alloc(void); void renderer_canvas_release(struct renderer_canvas *canvas); /* Set the canvas view xform to be used when presenting the canvas. * NOTE: `view` should be in row-major order. */ void renderer_canvas_set_view(struct renderer_canvas *canvas, struct xform view); /* Pushes array of vertices based on `vertices_count` & `indices_count`. * Sets `vertices_out` and `indices_out` to start of the pushed arrays, to be filled out by the caller. * Returns the index of the first vertex. Each inserted index should be incremented by this. * * NOTE: This should be preceded by an `ensure_cmd` call to ensure that the correct vertex types * are being pushed. */ u32 renderer_canvas_push_vertices(struct renderer_canvas *canvas, u8 **vertices_out, vidx **indices_out, u32 vertices_count, u32 indices_count); /* Checks the currently active draw command. Ensures a new command is created * if it doesn't match the expected parameters (otherwise the existing command * can be re-used for batching). */ void renderer_canvas_ensure_cmd(struct renderer_canvas *canvas, struct renderer_cmd_parameters *params); void renderer_canvas_send_to_gpu(struct renderer_canvas *canvas); void renderer_canvas_present(struct renderer_canvas **canvases, u32 canvases_count, struct v2 screen_size, struct rect viewport, i32 vsync, struct sprite_scope *sprite_scope); /* ========================== * * Texture * ========================== */ INLINE struct renderer_handle renderer_handle_nil(void) { return (struct renderer_handle) { 0 }; } struct renderer_handle renderer_texture_alloc(struct image_rgba data); void renderer_texture_release(struct renderer_handle handle); b32 renderer_texture_is_nil(struct renderer_handle handle); #endif