From 43c0d37c11bf24f43680f62c0a6a341ab16e694c Mon Sep 17 00:00:00 2001 From: TheNumbat Date: Sun, 10 Jan 2021 14:18:10 -0800 Subject: [PATCH] Release more changes Features - Button to add samples to current render Fixes - Don't draw emitter arrows when rendering with rasterization - (Previous commit) deal with non-uniform ray hit distance scaling systematically instead of deferring it to hit functions. --- src/gui/widgets.cpp | 8 +++++++- src/rays/pathtracer.cpp | 21 +++++++++++---------- src/rays/pathtracer.h | 2 +- src/scene/particles.cpp | 7 +++++-- src/scene/particles.h | 2 +- src/scene/renderer.cpp | 7 ++++++- 6 files changed, 31 insertions(+), 16 deletions(-) diff --git a/src/gui/widgets.cpp b/src/gui/widgets.cpp index 6c8111b..08844cf 100644 --- a/src/gui/widgets.cpp +++ b/src/gui/widgets.cpp @@ -761,7 +761,6 @@ bool Widget_Render::UI(Scene& scene, Widget_Camera& cam, Camera& user_cam, std:: if(ImGui::Button("Cancel")) { pathtracer.cancel(); - has_rendered = false; } ImGui::SameLine(); @@ -812,6 +811,13 @@ bool Widget_Render::UI(Scene& scene, Widget_Camera& cam, Camera& user_cam, std:: } } + if(method == 1 && has_rendered) { + ImGui::SameLine(); + if(ImGui::Button("Add Samples")) { + pathtracer.begin_render(scene, cam.get(), true); + } + } + float avail = ImGui::GetContentRegionAvail().x; float w = std::min(avail, (float)out_w); float h = (w / out_w) * out_h; diff --git a/src/rays/pathtracer.cpp b/src/rays/pathtracer.cpp index c6e8db6..bad422a 100644 --- a/src/rays/pathtracer.cpp +++ b/src/rays/pathtracer.cpp @@ -233,21 +233,23 @@ size_t Pathtracer::visualize_bvh(GL::Lines& lines, GL::Lines& active, size_t dep return scene.visualize(lines, active, depth, Mat4::I); } -void Pathtracer::begin_render(Scene& layout_scene, const Camera& cam) { +void Pathtracer::begin_render(Scene& layout_scene, const Camera& cam, bool add_samples) { size_t n_threads = std::thread::hardware_concurrency(); size_t samples_per_epoch = std::max(size_t(1), n_samples / (n_threads * 10)); cancel(); - - accumulator.clear({}); total_epochs = n_samples / samples_per_epoch + !!(n_samples % samples_per_epoch); - build_time = SDL_GetPerformanceCounter(); - build_scene(layout_scene); + if(!add_samples) { + accumulator.clear({}); + accumulator_samples = 0; + build_time = SDL_GetPerformanceCounter(); + build_scene(layout_scene); + build_time = SDL_GetPerformanceCounter() - build_time; + } render_time = SDL_GetPerformanceCounter(); - build_time = render_time - build_time; - + camera = cam; for(size_t s = 0; s < n_samples; s += samples_per_epoch) { @@ -266,12 +268,11 @@ void Pathtracer::begin_render(Scene& layout_scene, const Camera& cam) { void Pathtracer::cancel() { cancel_flag = true; thread_pool.clear(); - render_time = 0; - build_time = 0; - accumulator_samples = 0; completed_epochs = 0; total_epochs = 0; cancel_flag = false; + build_time = 0; + render_time = SDL_GetPerformanceCounter() - render_time; } const HDR_Image& Pathtracer::get_output() { diff --git a/src/rays/pathtracer.h b/src/rays/pathtracer.h index 0e1db5d..7546af9 100644 --- a/src/rays/pathtracer.h +++ b/src/rays/pathtracer.h @@ -32,7 +32,7 @@ public: const GL::Tex2D& get_output_texture(float exposure); size_t visualize_bvh(GL::Lines& lines, GL::Lines& active, size_t level); - void begin_render(Scene& scene, const Camera& camera); + void begin_render(Scene& scene, const Camera& camera, bool add_samples = false); void cancel(); bool in_progress() const; float progress() const; diff --git a/src/scene/particles.cpp b/src/scene/particles.cpp index 0f847da..80a2ce4 100644 --- a/src/scene/particles.cpp +++ b/src/scene/particles.cpp @@ -50,7 +50,7 @@ const GL::Mesh& Scene_Particles::mesh() const { return particle_instances.mesh(); } -void Scene_Particles::render(const Mat4& view, bool depth_only, bool posed) { +void Scene_Particles::render(const Mat4& view, bool depth_only, bool posed, bool particles_only) { Renderer& renderer = Renderer::get(); @@ -62,7 +62,10 @@ void Scene_Particles::render(const Mat4& view, bool depth_only, bool posed) { opts.solid_color = true; opts.depth_only = depth_only; opts.color = opt.color.to_vec(); - renderer.mesh(arrow, opts); + + if(!particles_only) { + renderer.mesh(arrow, opts); + } if(opt.enabled && !depth_only) { opts.modelview = view; diff --git a/src/scene/particles.h b/src/scene/particles.h index 568d5e4..8f77645 100644 --- a/src/scene/particles.h +++ b/src/scene/particles.h @@ -42,7 +42,7 @@ public: const std::vector& get_particles() const; BBox bbox() const; - void render(const Mat4& view, bool depth_only = false, bool posed = true); + void render(const Mat4& view, bool depth_only = false, bool posed = true, bool particles_only = false); Scene_ID id() const; void set_time(float time); diff --git a/src/scene/renderer.cpp b/src/scene/renderer.cpp index 061fd23..da00b20 100644 --- a/src/scene/renderer.cpp +++ b/src/scene/renderer.cpp @@ -90,7 +90,12 @@ void Renderer::save(Scene& scene, const Camera& cam, int w, int h, int s) { Scene_Light& light = item.get(); if(!light.is_env()) return; } - item.render(view); + + if(item.is()) { + item.get().render(view, false, true, true); + } else { + item.render(view); + } }); save_buffer.blit_to(0, save_output, true); -- GitLab