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 <ranges>
#include <thread>
#include <utility>
static View Camera;
static World world;
static int threads = 4;
static int SamplesPerPixel = 20;
static int SamplesPerPixelTmp = 20;
static float Daylight = 0.5f;
static std::unique_ptr<Renderer> renderer;
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 showObjectControls(int index, Sphere& o);
static void addRandomObject();
static void preview(SDL_Surface *canvas);
int main()
{
@ -74,17 +77,23 @@ int main()
ImGui::NewFrame();
ImGui::Begin("settings", nullptr, ImGuiWindowFlags_AlwaysAutoResize);
ImGui::SliderFloat("fov", &Camera.fieldOfView, 10, 160);
ImGui::SameLine(); ImGui::SetNextItemWidth(60);
if (ImGui::SliderFloat("fov", &Camera.fieldOfView, 10, 160))
preview(canvas);
ImGui::SameLine(); ImGui::SetNextItemWidth(80);
ImGui::InputInt("T", &threads);
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::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::InputDouble("Z", &Camera.camera.z(), 0.1, 0.05, "%.2lf");
ImGui::SliderInt("samples", &SamplesPerPixel, 1, 200);
ImGui::SliderFloat("shade", &Daylight, 0.f, 1.f);
if (ImGui::InputDouble("Z", &Camera.camera.z(), 0.1, 0.05, "%.2lf"))
preview(canvas);
if (ImGui::SliderInt("samples", &SamplesPerPixel, 1, 200)) {
SamplesPerPixelTmp = SamplesPerPixel;
}
ImGui::SliderFloat("shade", &Daylight, 0.25f, 1.f);
if (ImGui::Button("recalculate")) {
initiateRender(canvas);
@ -117,6 +126,7 @@ int main()
tex = SDL_CreateTextureFromSurface(painter, canvas);
renderTime = std::chrono::high_resolution_clock::now() - renderStart;
SamplesPerPixel = SamplesPerPixelTmp;
} else {
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 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);
}
void preview(SDL_Surface *canvas)
{
if (SamplesPerPixel != 1)
SamplesPerPixelTmp = std::exchange(SamplesPerPixel, 1);
initiateRender(canvas);
}

Loading…
Cancel
Save