142 lines
4.1 KiB
C++
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()
|
|
{
|
|
|
|
}
|