PortalGame/src/app.cpp
2025-09-09 01:01:03 +02:00

142 lines
4.1 KiB
C++

#include "app.hpp"
#include <iostream>
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<game::Player>(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<float>(viewport_size_.x) / static_cast<float>(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()
{
}