#ifndef renderer_hpp #define renderer_hpp #include "camera.hpp" #include "hashmap.hpp" #include "lighting.hpp" #include "video.hpp" enum { FORWARD, SHADOW_MAP_START, SHADOW_MAP_END = SHADOW_MAP_START + Lighting::max_shadows, drawlist_count = SHADOW_MAP_END }; struct Model_Instance; struct Renderer; struct Drawlist { Model_Instance** models; int count; int cap; Camera_Id camera; Staged_Buffer vp; void render( const Renderer& r, Device* dev, Arena* a, const Lighting* l, Render_Pass& pass, void (*overrider)(Pipeline_Builder&) ); }; struct Renderer { static constexpr int max_cameras = 16; Hash_Map cameras; Drawlist drawlists[drawlist_count]; Staged_Buffer globals; int camera_count; int frame; Sampler_Id clamped_linear; Texture_Id env_cubemap; void init(Arena* arena, Device* d); void destroy(Device* d); void set_camera(Camera_Id cam, int drawlist); void render( Device* dev, Arena* a, Texture_Id hdr_target, const Lighting* l ); void add_model(int drawlist, Model_Instance* m); void rem_model(int drawlist, Model_Instance* m); void default_model(Model_Instance* m); Camera_Id create_camera(); Camera& get_camera(Camera_Id cam); const Camera& get_camera(Camera_Id cam) const; void destroy_camera(Camera_Id cam); void setcam(int did, Camera_Id cam); void update_globals(const Lighting* l, Device* d, Context& ctx); }; #endif