#pragma once #include #include #include #include #include #include #include #include #include #include #include "core/application.h" #include "core/camera.h" #include "rendering/renderer.h" #include "rendering/shader.h" #include "rendering/texture.h" #include "rendering/vertex_array.h" #include "rendering/uniform_buffer.h" namespace Donut { const double c = 299792458.0; const double G = 6.67430e-11; struct BlackHole { glm::vec3 m_position; double m_mass; double m_radius; double m_rs; BlackHole(glm::vec3 pos, float mass) : m_position(pos), m_mass(mass) { m_rs = 2.0 * G * m_mass / (c * c); } bool intercept(float px, float py, float pz) const { double dx = double(px) - double(m_position.x); double dy = double(py) - double(m_position.y); double dz = double(pz) - double(m_position.z); double dist2 = dx * dx + dy * dy + dz * dz; return dist2 < m_rs * m_rs; } }; struct ObjectData { glm::vec4 m_pos_radius; glm::vec4 m_color; float m_mass; glm::vec3 m_velocity = glm::vec3(0.0f, 0.0f, 0.0f); }; class Engine { public: Engine(); ~Engine() = default; void generate_grid(const std::vector& objects); void draw_grid(const glm::mat4& view_proj); void draw_full_screen_quad(); void dispatch_compute(const Camera& cam); void upload_camera_ubo(const Camera& cam); void upload_objects_ubo(const std::vector& objs); void upload_disk_ubo(); void render_scene(); void update_physics(float delta_time); void update_window_dimensions(); Camera& get_camera() { return m_camera; } const Camera& get_camera() const { return m_camera; } const std::vector& get_objects() const { return m_objects; } std::vector& get_objects() { return m_objects; } bool get_gravity() const { return m_gravity; } void set_gravity(bool gravity) { m_gravity = gravity; } int get_width() const { return m_width; } int get_height() const { return m_height; } int get_compute_width() const { return m_compute_width; } int get_compute_height() const { return m_compute_height; } private: std::string create_basic_vertex_shader(); std::string create_basic_fragment_shader(); std::string load_compute_shader(const std::string& path); private: Ref m_grid_shader; Ref m_quad_shader; Ref m_compute_shader; Ref m_texture; Ref m_quad_vao; Ref m_grid_vao; Ref m_camera_ubo; Ref m_disk_ubo; Ref m_objects_ubo; int m_grid_index_count = 0; int m_width; int m_height; int m_compute_width; int m_compute_height; float m_width_scale = 100000000000.0f; float m_height_scale = 75000000000.0f; std::vector m_objects; BlackHole m_sag_a; Camera m_camera; bool m_gravity = false; }; }