hachem.wtf
aboutsummaryrefslogtreecommitdiff
path: root/src/engine/engine.h
diff options
context:
space:
mode:
authorhachem <im@hachem.wtf>2025-08-14 18:21:00 +0200
committerhachem <im@hachem.wtf>2025-08-14 18:21:00 +0200
commit3d8d3259e1cf5a7d88e5d1e530cc8c9bf9140734 (patch)
tree450b674caaf60327104aa76375c045f1f8f77076 /src/engine/engine.h
parent79045760ce6100b4c87846d793f9dceeba4c9c36 (diff)
feat: I am going to throw my computer out a window
Diffstat (limited to 'src/engine/engine.h')
-rw-r--r--src/engine/engine.h118
1 files changed, 118 insertions, 0 deletions
diff --git a/src/engine/engine.h b/src/engine/engine.h
new file mode 100644
index 0000000..6f90efb
--- /dev/null
+++ b/src/engine/engine.h
@@ -0,0 +1,118 @@
+#pragma once
+
+#include <vector>
+#include <iostream>
+#include <GLFW/glfw3.h>
+#include <glm/glm.hpp>
+#include <glm/gtc/matrix_transform.hpp>
+#include <glm/gtc/type_ptr.hpp>
+#include <fstream>
+#include <sstream>
+#include <chrono>
+#include <cmath>
+
+#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<ObjectData>& 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<ObjectData>& 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<ObjectData>& get_objects() const { return m_objects; }
+ std::vector<ObjectData>& 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<Shader> m_grid_shader;
+ Ref<Shader> m_quad_shader;
+ Ref<Shader> m_compute_shader;
+ Ref<Texture2D> m_texture;
+ Ref<VertexArray> m_quad_vao;
+ Ref<VertexArray> m_grid_vao;
+ Ref<UniformBuffer> m_camera_ubo;
+ Ref<UniformBuffer> m_disk_ubo;
+ Ref<UniformBuffer> 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<ObjectData> m_objects;
+ BlackHole m_sag_a;
+ Camera m_camera;
+ bool m_gravity = false;
+ };
+}