diff options
Diffstat (limited to 'src/engine')
| -rw-r--r-- | src/engine/engine.cpp | 38 | ||||
| -rw-r--r-- | src/engine/engine.h | 94 | ||||
| -rw-r--r-- | src/engine/object.h | 55 | ||||
| -rw-r--r-- | src/engine/scene.h | 47 |
4 files changed, 119 insertions, 115 deletions
diff --git a/src/engine/engine.cpp b/src/engine/engine.cpp index d6e2723..87eda62 100644 --- a/src/engine/engine.cpp +++ b/src/engine/engine.cpp @@ -79,12 +79,12 @@ namespace Donut glGenFramebuffers(1, &m_geodesic_fbo); } - void Engine::update_window_dimensions() + auto Engine::update_window_dimensions() -> void { update_compute_dimensions(); } - void Engine::set_window_dimensions(int width, int height) + auto Engine::set_window_dimensions(int width, int height) -> void { int old_width = m_width; int old_height = m_height; @@ -99,18 +99,18 @@ namespace Donut update_compute_dimensions(); } - void Engine::update_performance(float delta_time) + auto Engine::update_performance(float delta_time) -> void { if (delta_time > 0.0f) m_current_fps = 1.0f / delta_time; } - void Engine::update_compute_dimensions() + auto Engine::update_compute_dimensions() -> void { m_texture = Texture2D::create(get_compute_width(), m_compute_height); } - void Engine::draw_full_screen_quad() + auto Engine::draw_full_screen_quad() -> void { RenderCommand::set_viewport(0, 0, m_width, m_height); @@ -125,7 +125,7 @@ namespace Donut RenderCommand::enable_depth_test(); } - void Engine::draw_blur_pass() + auto Engine::draw_blur_pass() -> void { RenderCommand::set_viewport(0, 0, m_width, m_height); @@ -143,7 +143,7 @@ namespace Donut RenderCommand::enable_depth_test(); } - void Engine::draw_geodesic_pass(int cw, int ch) + auto Engine::draw_geodesic_pass(int cw, int ch) -> void { m_quad_vao->bind(); RenderCommand::disable_depth_test(); @@ -170,7 +170,7 @@ namespace Donut RenderCommand::enable_depth_test(); } - void Engine::dispatch_compute(const Camera& cam) + auto Engine::dispatch_compute(const Camera& cam) -> void { auto& hdri_manager = HDRIManager::get(); m_hdri_environment = hdri_manager.get_current_hdri(); @@ -200,7 +200,7 @@ namespace Donut glBindFramebuffer(GL_FRAMEBUFFER, 0); } - void Engine::upload_camera_ubo(const Camera& cam) + auto Engine::upload_camera_ubo(const Camera& cam) -> void { struct UBOData { @@ -231,7 +231,7 @@ namespace Donut m_camera_ubo->bind(1); } - void Engine::upload_objects_ubo(const std::vector<ObjectData>& objs) + auto Engine::upload_objects_ubo(const std::vector<ObjectData>& objs) -> void { struct UBOData { @@ -256,7 +256,7 @@ namespace Donut m_objects_ubo->bind(3); } - void Engine::upload_disk_ubo() + 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); @@ -268,7 +268,7 @@ namespace Donut m_disk_ubo->bind(2); } - void Engine::upload_simulation_ubo() + auto Engine::upload_simulation_ubo() -> void { struct UBOData { @@ -292,7 +292,7 @@ namespace Donut m_simulation_ubo->bind(4); } - void Engine::update_physics(float delta_time) + auto Engine::update_physics(float delta_time) -> void { for (auto& obj : m_objects) { @@ -325,7 +325,7 @@ namespace Donut } } - void Engine::render_scene() + auto Engine::render_scene() -> void { RenderCommand::clear(); m_shader_program->bind(); @@ -334,7 +334,7 @@ namespace Donut RenderCommand::draw_arrays(6); } - Ref<Shader> Engine::create_compute_program(const char* path) + auto Engine::create_compute_program(const char* path) -> Ref<Shader> { std::ifstream in(path); if(!in.is_open()) @@ -348,7 +348,7 @@ namespace Donut return Ref<Shader>(Shader::create_compute("ComputeShader", src_str)); } - std::pair<Ref<VertexArray>, Ref<Texture2D>> Engine::quad_vao() + auto Engine::quad_vao() -> std::pair<Ref<VertexArray>, Ref<Texture2D>> { float quad_vertices[] = { @@ -373,7 +373,7 @@ namespace Donut return { vertex_array, texture }; } - void Engine::load_objects_from_scene(const std::vector<Donut::Object>& objects) + auto Engine::load_objects_from_scene(const std::vector<Donut::Object>& objects) -> void { m_objects.clear(); m_objects.push_back( @@ -410,7 +410,7 @@ namespace Donut print_object_info(); } - void Engine::print_object_info() const + auto Engine::print_object_info() const -> void { DONUT_INFO("=== Object Information ==="); DONUT_INFO("Total objects: {}", m_objects.size()); @@ -435,7 +435,7 @@ namespace Donut DONUT_INFO("========================"); } - void Engine::export_high_res_frame(const std::string& filename, int width, int height) + auto Engine::export_high_res_frame(const std::string& filename, int width, int height) -> void { DONUT_INFO("Exporting high-resolution frame: {}x{} to {}", width, height, filename); diff --git a/src/engine/engine.h b/src/engine/engine.h index 1c25466..0451d40 100644 --- a/src/engine/engine.h +++ b/src/engine/engine.h @@ -65,30 +65,30 @@ namespace Donut Engine(); ~Engine() = default; - void draw_full_screen_quad(); - void draw_blur_pass(); - 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(); - void set_window_dimensions(int width, int height); + auto draw_full_screen_quad() -> void; + auto draw_blur_pass() -> void; + auto dispatch_compute(const Camera& cam) -> void; + auto upload_camera_ubo(const Camera& cam) -> void; + auto upload_objects_ubo(const std::vector<ObjectData>& objs) -> void; + auto upload_disk_ubo() -> void; + auto upload_simulation_ubo() -> void; + auto render_scene() -> void; + auto update_physics(float delta_time) -> void; + auto update_window_dimensions() -> void; + auto set_window_dimensions(int width, int height) -> void; - int get_width() const { return m_width; } - int get_height() const { return m_height; } + auto get_width() const -> int { return m_width; } + auto get_height() const -> int { 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; } + auto get_objects() -> std::vector<ObjectData>& { return m_objects; } + auto get_sag_a() -> BlackHole& { return m_sag_a; } + auto get_camera() -> Camera& { return m_camera; } + auto get_gravity() -> bool& { 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; } + auto update_performance(float delta_time) -> void; + auto set_target_fps(int fps) -> void { m_target_fps = fps; } + auto get_target_fps() const -> int { return m_target_fps; } + auto get_current_fps() const -> float { return m_current_fps; } void set_compute_height(int height) { #ifdef __APPLE__ @@ -96,43 +96,43 @@ namespace Donut #endif 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(); + auto get_compute_height() const -> int { return m_compute_height; } + auto get_compute_width() const -> int { return (m_width * m_compute_height) / m_height; } + auto update_compute_dimensions() -> void; - 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; } + auto get_max_steps_moving() const -> int { return m_max_steps_moving; } + auto get_max_steps_static() const -> int { return m_max_steps_static; } + auto get_early_exit_distance() const -> float { return m_early_exit_distance; } + auto set_max_steps_moving(int steps) -> void { m_max_steps_moving = steps; } + auto set_max_steps_static(int steps) -> void { m_max_steps_static = steps; } + auto set_early_exit_distance(float distance) -> void { m_early_exit_distance = distance; } - float get_disk_thickness() const { return m_disk_thickness; } - void set_disk_thickness(float thickness) { m_disk_thickness = thickness; } + auto get_disk_thickness() const -> float { return m_disk_thickness; } + auto set_disk_thickness(float thickness) -> void { m_disk_thickness = thickness; } - float get_disk_density() const { return m_disk_density; } - void set_disk_density(float density) { m_disk_density = density; } + auto get_disk_density() const -> float { return m_disk_density; } + auto set_disk_density(float density) -> void { m_disk_density = density; } - float get_rotation_speed() const { return m_rotation_speed; } - void set_rotation_speed(float speed) { m_rotation_speed = speed; } + auto get_rotation_speed() const -> float { return m_rotation_speed; } + auto set_rotation_speed(float speed) -> void { m_rotation_speed = speed; } - float get_blur_strength() const { return m_blur_strength; } - void set_blur_strength(float strength) { m_blur_strength = strength; } + auto get_blur_strength() const -> float { return m_blur_strength; } + auto set_blur_strength(float strength) -> void { m_blur_strength = strength; } - float get_glow_intensity() const { return m_glow_intensity; } - void set_glow_intensity(float intensity) { m_glow_intensity = intensity; } + auto get_glow_intensity() const -> float { return m_glow_intensity; } + auto set_glow_intensity(float intensity) -> void { m_glow_intensity = intensity; } - void load_objects_from_scene(const std::vector<Donut::Object>& objects); - void export_high_res_frame(const std::string& filename, int width = 4096, int height = 3072); - void print_object_info() const; + auto load_objects_from_scene(const std::vector<Donut::Object>& objects) -> void; + auto export_high_res_frame(const std::string& filename, int width = 4096, int height = 3072) -> void; + auto print_object_info() const -> void; - void set_hdri_environment(Ref<CubemapTexture> hdri) { m_hdri_environment = hdri; } - Ref<CubemapTexture> get_hdri_environment() const { return m_hdri_environment; } + auto set_hdri_environment(Ref<CubemapTexture> hdri) -> void { m_hdri_environment = hdri; } + auto get_hdri_environment() const -> Ref<CubemapTexture> { return m_hdri_environment; } private: - Ref<Shader> create_compute_program(const char* path); + auto create_compute_program(const char* path) -> Ref<Shader>; std::pair<Ref<VertexArray>, Ref<Texture2D>> quad_vao(); - void draw_geodesic_pass(int cw, int ch); + auto draw_geodesic_pass(int cw, int ch) -> void; private: Ref<VertexArray> m_quad_vao; Ref<Texture2D> m_texture; diff --git a/src/engine/object.h b/src/engine/object.h index 790fe25..8101540 100644 --- a/src/engine/object.h +++ b/src/engine/object.h @@ -7,67 +7,70 @@ namespace Donut class Ray { public: + Ray(glm::vec3 o, glm::vec3 d) + : m_origin(o), + m_direction(glm::normalize(d)) { } + + public: glm::vec3 m_direction; glm::vec3 m_origin; - - Ray(glm::vec3 o, glm::vec3 d) - : m_origin(o), - m_direction(glm::normalize(d)) { } }; class Material { public: - glm::vec3 m_color; - float m_specular; - float m_emission; - Material() : m_color(1.0f, 1.0f, 1.0f), m_specular(0.5f), m_emission(0.0f) { } Material(glm::vec3 c, float s, float e) - : m_color(c), - m_specular(s), + : m_color(c), + m_specular(s), m_emission(e) { } + + public: + glm::vec3 m_color; + float m_specular; + float m_emission; }; class Object { public: - glm::vec3 m_centre; - float m_radius; - Material m_material; - Object() : m_centre(0.0f, 0.0f, 0.0f), m_radius(1.0f), m_material() { } - Object(glm::vec3 c, float r, Material m) - : m_centre(c), - m_radius(r), + Object(glm::vec3 c, float r, Material m) + : m_centre(c), + m_radius(r), m_material(m) { } - - bool intersect(Ray &ray, float &t) + + auto intersect(Ray& ray, float& t) -> bool { glm::vec3 oc = ray.m_origin - m_centre; - float a = glm::dot(ray.m_direction, ray.m_direction); + float a = glm::dot(ray.m_direction, ray.m_direction); float b = 2.0f * glm::dot(oc, ray.m_direction); float c = glm::dot(oc, oc) - m_radius * m_radius; float discriminant = static_cast<float>(b*b - 4*a*c); - if(discriminant < 0) + if (discriminant < 0) return false; - + float intercept = (-b - sqrt(discriminant)) / (2.0f*a); - if(intercept < 0) + if (intercept < 0) { intercept = (-b + sqrt(discriminant)) / (2.0f*a); - if(intercept<0) + if (intercept < 0) return false; } t = intercept; return true; } - - glm::vec3 get_normal(glm::vec3 &point) const + + auto get_normal(glm::vec3& point) const -> glm::vec3 { return glm::normalize(point - m_centre); } + + public: + glm::vec3 m_centre; + float m_radius; + Material m_material; }; }; diff --git a/src/engine/scene.h b/src/engine/scene.h index 2ac9cd8..4b41203 100644 --- a/src/engine/scene.h +++ b/src/engine/scene.h @@ -7,63 +7,64 @@ namespace Donut { - class Scene + class Scene { public: - std::vector<Object> objs; - glm::vec3 m_light_pos; - - Scene() + Scene() : m_light_pos(5.0f, 5.0f, 5.0f) { } - - glm::vec3 trace(Ray &ray) + + auto trace(Ray& ray) -> glm::vec3 { float closest = std::numeric_limits<float>::infinity(); const Object* hit_obj = nullptr; - - for(auto& obj : objs) + + for (auto& obj : objs) { float t; - if(obj.intersect(ray, t)) - if(t < closest) + if (obj.intersect(ray, t)) + if (t < closest) { closest = t; hit_obj = &obj; } } - - if(hit_obj) + + if (hit_obj) { glm::vec3 hit_point = ray.m_origin + ray.m_direction * closest; glm::vec3 normal = hit_obj->get_normal(hit_point); glm::vec3 light_dir = glm::normalize(m_light_pos - hit_point); - + float diff = std::max(glm::dot(normal, light_dir), 0.0f); - + Ray shadow_ray(hit_point + normal * 0.001f, light_dir); bool in_shadow = false; - - for(auto& obj : objs) + + for (auto& obj : objs) { float t; - if(obj.intersect(shadow_ray, t)) + if (obj.intersect(shadow_ray, t)) { in_shadow = true; break; } } - + glm::vec3 color = hit_obj->m_material.m_color; float ambient = 0.1f; - - if (in_shadow) + + if (in_shadow) return color * ambient; return color * (ambient + diff * 0.9f); } - - return glm::vec3(0.0f, 0.0f, 0.1f); + + return glm::vec3(0.0f, 0.0f, 0.1f); } + + public: + std::vector<Object> objs; + glm::vec3 m_light_pos; }; }; |
