preview while moving camera

main
Clyne 5 months ago
parent 577d44970b
commit 549fe1388c
Signed by: clyne
GPG Key ID: 3267C8EBF3F9AFC7

@ -22,11 +22,13 @@ constexpr unsigned Height = Width / Aspect;
#include <iostream> #include <iostream>
#include <ranges> #include <ranges>
#include <thread> #include <thread>
#include <utility>
static View Camera; static View Camera;
static World world; static World world;
static int threads = 4; static int threads = 4;
static int SamplesPerPixel = 20; static int SamplesPerPixel = 20;
static int SamplesPerPixelTmp = 20;
static float Daylight = 0.5f; static float Daylight = 0.5f;
static std::unique_ptr<Renderer> renderer; static std::unique_ptr<Renderer> renderer;
static std::chrono::time_point<std::chrono::high_resolution_clock> renderStart; static std::chrono::time_point<std::chrono::high_resolution_clock> renderStart;
@ -36,6 +38,7 @@ static color ray_color(const ray& r, int depth = 50);
static void initiateRender(SDL_Surface *canvas); static void initiateRender(SDL_Surface *canvas);
static void showObjectControls(int index, Sphere& o); static void showObjectControls(int index, Sphere& o);
static void addRandomObject(); static void addRandomObject();
static void preview(SDL_Surface *canvas);
int main() int main()
{ {
@ -74,17 +77,23 @@ int main()
ImGui::NewFrame(); ImGui::NewFrame();
ImGui::Begin("settings", nullptr, ImGuiWindowFlags_AlwaysAutoResize); ImGui::Begin("settings", nullptr, ImGuiWindowFlags_AlwaysAutoResize);
ImGui::SliderFloat("fov", &Camera.fieldOfView, 10, 160); if (ImGui::SliderFloat("fov", &Camera.fieldOfView, 10, 160))
ImGui::SameLine(); ImGui::SetNextItemWidth(60); preview(canvas);
ImGui::SameLine(); ImGui::SetNextItemWidth(80);
ImGui::InputInt("T", &threads); ImGui::InputInt("T", &threads);
ImGui::SetNextItemWidth(100); ImGui::SetNextItemWidth(100);
ImGui::InputDouble("X", &Camera.camera.x(), 0.1, 0.05, "%.2lf"); if (ImGui::InputDouble("X", &Camera.camera.x(), 0.1, 0.05, "%.2lf"))
preview(canvas);
ImGui::SameLine(); ImGui::SetNextItemWidth(100); ImGui::SameLine(); ImGui::SetNextItemWidth(100);
ImGui::InputDouble("Y", &Camera.camera.y(), 0.1, 0.05, "%.2lf"); if (ImGui::InputDouble("Y", &Camera.camera.y(), 0.1, 0.05, "%.2lf"))
preview(canvas);
ImGui::SameLine(); ImGui::SetNextItemWidth(100); ImGui::SameLine(); ImGui::SetNextItemWidth(100);
ImGui::InputDouble("Z", &Camera.camera.z(), 0.1, 0.05, "%.2lf"); if (ImGui::InputDouble("Z", &Camera.camera.z(), 0.1, 0.05, "%.2lf"))
ImGui::SliderInt("samples", &SamplesPerPixel, 1, 200); preview(canvas);
ImGui::SliderFloat("shade", &Daylight, 0.f, 1.f); if (ImGui::SliderInt("samples", &SamplesPerPixel, 1, 200)) {
SamplesPerPixelTmp = SamplesPerPixel;
}
ImGui::SliderFloat("shade", &Daylight, 0.25f, 1.f);
if (ImGui::Button("recalculate")) { if (ImGui::Button("recalculate")) {
initiateRender(canvas); initiateRender(canvas);
@ -117,6 +126,7 @@ int main()
tex = SDL_CreateTextureFromSurface(painter, canvas); tex = SDL_CreateTextureFromSurface(painter, canvas);
renderTime = std::chrono::high_resolution_clock::now() - renderStart; renderTime = std::chrono::high_resolution_clock::now() - renderStart;
SamplesPerPixel = SamplesPerPixelTmp;
} else { } else {
ImGui::Text("%0.6lfs", renderTime.count()); ImGui::Text("%0.6lfs", renderTime.count());
} }
@ -217,7 +227,14 @@ void addRandomObject()
{ {
const point3 pos = vec3::random() * vec3(6, 0.8, 3) - vec3(3, 0, 3.8); const point3 pos = vec3::random() * vec3(6, 0.8, 3) - vec3(3, 0, 3.8);
const color col = vec3::random(); const color col = vec3::random();
const auto mat = (int)(randomN() * ((int)Material::Undefined - 1)); const auto mat = (int)(randomN() * (int)Material::Undefined);
world.add(pos, randomN() * 0.3 + 0.05, (Material)mat, col); world.add(pos, randomN() * 0.3 + 0.05, (Material)mat, col);
} }
void preview(SDL_Surface *canvas)
{
if (SamplesPerPixel != 1)
SamplesPerPixelTmp = std::exchange(SamplesPerPixel, 1);
initiateRender(canvas);
}

Loading…
Cancel
Save