Program Listing for File Renderer.cpp

Return to documentation for file (Src/GraphicsEngineOpenGL/renderer/Renderer.cpp)

#include "renderer/Renderer.hpp"

#include <gsl/gsl>

Renderer::Renderer(GLuint window_width, GLuint window_height)
  :

    window_width(window_width), window_height(window_height),
    gbuffer(std::make_shared<GBuffer>(window_width, window_height)), shader_includes(),
    omni_shadow_map_pass(std::make_shared<OmniShadowMapPass>()),
    directional_shadow_map_pass(std::make_shared<DirectionalShadowMapPass>()),
    geometry_pass(std::make_shared<GeometryPass>()), lighting_pass(std::make_shared<LightingPass>())

{
    render_passes.push_back(omni_shadow_map_pass);
    render_passes.push_back(directional_shadow_map_pass);
    render_passes.push_back(geometry_pass);
    render_passes.push_back(lighting_pass);

    gbuffer->create();
}

void Renderer::drawFrame(std::shared_ptr<Camera> main_camera,
  std::shared_ptr<Scene> scene,
  glm::mat4 projection_matrix,
  GLfloat delta_time)
{
    directional_shadow_map_pass->execute(projection_matrix, main_camera, window_width, window_height, scene);

    // omni shadow map passes for our point lights
    std::vector<std::shared_ptr<PointLight>> p_lights = scene->get_point_lights();
    for (size_t p_light_count = 0; p_light_count < scene->get_point_light_count(); p_light_count++) {
        omni_shadow_map_pass->execute(p_lights[p_light_count], scene);
    }

    // we will now start the geometry pass
    geometry_pass->execute(
      projection_matrix, main_camera, window_width, window_height, gbuffer->get_id(), delta_time, scene);

    // after geometry pass we can now do the lighting
    lighting_pass->execute(projection_matrix, main_camera, scene, gbuffer, delta_time);
}

void Renderer::update_window_params(GLuint window_width, GLuint window_height)
{
    this->window_width = window_width;
    this->window_height = window_height;
    gbuffer->update_window_params(window_width, window_height);
    gbuffer->create();
}

void Renderer::reload_shader_programs()
{
    // also reload all shader include files
    shader_includes = ShaderIncludes();

    for (std::shared_ptr<RenderPass> render_pass : render_passes) { render_pass->create_shader_program(); }
}

Renderer::~Renderer() {}