#include "scene.h" #include #include #include #include #include namespace Donut { Scene::Scene() { // black-hole camera: large-scale orbital viewer outside the disk. sim_camera.set_camera_mode(CameraMode::Orbital); sim_camera.set_orbital_target(glm::vec3(0.0f)); sim_camera.set_orbital_radius(4e11); // ~31 r_s: outside the 12 r_s disk sim_camera.set_orbital_limits(2.2e11, 1.5e12); sim_camera.set_orbital_speed(0.01f); sim_camera.set_zoom_speed(3e10); sim_camera.set_azimuth(0.0f); sim_camera.set_elevation(1.25f); // scene camera: normal-scale orbital world-builder viewer. scene_camera.set_camera_mode(CameraMode::Orbital); scene_camera.set_orbital_target(glm::vec3(0.0f)); scene_camera.set_orbital_radius(30.0); // frame the hole + orbiting objects (in r_s) scene_camera.set_orbital_limits(3.0, 400.0); scene_camera.set_orbital_speed(0.01f); scene_camera.set_zoom_speed(2.0); scene_camera.set_azimuth(0.0f); scene_camera.set_elevation((float)std::numbers::pi / 3.0f); scene_camera.update_orbital(); } auto Scene::reset_sim_camera() -> void { sim_camera.set_camera_mode(CameraMode::Orbital); sim_camera.set_orbital_radius(4e11); sim_camera.set_azimuth(0.0f); sim_camera.set_elevation(1.25f); } auto Scene::set_free_fly(bool enabled) -> void { const bool is_fps = sim_camera.get_camera_mode() == CameraMode::FPS; if (enabled == is_fps) return; if (enabled) { // seed the fly pose from the current orbital framing so the view is continuous. glm::vec3 pos = sim_camera.get_orbital_position(); glm::vec3 fwd = glm::normalize(sim_camera.get_orbital_target() - pos); float pitch = glm::degrees(asin(glm::clamp(fwd.y, -1.0f, 1.0f))); float yaw = glm::degrees(atan2(fwd.z, fwd.x)); sim_camera.set_camera_mode(CameraMode::FPS); sim_camera.set_movement_speed(2.0e10f); sim_camera.set_mouse_sensitivity(0.15f); sim_camera.set_position(pos); sim_camera.set_rotation(glm::vec3(pitch, yaw, 0.0f)); } else { sim_camera.set_camera_mode(CameraMode::Orbital); // orbital state was left intact } } }