Program Listing for File Scene.cpp

Return to documentation for file (Src/GraphicsEngineOpenGL/scene/Scene.cpp)

#include "scene/Scene.hpp"

#include "renderer/OpenGLRendererConfig.hpp"
#include <filesystem>
#include <sstream>

Scene::Scene()
  :

    main_camera(), sun(std::make_shared<DirectionalLight>(static_cast<uint32_t>(4096),
                     static_cast<uint32_t>(4096),
                     1.f,
                     1.f,
                     1.f,
                     1.f,
                     -0.1f,
                     -0.8f,
                     -0.1f,
                     main_camera->get_near_plane(),
                     main_camera->get_far_plane(),
                     NUM_CASCADES)),
    clouds(std::make_shared<Clouds>()), main_window(),
    view_frustum_culling(std::make_shared<ViewFrustumCulling>(ViewFrustumCulling{})), progress(0.f),
    loaded_scene(false), context_setup(false)
{}

Scene::Scene(std::shared_ptr<Camera> main_camera, std::shared_ptr<Window> main_window)
  :

    main_camera(main_camera), sun(std::make_shared<DirectionalLight>(static_cast<uint32_t>(4096),
                                static_cast<uint32_t>(4096),
                                1.f,
                                1.f,
                                1.f,
                                1.f,
                                -0.1f,
                                -0.8f,
                                -0.1f,
                                main_camera->get_near_plane(),
                                main_camera->get_far_plane(),
                                NUM_CASCADES)),
    clouds(std::make_shared<Clouds>()), main_window(main_window),
    view_frustum_culling(std::make_shared<ViewFrustumCulling>(ViewFrustumCulling{})), progress(0.f),
    loaded_scene(false), context_setup(false)

{
    point_lights.reserve(MAX_POINT_LIGHTS);
    point_lights.push_back(std::make_shared<PointLight>(static_cast<uint32_t>(1024),
      static_cast<uint32_t>(1024),
      0.01f,
      100.f,
      0.0f,
      1.0f,
      0.0f,
      1.0f,
      0.0f,
      0.0f,
      0.0f,
      0.1f,
      0.1f,
      0.1f));

    point_lights[0]->set_position(glm::vec3(0.0, -24.f, -24.0));
}

GLuint Scene::get_point_light_count() const { return static_cast<uint32_t>(point_lights.size()); }

std::shared_ptr<DirectionalLight> Scene::get_sun() { return sun; }

std::vector<std::shared_ptr<PointLight>> Scene::get_point_lights() const { return point_lights; }

void Scene::load_models()
{
    glm::vec3 sponza_offset = glm::vec3(0.f, 0.0f, 0.0f);
    GLfloat sponza_scale = 10.f;
    Rotation sponza_rot;
    sponza_rot.degrees = 0.0f;
    sponza_rot.axis = glm::vec3(0.0f, 1.0f, 0.0f);

    glm::vec3 clouds_offset = glm::vec3(-3.f, 20.0f, -3.0f);
    glm::vec3 clouds_scale = glm::vec3(1.f, 1.f, 1.f);
    clouds->set_scale(clouds_scale);
    clouds->set_translation(clouds_offset);

    std::stringstream modelFile;
    std::filesystem::path cwd = std::filesystem::current_path();
    modelFile << cwd.string();
    modelFile << RELATIVE_RESOURCE_PATH << "Models/dinosaurs.obj";
    /*"../Models/Pillum/PilumPainting_Export.obj",*/
    /*"../Models/crytek-sponza/sponza_triag.obj",*/

    std::shared_ptr<GameObject> sponza =
      std::make_shared<GameObject>(modelFile.str(), sponza_offset, sponza_scale, sponza_rot);
    progress += 1.f;

    game_objects.push_back(sponza);

    mx_isLoaded.lock();
    loaded_scene = true;
    mx_isLoaded.unlock();
}

std::vector<ObjMaterial> Scene::get_materials() { return game_objects[0]->get_model()->get_materials(); }

bool Scene::is_loaded()
{
    std::lock_guard<std::mutex> guard{ mx_isLoaded };
    return loaded_scene;
}

GLfloat Scene::get_progress()
{
    std::lock_guard<std::mutex> guard{ mx_progress };
    return progress;
}

void Scene::setup_game_object_context()
{
    game_objects[0]->get_model()->create_render_context();
    context_setup = true;
}

void Scene::bind_textures_and_buffer() { game_objects[0]->get_model()->bind_ressources(); }

void Scene::unbind_textures_and_buffer() { game_objects[0]->get_model()->unbind_resources(); }

int Scene::get_texture_count(int index) { return game_objects[0]->get_model()->get_texture_count(); }

void Scene::set_context_setup(bool context_setup) { this->context_setup = context_setup; }

bool Scene::get_context_setup() const { return context_setup; }

void Scene::add_game_object(const std::string &model_path, glm::vec3 translation, GLfloat scale, Rotation rot)
{
    game_objects.push_back(std::make_shared<GameObject>(GameObject()));
    game_objects.back()->init(model_path, translation, scale, rot);
}

std::shared_ptr<Clouds> Scene::get_clouds() { return clouds; }

std::vector<std::shared_ptr<GameObject>> Scene::get_game_objects() const { return game_objects; }

bool Scene::object_is_visible(std::shared_ptr<GameObject> game_object)
{
    return view_frustum_culling->is_inside(
      static_cast<GLfloat>(main_window->get_buffer_width()) / static_cast<GLfloat>(main_window->get_buffer_height()),
      main_camera,
      game_object->get_aabb(),
      game_object->get_world_trafo());
}

Scene::~Scene() {}