#include "app.hpp" #include App::App() { std::cout << "Initializing App..." << std::endl; std::cout << "Loading shader..." << std::endl; std::cout << "Loading sector defs..." << std::endl; // Door frame portal def assets::PortalDef& portal100x200 = assets::PortalDef::portal_defs["100x200"]; portal100x200.size = glm::vec2(1.0f, 2.0f); // 1m x 2m portal portal100x200.half_frame_thickness = 0.1f; // 10cm offset towards the second sector auto room001 = assets::SectorDef::LoadFromFile("data/room_001"); auto room002 = assets::SectorDef::LoadFromFile("data/room_002"); auto room003 = assets::SectorDef::LoadFromFile("data/room_003"); auto room004 = assets::SectorDef::LoadFromFile("data/room_004"); // blue/red size_t s1i = world_.AddSector(room001); game::Sector& s1 = world_.GetSector(s1i); s1.AddLight(glm::vec3(0.0f, 2.0f, 1.8f), glm::vec3(0.0f, 1.0f, 1.0f), 5.0f); s1.AddLight(glm::vec3(1.0f, 3.0f, 1.8f), glm::vec3(1.0f, 0.0f, 0.0f), 5.0f); // green/white size_t s2i = world_.AddSector(room001); game::Sector& s2 = world_.GetSector(s2i); s2.AddLight(glm::vec3(0.0f, 2.0f, 1.8f), glm::vec3(1.0f, 1.0f, 0.9f), 6.0f); s2.AddLight(glm::vec3(2.0f, -0.0f, 1.0f), glm::vec3(0.0f, 1.0f, 0.0f), 3.0f); // scaling hallway size_t s3i = world_.AddSector(room003); game::Sector& s3 = world_.GetSector(s3i); s3.AddLight(glm::vec3(1.0f, 0.0f, 1.8f), glm::vec3(1.0f, 0.0f, 0.0f), 3.0f); // purple size_t s4i = world_.AddSector(room001); game::Sector& s4 = world_.GetSector(s4i); s4.AddLight(glm::vec3(0.0f, 0.0f, 1.8f), glm::vec3(1.0f, 0.2f, 1.0f), 6.0f); // bend hallway size_t s5i = world_.AddSector(room004); game::Sector& s5 = world_.GetSector(s5i); s5.AddLight(glm::vec3(0.0f, 0.0f, 3.5f), glm::vec3(1.0f, 0.5f, 0.5f), 3.0f); s5.AddLight(glm::vec3(3.5f, 0.0f, -0.5f), glm::vec3(1.0f, 1.5f, 0.0f), 5.0f); //world_.LinkPortals(s1i, "EDoor", s1i, "EDoor", 0); // blue/red to green/white world_.LinkPortals(s1i, "NDoor", s2i, "WDoor", 0); // green/white to itself world_.LinkPortals(s2i, "NDoor", s2i, "SDoor", 0); // green/white to itself rotated world_.LinkPortals(s2i, "EDoor", s2i, "EDoor", game::LINK_ROTATE180); // scaling hallway world_.LinkPortals(s1i, "EDoor", s3i, "BigDoor", 0); world_.LinkPortals(s1i, "WDoor", s3i, "SmallDoor", 0); // start to purple world_.LinkPortals(s1i, "SDoor", s4i, "NDoor", 0); // bend hallway to purple world_.LinkPortals(s4i, "EDoor", s5i, "Door1", 0); world_.LinkPortals(s4i, "SDoor", s5i, "Door2", 0); world_.Bake(); auto skmesh = assets::Mesh::LoadFromFile("data/hands.mesh", false); player_ = world_.Spawn(s1i, glm::vec3(0.0f, 0.0f, 1.0f)); } void App::Frame() { float delta_time = time_ - prev_time_; prev_time_ = time_; if (delta_time < 0.0f) { delta_time = 0.0f; // Prevent negative delta time } else if (delta_time > 0.1f) { delta_time = 0.1f; // Cap delta time to avoid large jumps } game::PlayerInputFlags new_input = input_ & ~prev_input_; prev_input_ = input_; if (new_input & game::PI_DEBUG1) { renderer_.show_minimap = !renderer_.show_minimap; } float aspect = static_cast(viewport_size_.x) / static_cast(viewport_size_.y); renderer_.Begin(viewport_size_.x, viewport_size_.y); player_->SetInput(input_); world_.Update(delta_time); //const auto& position = player_->GetOccurrence().GetPosition(); size_t sector_idx; glm::vec3 position, forward, up; player_->GetPOV(sector_idx, position, forward, up); renderer_.DrawWorld(world_, sector_idx, player_, position, forward, up, aspect, 60.0f); } void App::MouseMove(const glm::vec2& delta) { float sensitivity = 0.002f; // Sensitivity factor for mouse movement //angles_.x -= delta.x * sensitivity; // Yaw //angles_.y -= delta.y * sensitivity; // Pitch //// Clamp pitch to avoid gimbal lock //if (angles_.y > glm::radians(89.0f)) { // angles_.y = glm::radians(89.0f); //} else if (angles_.y < glm::radians(-89.0f)) { // angles_.y = glm::radians(-89.0f); //} float delta_yaw = delta.x * sensitivity; float delta_pitch = -delta.y * sensitivity; player_->Rotate(delta_yaw, delta_pitch); } App::~App() { }