#ifndef FAN_RENDERER_HPP_ #define FAN_RENDERER_HPP_ #include "scene.hpp" #include "camera.hpp" #include "uniformbuffer.hpp" namespace Fan { class Renderer { public: // init() needs a current GL context and also initializes the ResourceCache. // shutdown() must run before the window (and its context) is destroyed static bool init(); static void shutdown(); static void set_viewport(int x, int y, int width, int height); static void set_clear_color(const glm::vec4& color); static void set_wireframe(bool enabled); // Global, stays on until disabled static void clear(); // Draws into the currently bound framebuffer without clearing it. // screen_width and screen_height only set the camera aspect ratio static void draw_scene(const Scene& scene, const Camera& camera, int screen_width, int screen_height); // debug_shader needs u_model, u_view_projection and u_color. default_mesh is // drawn for entities without a mesh and for lights. Disables wireframe when done static void draw_debug_wireframes(const Scene& scene, const Camera& camera, int screen_width, int screen_height, const Rc& debug_shader, const Rc& default_mesh); private: static Rc s_camera_ubo; static Rc s_light_ubo; static void update_global_data(const Scene& scene, const Camera& camera, int screen_width, int screen_height); struct CameraData { glm::mat4 view; glm::mat4 projection; glm::vec4 position; // w unused, std140 pads vec3 to 16 bytes anyway }; // Maps to Fan::DirectionalLight struct DirectionalLightData { glm::vec4 direction; glm::vec4 ambient; glm::vec4 diffuse; glm::vec4 specular; }; // Maps to Fan::PointLight struct PointLightData { glm::vec4 position; glm::vec4 ambient; glm::vec4 diffuse; glm::vec4 specular; glm::vec4 attenuation; // x = constant, y = linear, z = quadratic }; // Maps to Fan::SpotLight struct SpotLightData { glm::vec4 position; glm::vec4 direction; glm::vec4 ambient; glm::vec4 diffuse; glm::vec4 specular; glm::vec4 attenuation; // x = constant, y = linear, z = quadratic glm::vec4 cut_offs; // x = cut_off (cos), y = outer_cut_off (cos) }; struct LightEnvironmentData { DirectionalLightData dir_light; int active_point_lights; int active_spot_lights; int _padding[2]; // Pad the 8 bytes of integers to a 16-byte boundary PointLightData point_lights[MAX_POINT_LIGHTS]; SpotLightData spot_lights[MAX_SPOT_LIGHTS]; }; }; } // namespace Fan #endif // FAN_RENDERER_HPP_