hachem.wtf
aboutsummaryrefslogtreecommitdiff
path: root/src/engine
diff options
context:
space:
mode:
Diffstat (limited to 'src/engine')
-rw-r--r--src/engine/engine.cpp44
-rw-r--r--src/engine/engine.h5
2 files changed, 33 insertions, 16 deletions
diff --git a/src/engine/engine.cpp b/src/engine/engine.cpp
index 87eda62..496dd56 100644
--- a/src/engine/engine.cpp
+++ b/src/engine/engine.cpp
@@ -48,7 +48,7 @@ namespace Donut
}
m_camera_ubo = UniformBuffer::create(128, 1);
- m_disk_ubo = UniformBuffer::create(sizeof(float) * 5, 2);
+ m_disk_ubo = UniformBuffer::create(sizeof(float) * 6, 2);
uint32_t obj_ubo_size = sizeof(int) + 3 * sizeof(float)
+ 16 * (sizeof(glm::vec4) + sizeof(glm::vec4))
@@ -214,16 +214,25 @@ namespace Donut
int _pad4;
} data;
- glm::vec3 fwd = glm::normalize(cam.get_orbital_target() - cam.get_orbital_position());
- glm::vec3 up = glm::vec3(0, 1, 0);
- glm::vec3 right = glm::normalize(glm::cross(fwd, up));
- up = glm::cross(right, fwd);
+ glm::vec3 pos, fwd;
+ if (cam.get_camera_mode() == CameraMode::FPS)
+ {
+ pos = cam.get_position();
+ fwd = cam.get_forward_direction();
+ }
+ else
+ {
+ pos = cam.get_orbital_position();
+ fwd = glm::normalize(cam.get_orbital_target() - pos);
+ }
+ glm::vec3 right = glm::normalize(glm::cross(fwd, glm::vec3(0, 1, 0)));
+ glm::vec3 up = glm::cross(right, fwd);
- data.pos = cam.get_orbital_position();
+ data.pos = pos;
data.right = right;
data.up = up;
data.forward = fwd;
- data.tan_half_fov = static_cast<float>(tan(glm::radians(60.0f * 0.5f)));
+ data.tan_half_fov = static_cast<float>(tan(glm::radians(m_bh.fov_degrees * 0.5f)));
data.aspect = static_cast<float>(get_compute_width()) / static_cast<float>(m_compute_height);
data.moving = cam.is_dragging() || cam.is_panning();
@@ -258,12 +267,15 @@ namespace Donut
auto Engine::upload_disk_ubo() -> void
{
- float r1 = static_cast<float>(m_sag_a.m_rs * 2.2);
- float r2 = static_cast<float>(m_sag_a.m_rs * 5.2);
- float num = 2.0f;
- float thickness = static_cast<float>(m_sag_a.m_rs * m_disk_thickness);
- float disk_data[5] = { r1, r2, num, thickness, m_disk_density };
-
+ const float rs = 1.269e10f;
+ float disk_data[6] = {
+ std::max(m_bh.disk_inner_rs, 3.0f) * rs,
+ std::max(m_bh.disk_outer_rs, m_bh.disk_inner_rs + 0.5f) * rs,
+ std::max(m_bh.turbulence, 0.0f),
+ rs * 0.1f,
+ std::max(m_bh.brightness, 0.0f),
+ std::max(m_bh.temperature, 1000.0f),
+ };
m_disk_ubo->set_data(disk_data, sizeof(disk_data));
m_disk_ubo->bind(2);
}
@@ -278,13 +290,13 @@ namespace Donut
float time;
} data;
- data.max_steps_moving = m_max_steps_moving;
- data.max_steps_static = m_max_steps_static;
+ data.max_steps_moving = m_bh.quality_steps;
+ data.max_steps_static = m_bh.quality_steps;
data.early_exit_distance = m_early_exit_distance;
data.time = static_cast<float>(glfwGetTime()) * m_rotation_speed;
#ifdef __APPLE__
- data.max_steps_moving = std::min(data.max_steps_moving, 4000);
+ data.max_steps_moving = std::min(data.max_steps_moving, 6000);
data.max_steps_static = std::min(data.max_steps_static, 6000);
#endif
diff --git a/src/engine/engine.h b/src/engine/engine.h
index 0451d40..7bab179 100644
--- a/src/engine/engine.h
+++ b/src/engine/engine.h
@@ -12,6 +12,7 @@
#include "object.h"
#include "rendering/renderer.h"
+#include "rendering/renderer_backend.h"
#include "rendering/shader.h"
#include "rendering/vertex_array.h"
#include "rendering/texture.h"
@@ -128,6 +129,8 @@ namespace Donut
auto set_hdri_environment(Ref<CubemapTexture> hdri) -> void { m_hdri_environment = hdri; }
auto get_hdri_environment() const -> Ref<CubemapTexture> { return m_hdri_environment; }
+
+ auto black_hole_params() -> BlackHoleParams& { return m_bh; }
private:
auto create_compute_program(const char* path) -> Ref<Shader>;
std::pair<Ref<VertexArray>, Ref<Texture2D>> quad_vao();
@@ -166,6 +169,8 @@ namespace Donut
int m_max_steps_static = 30000;
float m_early_exit_distance = 5.0e11f;
+ BlackHoleParams m_bh;
+
float m_disk_thickness = 0.1f;
float m_disk_density = 0.1f;
float m_rotation_speed = 1.0f;