hachem.wtf
aboutsummaryrefslogtreecommitdiff
path: root/src/engine/engine.h
blob: 0d0fb1b47dacc9be865605d81ec9d7adb476422c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
#pragma once

#include <vector>
#include <iostream>
#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/vertex_array.h"
#include "rendering/texture.h"
#include "rendering/uniform_buffer.h"
#include "rendering/texture_manager.h"

#include <GLFW/glfw3.h>
#include <glm/glm.hpp>
#include <glm/gtc/matrix_transform.hpp>
#include <glm/gtc/type_ptr.hpp>

#define _USE_MATH_DEFINES
#ifndef M_PI
#define M_PI 3.14159265358979323846
#endif

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 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 upload_simulation_ubo();
        void render_scene();
        void update_physics(float delta_time);
        void update_window_dimensions();

        int get_width()  const { return m_width;  }
        int get_height() const { return m_height; }

        std::vector<ObjectData>& get_objects() { return m_objects; }
        BlackHole&               get_sag_a()    { return m_sag_a;    }
        Camera&                  get_camera()  { return m_camera;  }
        bool&                    get_gravity() { return m_gravity; }

        void  update_performance(float delta_time);
        void  set_target_fps(int fps)        { m_target_fps = fps;                             }
        int   get_target_fps()         const { return m_target_fps;                            }
        float get_current_fps()        const { return m_current_fps;                           }
        void  set_compute_height(int height) { m_compute_height = height;                      }
        int   get_compute_height()     const { return m_compute_height;                        }
        int   get_compute_width()      const { return (m_width * m_compute_height) / m_height; }
        void  update_compute_dimensions();
        
        int   get_max_steps_moving()    const { return m_max_steps_moving; }
        int   get_max_steps_static()    const { return m_max_steps_static; }
        float get_early_exit_distance() const { return m_early_exit_distance; }
        void  set_max_steps_moving(int steps) { m_max_steps_moving = steps; }
        void  set_max_steps_static(int steps) { m_max_steps_static = steps; }
        void  set_early_exit_distance(float distance) { m_early_exit_distance = distance; }
    private:
        Ref<Shader> create_compute_program(const char* path);
        std::pair<Ref<VertexArray>, Ref<Texture2D>> quad_vao();
    private:
        Ref<VertexArray>   m_quad_vao;
        Ref<Texture2D>     m_texture;
        Ref<Shader>        m_shader_program;
        Ref<Shader>        m_compute_program;
        Ref<UniformBuffer> m_camera_ubo;
        Ref<UniformBuffer> m_disk_ubo;
        Ref<UniformBuffer> m_objects_ubo;
        Ref<UniformBuffer> m_simulation_ubo;

        int   m_width;
        int   m_height;
        float m_width_f = 100*10e10f;
        float m_height_f = 75*10e10f;

        int   m_target_fps     = 60;
        float m_current_fps    = 60.0f;
        float m_last_frame_time = 0.0f;
        int   m_compute_height = 150;

        std::vector<ObjectData> m_objects;
        BlackHole               m_sag_a;
        Camera                  m_camera;
        bool                    m_gravity = false;
        
        int   m_max_steps_moving = 60000;
        int   m_max_steps_static = 30000;
        float m_early_exit_distance = 5e11f;
    };
};