From 359e83ae2001ba23b894e026fbde7f55282f8a08 Mon Sep 17 00:00:00 2001 From: PMunkes Date: Mon, 15 Feb 2021 19:06:07 +0100 Subject: [PATCH 1/3] Update SceneList.hpp --- src/SceneList.hpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/SceneList.hpp b/src/SceneList.hpp index b4bb970e..e3b70ccd 100644 --- a/src/SceneList.hpp +++ b/src/SceneList.hpp @@ -34,6 +34,7 @@ class SceneList final static SceneAssets LucyInOneWeekend(CameraInitialSate& camera); static SceneAssets CornellBox(CameraInitialSate& camera); static SceneAssets CornellBoxLucy(CameraInitialSate& camera); + static SceneAssets CornellBoxWithBalls(CameraInitialSate& camera); static const std::vector>> AllScenes; }; From 96cee3b40580b8d57aaca39fb0bd0a88fa6ee636 Mon Sep 17 00:00:00 2001 From: PMunkes Date: Mon, 15 Feb 2021 19:08:09 +0100 Subject: [PATCH 2/3] Update SceneList.cpp --- src/SceneList.cpp | 377 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 377 insertions(+) diff --git a/src/SceneList.cpp b/src/SceneList.cpp index 074e10fd..d3aba43d 100644 --- a/src/SceneList.cpp +++ b/src/SceneList.cpp @@ -18,6 +18,7 @@ const std::vector()); } + +#include "SceneList.hpp" +#include "Assets/Material.hpp" +#include "Assets/Model.hpp" +#include "Assets/Texture.hpp" +#include +#include + +using namespace glm; +using Assets::Material; +using Assets::Model; +using Assets::Texture; + +const std::vector>> SceneList::AllScenes = +{ + {"Cube And Spheres", CubeAndSpheres}, + {"Ray Tracing In One Weekend", RayTracingInOneWeekend}, + {"Planets In One Weekend", PlanetsInOneWeekend}, + {"Lucy In One Weekend", LucyInOneWeekend}, + {"Cornell Box", CornellBox}, + {"Cornell Box & Lucy", CornellBoxLucy}, + {"Cornell Box With Balls", CornellBoxWithBalls}, +}; + +SceneAssets SceneList::CubeAndSpheres(CameraInitialSate& camera) +{ + // Basic test scene. + + camera.ModelView = translate(mat4(1), vec3(0, 0, -2)); + camera.FieldOfView = 90; + camera.Aperture = 0.05f; + camera.FocusDistance = 2.0f; + camera.ControlSpeed = 2.0f; + camera.GammaCorrection = false; + camera.HasSky = true; + + std::vector models; + std::vector textures; + + models.push_back(Model::LoadModel("../assets/models/cube_multi.obj")); + models.push_back(Model::CreateSphere(vec3(1, 0, 0), 0.5, Material::Metallic(vec3(0.7f, 0.5f, 0.8f), 0.2f), true)); + models.push_back(Model::CreateSphere(vec3(-1, 0, 0), 0.5, Material::Dielectric(1.5f), true)); + models.push_back(Model::CreateSphere(vec3(0, 1, 0), 0.5, Material::Lambertian(vec3(1.0f), 0), true)); + + textures.push_back(Texture::LoadTexture("../assets/textures/land_ocean_ice_cloud_2048.png", Vulkan::SamplerConfig())); + + return std::forward_as_tuple(std::move(models), std::move(textures)); +} + +SceneAssets SceneList::RayTracingInOneWeekend(CameraInitialSate& camera) +{ + // Final scene from Ray Tracing In One Weekend book. + + camera.ModelView = lookAt(vec3(13, 2, 3), vec3(0, 0, 0), vec3(0, 1, 0)); + camera.FieldOfView = 20; + camera.Aperture = 0.1f; + camera.FocusDistance = 10.0f; + camera.ControlSpeed = 5.0f; + camera.GammaCorrection = true; + camera.HasSky = true; + + const bool isProc = true; + + std::mt19937 engine(42); + auto random = std::bind(std::uniform_real_distribution(), engine); + + std::vector models; + + models.push_back(Model::CreateSphere(vec3(0, -1000, 0), 1000, Material::Lambertian(vec3(0.5f, 0.5f, 0.5f)), isProc)); + + for (int a = -11; a < 11; ++a) + { + for (int b = -11; b < 11; ++b) + { + const float chooseMat = random(); + const vec3 center(a + 0.9f*random(), 0.2f, b + 0.9f*random()); + + if (length(center - vec3(4, 0.2f, 0)) > 0.9) + { + if (chooseMat < 0.8f) // Diffuse + { + models.push_back(Model::CreateSphere(center, 0.2f, Material::Lambertian(vec3( + random()*random(), + random()*random(), + random()*random())), + isProc)); + } + else if (chooseMat < 0.95f) // Metal + { + models.push_back(Model::CreateSphere(center, 0.2f, Material::Metallic( + vec3(0.5f*(1 + random()), 0.5f*(1 + random()), 0.5f*(1 + random())), + 0.5f*random()), + isProc)); + } + else // Glass + { + models.push_back(Model::CreateSphere(center, 0.2f, Material::Dielectric(1.5f), isProc)); + } + } + } + } + + models.push_back(Model::CreateSphere(vec3(0, 1, 0), 1.0f, Material::Dielectric(1.5f), isProc)); + models.push_back(Model::CreateSphere(vec3(-4, 1, 0), 1.0f, Material::Lambertian(vec3(0.4f, 0.2f, 0.1f)), isProc)); + models.push_back(Model::CreateSphere(vec3(4, 1, 0), 1.0f, Material::Metallic(vec3(0.7f, 0.6f, 0.5f), 0.0f), isProc)); + + return std::forward_as_tuple(std::move(models), std::vector()); +} + + +SceneAssets SceneList::PlanetsInOneWeekend(CameraInitialSate& camera) +{ + // Same as RayTracingInOneWeekend but using textures. + + camera.ModelView = lookAt(vec3(13, 2, 3), vec3(0, 0, 0), vec3(0, 1, 0)); + camera.FieldOfView = 20; + camera.Aperture = 0.1f; + camera.FocusDistance = 10.0f; + camera.ControlSpeed = 5.0f; + camera.GammaCorrection = true; + camera.HasSky = true; + + const bool isProc = true; + + std::mt19937 engine(42); + auto random = std::bind(std::uniform_real_distribution(), engine); + + std::vector models; + std::vector textures; + + models.push_back(Model::CreateSphere(vec3(0, -1000, 0), 1000, Material::Lambertian(vec3(0.5f, 0.5f, 0.5f)), isProc)); + + for (int a = -11; a < 11; ++a) + { + for (int b = -11; b < 11; ++b) + { + const float chooseMat = random(); + const vec3 center(a + 0.9f * random(), 0.2f, b + 0.9f * random()); + + if (length(center - vec3(4, 0.2f, 0)) > 0.9) + { + if (chooseMat < 0.8f) // Diffuse + { + models.push_back(Model::CreateSphere(center, 0.2f, Material::Lambertian(vec3( + random() * random(), + random() * random(), + random() * random())), + isProc)); + } + else if (chooseMat < 0.95f) // Metal + { + models.push_back(Model::CreateSphere(center, 0.2f, Material::Metallic( + vec3(0.5f * (1 + random()), 0.5f * (1 + random()), 0.5f * (1 + random())), + 0.5f * random()), + isProc)); + } + else // Glass + { + models.push_back(Model::CreateSphere(center, 0.2f, Material::Dielectric(1.5f), isProc)); + } + } + } + } + + models.push_back(Model::CreateSphere(vec3(0, 1, 0), 1.0f, Material::Metallic(vec3(1.0f), 0.1f, 2), isProc)); + models.push_back(Model::CreateSphere(vec3(-4, 1, 0), 1.0f, Material::Lambertian(vec3(1.0f), 0), isProc)); + models.push_back(Model::CreateSphere(vec3(4, 1, 0), 1.0f, Material::Metallic(vec3(1.0f), 0.0f, 1), isProc)); + + textures.push_back(Texture::LoadTexture("../assets/textures/2k_mars.jpg", Vulkan::SamplerConfig())); + textures.push_back(Texture::LoadTexture("../assets/textures/2k_moon.jpg", Vulkan::SamplerConfig())); + textures.push_back(Texture::LoadTexture("../assets/textures/land_ocean_ice_cloud_2048.png", Vulkan::SamplerConfig())); + + return std::forward_as_tuple(std::move(models), std::move(textures)); +} + +SceneAssets SceneList::LucyInOneWeekend(CameraInitialSate& camera) +{ + // Same as RayTracingInOneWeekend but using the Lucy 3D model. + + camera.ModelView = lookAt(vec3(13, 2, 3), vec3(0, 1.0, 0), vec3(0, 1, 0)); + camera.FieldOfView = 20; + camera.Aperture = 0.05f; + camera.FocusDistance = 10.0f; + camera.ControlSpeed = 5.0f; + camera.GammaCorrection = true; + camera.HasSky = true; + + const bool isProc = true; + + std::mt19937 engine(42); + auto random = std::bind(std::uniform_real_distribution(), engine); + + std::vector models; + + models.push_back(Model::CreateSphere(vec3(0, -1000, 0), 1000, Material::Lambertian(vec3(0.5f, 0.5f, 0.5f)), isProc)); + + for (int a = -11; a < 11; ++a) + { + for (int b = -11; b < 11; ++b) + { + const float chooseMat = random(); + const vec3 center(a + 0.9f*random(), 0.2f, b + 0.9f*random()); + + if (length(center - vec3(4, 0.2f, 0)) > 0.9) + { + if (chooseMat < 0.8f) // Diffuse + { + models.push_back(Model::CreateSphere(center, 0.2f, Material::Lambertian(vec3( + random()*random(), + random()*random(), + random()*random())), + isProc)); + } + else if (chooseMat < 0.95f) // Metal + { + models.push_back(Model::CreateSphere(center, 0.2f, Material::Metallic( + vec3(0.5f*(1 + random()), 0.5f*(1 + random()), 0.5f*(1 + random())), + 0.5f*random()), + isProc)); + } + else // Glass + { + models.push_back(Model::CreateSphere(center, 0.2f, Material::Dielectric(1.5f), isProc)); + } + } + } + } + + auto lucy0 = Model::LoadModel("../assets/models/lucy.obj"); + auto lucy1 = lucy0; + auto lucy2 = lucy0; + + const auto i = mat4(1); + const float scaleFactor = 0.0035f; + + lucy0.Transform( + rotate( + scale( + translate(i, vec3(0, -0.08f, 0)), + vec3(scaleFactor)), + radians(90.0f), vec3(0, 1, 0))); + + lucy1.Transform( + rotate( + scale( + translate(i, vec3(-4, -0.08f, 0)), + vec3(scaleFactor)), + radians(90.0f), vec3(0, 1, 0))); + + lucy2.Transform( + rotate( + scale( + translate(i, vec3(4, -0.08f, 0)), + vec3(scaleFactor)), + radians(90.0f), vec3(0, 1, 0))); + + lucy0.SetMaterial(Material::Dielectric(1.5f)); + lucy1.SetMaterial(Material::Lambertian(vec3(0.4f, 0.2f, 0.1f))); + lucy2.SetMaterial(Material::Metallic(vec3(0.7f, 0.6f, 0.5f), 0.05f)); + + models.push_back(std::move(lucy0)); + models.push_back(std::move(lucy1)); + models.push_back(std::move(lucy2)); + + return std::forward_as_tuple(std::move(models), std::vector()); +} + +SceneAssets SceneList::CornellBox(CameraInitialSate& camera) +{ + camera.ModelView = lookAt(vec3(278, 278, 800), vec3(278, 278, 0), vec3(0, 1, 0)); + camera.FieldOfView = 40; + camera.Aperture = 0.0f; + camera.FocusDistance = 10.0f; + camera.ControlSpeed = 500.0f; + camera.GammaCorrection = true; + camera.HasSky = false; + + const auto i = mat4(1); + const auto white = Material::Lambertian(vec3(0.73f, 0.73f, 0.73f)); + + auto box0 = Model::CreateBox(vec3(0, 0, -165), vec3(165, 165, 0), white); + auto box1 = Model::CreateBox(vec3(0, 0, -165), vec3(165, 330, 0), white); + + box0.Transform(rotate(translate(i, vec3(555 - 130 - 165, 0, -65)), radians(-18.0f), vec3(0, 1, 0))); + box1.Transform(rotate(translate(i, vec3(555 - 265 - 165, 0, -295)), radians(15.0f), vec3(0, 1, 0))); + + std::vector models; + models.push_back(Model::CreateCornellBox(555)); + models.push_back(box0); + models.push_back(box1); + + return std::make_tuple(std::move(models), std::vector()); +} + +SceneAssets SceneList::CornellBoxLucy(CameraInitialSate& camera) +{ + camera.ModelView = lookAt(vec3(278, 278, 800), vec3(278, 278, 0), vec3(0, 1, 0)); + camera.FieldOfView = 40; + camera.Aperture = 0.0f; + camera.FocusDistance = 10.0f; + camera.ControlSpeed = 500.0f; + camera.GammaCorrection = true; + camera.HasSky = false; + + const auto i = mat4(1); + const auto sphere = Model::CreateSphere(vec3(555 - 130, 165.0f, -165.0f / 2 - 65), 80.0f, Material::Dielectric(1.5f), true); + auto lucy0 = Model::LoadModel("../assets/models/lucy.obj"); + + lucy0.Transform( + rotate( + scale( + translate(i, vec3(555 - 300 - 165/2, -9, -295 - 165/2)), + vec3(0.6f)), + radians(75.0f), vec3(0, 1, 0))); + + std::vector models; + models.push_back(Model::CreateCornellBox(555)); + models.push_back(sphere); + models.push_back(lucy0); + + return std::forward_as_tuple(std::move(models), std::vector()); +} + +SceneAssets SceneList::CornellBoxWithBalls(CameraInitialSate& camera) +{ + camera.ModelView = lookAt(vec3(278, 278, 800), vec3(278, 278, 0), vec3(0, 1, 0)); + camera.FieldOfView = 40; + camera.Aperture = 0.0f; + camera.FocusDistance = 10.0f; + camera.ControlSpeed = 500.0f; + camera.GammaCorrection = true; + camera.HasSky = false; + + std::mt19937 engine(42); + auto random = std::bind(std::uniform_real_distribution(), engine); + + const bool isProc = true; + + std::vector models; + models.push_back(Model::CreateCornellBox(555)); + + for (size_t i = 0; i < 10; i++) + { + for (size_t j = 0; j < 10; j++) + { + for (size_t k = 0; k < 10; k++) + { + const float chooseMat = random(); + const vec3 center(22.5 + i * 55.f + 20.*random() , 22.5 + j * 55.f + 20. * random(), -1.*(22.5 + k * 55.f + 20. * random())); + + if (chooseMat < 0.8f) // Diffuse + { + models.push_back(Model::CreateSphere(center, 4.f, Material::Lambertian(vec3( + random() * random(), + random() * random(), + random() * random())), + isProc)); + } + else if (chooseMat < 0.98f) // Metal + { + models.push_back(Model::CreateSphere(center, 4.f, Material::Metallic( + vec3(0.5f * (1 + random()), 0.5f * (1 + random()), 0.5f * (1 + random())), + 0.5f * random()), + isProc)); + } + else // Glass + { + models.push_back(Model::CreateSphere(center, 4.f, Material::Dielectric(1.5f), isProc)); + } + + } + } + } + + return std::make_tuple(std::move(models), std::vector()); +} From d6db922592e4144b6c601461afc93a425b62bf2a Mon Sep 17 00:00:00 2001 From: PMunkes Date: Mon, 15 Feb 2021 19:20:47 +0100 Subject: [PATCH 3/3] Remove accidentally copied code --- src/SceneList.cpp | 322 ---------------------------------------------- 1 file changed, 322 deletions(-) diff --git a/src/SceneList.cpp b/src/SceneList.cpp index d3aba43d..a6384386 100644 --- a/src/SceneList.cpp +++ b/src/SceneList.cpp @@ -320,328 +320,6 @@ SceneAssets SceneList::CornellBoxLucy(CameraInitialSate& camera) return std::forward_as_tuple(std::move(models), std::vector()); } -#include "SceneList.hpp" -#include "Assets/Material.hpp" -#include "Assets/Model.hpp" -#include "Assets/Texture.hpp" -#include -#include - -using namespace glm; -using Assets::Material; -using Assets::Model; -using Assets::Texture; - -const std::vector>> SceneList::AllScenes = -{ - {"Cube And Spheres", CubeAndSpheres}, - {"Ray Tracing In One Weekend", RayTracingInOneWeekend}, - {"Planets In One Weekend", PlanetsInOneWeekend}, - {"Lucy In One Weekend", LucyInOneWeekend}, - {"Cornell Box", CornellBox}, - {"Cornell Box & Lucy", CornellBoxLucy}, - {"Cornell Box With Balls", CornellBoxWithBalls}, -}; - -SceneAssets SceneList::CubeAndSpheres(CameraInitialSate& camera) -{ - // Basic test scene. - - camera.ModelView = translate(mat4(1), vec3(0, 0, -2)); - camera.FieldOfView = 90; - camera.Aperture = 0.05f; - camera.FocusDistance = 2.0f; - camera.ControlSpeed = 2.0f; - camera.GammaCorrection = false; - camera.HasSky = true; - - std::vector models; - std::vector textures; - - models.push_back(Model::LoadModel("../assets/models/cube_multi.obj")); - models.push_back(Model::CreateSphere(vec3(1, 0, 0), 0.5, Material::Metallic(vec3(0.7f, 0.5f, 0.8f), 0.2f), true)); - models.push_back(Model::CreateSphere(vec3(-1, 0, 0), 0.5, Material::Dielectric(1.5f), true)); - models.push_back(Model::CreateSphere(vec3(0, 1, 0), 0.5, Material::Lambertian(vec3(1.0f), 0), true)); - - textures.push_back(Texture::LoadTexture("../assets/textures/land_ocean_ice_cloud_2048.png", Vulkan::SamplerConfig())); - - return std::forward_as_tuple(std::move(models), std::move(textures)); -} - -SceneAssets SceneList::RayTracingInOneWeekend(CameraInitialSate& camera) -{ - // Final scene from Ray Tracing In One Weekend book. - - camera.ModelView = lookAt(vec3(13, 2, 3), vec3(0, 0, 0), vec3(0, 1, 0)); - camera.FieldOfView = 20; - camera.Aperture = 0.1f; - camera.FocusDistance = 10.0f; - camera.ControlSpeed = 5.0f; - camera.GammaCorrection = true; - camera.HasSky = true; - - const bool isProc = true; - - std::mt19937 engine(42); - auto random = std::bind(std::uniform_real_distribution(), engine); - - std::vector models; - - models.push_back(Model::CreateSphere(vec3(0, -1000, 0), 1000, Material::Lambertian(vec3(0.5f, 0.5f, 0.5f)), isProc)); - - for (int a = -11; a < 11; ++a) - { - for (int b = -11; b < 11; ++b) - { - const float chooseMat = random(); - const vec3 center(a + 0.9f*random(), 0.2f, b + 0.9f*random()); - - if (length(center - vec3(4, 0.2f, 0)) > 0.9) - { - if (chooseMat < 0.8f) // Diffuse - { - models.push_back(Model::CreateSphere(center, 0.2f, Material::Lambertian(vec3( - random()*random(), - random()*random(), - random()*random())), - isProc)); - } - else if (chooseMat < 0.95f) // Metal - { - models.push_back(Model::CreateSphere(center, 0.2f, Material::Metallic( - vec3(0.5f*(1 + random()), 0.5f*(1 + random()), 0.5f*(1 + random())), - 0.5f*random()), - isProc)); - } - else // Glass - { - models.push_back(Model::CreateSphere(center, 0.2f, Material::Dielectric(1.5f), isProc)); - } - } - } - } - - models.push_back(Model::CreateSphere(vec3(0, 1, 0), 1.0f, Material::Dielectric(1.5f), isProc)); - models.push_back(Model::CreateSphere(vec3(-4, 1, 0), 1.0f, Material::Lambertian(vec3(0.4f, 0.2f, 0.1f)), isProc)); - models.push_back(Model::CreateSphere(vec3(4, 1, 0), 1.0f, Material::Metallic(vec3(0.7f, 0.6f, 0.5f), 0.0f), isProc)); - - return std::forward_as_tuple(std::move(models), std::vector()); -} - - -SceneAssets SceneList::PlanetsInOneWeekend(CameraInitialSate& camera) -{ - // Same as RayTracingInOneWeekend but using textures. - - camera.ModelView = lookAt(vec3(13, 2, 3), vec3(0, 0, 0), vec3(0, 1, 0)); - camera.FieldOfView = 20; - camera.Aperture = 0.1f; - camera.FocusDistance = 10.0f; - camera.ControlSpeed = 5.0f; - camera.GammaCorrection = true; - camera.HasSky = true; - - const bool isProc = true; - - std::mt19937 engine(42); - auto random = std::bind(std::uniform_real_distribution(), engine); - - std::vector models; - std::vector textures; - - models.push_back(Model::CreateSphere(vec3(0, -1000, 0), 1000, Material::Lambertian(vec3(0.5f, 0.5f, 0.5f)), isProc)); - - for (int a = -11; a < 11; ++a) - { - for (int b = -11; b < 11; ++b) - { - const float chooseMat = random(); - const vec3 center(a + 0.9f * random(), 0.2f, b + 0.9f * random()); - - if (length(center - vec3(4, 0.2f, 0)) > 0.9) - { - if (chooseMat < 0.8f) // Diffuse - { - models.push_back(Model::CreateSphere(center, 0.2f, Material::Lambertian(vec3( - random() * random(), - random() * random(), - random() * random())), - isProc)); - } - else if (chooseMat < 0.95f) // Metal - { - models.push_back(Model::CreateSphere(center, 0.2f, Material::Metallic( - vec3(0.5f * (1 + random()), 0.5f * (1 + random()), 0.5f * (1 + random())), - 0.5f * random()), - isProc)); - } - else // Glass - { - models.push_back(Model::CreateSphere(center, 0.2f, Material::Dielectric(1.5f), isProc)); - } - } - } - } - - models.push_back(Model::CreateSphere(vec3(0, 1, 0), 1.0f, Material::Metallic(vec3(1.0f), 0.1f, 2), isProc)); - models.push_back(Model::CreateSphere(vec3(-4, 1, 0), 1.0f, Material::Lambertian(vec3(1.0f), 0), isProc)); - models.push_back(Model::CreateSphere(vec3(4, 1, 0), 1.0f, Material::Metallic(vec3(1.0f), 0.0f, 1), isProc)); - - textures.push_back(Texture::LoadTexture("../assets/textures/2k_mars.jpg", Vulkan::SamplerConfig())); - textures.push_back(Texture::LoadTexture("../assets/textures/2k_moon.jpg", Vulkan::SamplerConfig())); - textures.push_back(Texture::LoadTexture("../assets/textures/land_ocean_ice_cloud_2048.png", Vulkan::SamplerConfig())); - - return std::forward_as_tuple(std::move(models), std::move(textures)); -} - -SceneAssets SceneList::LucyInOneWeekend(CameraInitialSate& camera) -{ - // Same as RayTracingInOneWeekend but using the Lucy 3D model. - - camera.ModelView = lookAt(vec3(13, 2, 3), vec3(0, 1.0, 0), vec3(0, 1, 0)); - camera.FieldOfView = 20; - camera.Aperture = 0.05f; - camera.FocusDistance = 10.0f; - camera.ControlSpeed = 5.0f; - camera.GammaCorrection = true; - camera.HasSky = true; - - const bool isProc = true; - - std::mt19937 engine(42); - auto random = std::bind(std::uniform_real_distribution(), engine); - - std::vector models; - - models.push_back(Model::CreateSphere(vec3(0, -1000, 0), 1000, Material::Lambertian(vec3(0.5f, 0.5f, 0.5f)), isProc)); - - for (int a = -11; a < 11; ++a) - { - for (int b = -11; b < 11; ++b) - { - const float chooseMat = random(); - const vec3 center(a + 0.9f*random(), 0.2f, b + 0.9f*random()); - - if (length(center - vec3(4, 0.2f, 0)) > 0.9) - { - if (chooseMat < 0.8f) // Diffuse - { - models.push_back(Model::CreateSphere(center, 0.2f, Material::Lambertian(vec3( - random()*random(), - random()*random(), - random()*random())), - isProc)); - } - else if (chooseMat < 0.95f) // Metal - { - models.push_back(Model::CreateSphere(center, 0.2f, Material::Metallic( - vec3(0.5f*(1 + random()), 0.5f*(1 + random()), 0.5f*(1 + random())), - 0.5f*random()), - isProc)); - } - else // Glass - { - models.push_back(Model::CreateSphere(center, 0.2f, Material::Dielectric(1.5f), isProc)); - } - } - } - } - - auto lucy0 = Model::LoadModel("../assets/models/lucy.obj"); - auto lucy1 = lucy0; - auto lucy2 = lucy0; - - const auto i = mat4(1); - const float scaleFactor = 0.0035f; - - lucy0.Transform( - rotate( - scale( - translate(i, vec3(0, -0.08f, 0)), - vec3(scaleFactor)), - radians(90.0f), vec3(0, 1, 0))); - - lucy1.Transform( - rotate( - scale( - translate(i, vec3(-4, -0.08f, 0)), - vec3(scaleFactor)), - radians(90.0f), vec3(0, 1, 0))); - - lucy2.Transform( - rotate( - scale( - translate(i, vec3(4, -0.08f, 0)), - vec3(scaleFactor)), - radians(90.0f), vec3(0, 1, 0))); - - lucy0.SetMaterial(Material::Dielectric(1.5f)); - lucy1.SetMaterial(Material::Lambertian(vec3(0.4f, 0.2f, 0.1f))); - lucy2.SetMaterial(Material::Metallic(vec3(0.7f, 0.6f, 0.5f), 0.05f)); - - models.push_back(std::move(lucy0)); - models.push_back(std::move(lucy1)); - models.push_back(std::move(lucy2)); - - return std::forward_as_tuple(std::move(models), std::vector()); -} - -SceneAssets SceneList::CornellBox(CameraInitialSate& camera) -{ - camera.ModelView = lookAt(vec3(278, 278, 800), vec3(278, 278, 0), vec3(0, 1, 0)); - camera.FieldOfView = 40; - camera.Aperture = 0.0f; - camera.FocusDistance = 10.0f; - camera.ControlSpeed = 500.0f; - camera.GammaCorrection = true; - camera.HasSky = false; - - const auto i = mat4(1); - const auto white = Material::Lambertian(vec3(0.73f, 0.73f, 0.73f)); - - auto box0 = Model::CreateBox(vec3(0, 0, -165), vec3(165, 165, 0), white); - auto box1 = Model::CreateBox(vec3(0, 0, -165), vec3(165, 330, 0), white); - - box0.Transform(rotate(translate(i, vec3(555 - 130 - 165, 0, -65)), radians(-18.0f), vec3(0, 1, 0))); - box1.Transform(rotate(translate(i, vec3(555 - 265 - 165, 0, -295)), radians(15.0f), vec3(0, 1, 0))); - - std::vector models; - models.push_back(Model::CreateCornellBox(555)); - models.push_back(box0); - models.push_back(box1); - - return std::make_tuple(std::move(models), std::vector()); -} - -SceneAssets SceneList::CornellBoxLucy(CameraInitialSate& camera) -{ - camera.ModelView = lookAt(vec3(278, 278, 800), vec3(278, 278, 0), vec3(0, 1, 0)); - camera.FieldOfView = 40; - camera.Aperture = 0.0f; - camera.FocusDistance = 10.0f; - camera.ControlSpeed = 500.0f; - camera.GammaCorrection = true; - camera.HasSky = false; - - const auto i = mat4(1); - const auto sphere = Model::CreateSphere(vec3(555 - 130, 165.0f, -165.0f / 2 - 65), 80.0f, Material::Dielectric(1.5f), true); - auto lucy0 = Model::LoadModel("../assets/models/lucy.obj"); - - lucy0.Transform( - rotate( - scale( - translate(i, vec3(555 - 300 - 165/2, -9, -295 - 165/2)), - vec3(0.6f)), - radians(75.0f), vec3(0, 1, 0))); - - std::vector models; - models.push_back(Model::CreateCornellBox(555)); - models.push_back(sphere); - models.push_back(lucy0); - - return std::forward_as_tuple(std::move(models), std::vector()); -} - SceneAssets SceneList::CornellBoxWithBalls(CameraInitialSate& camera) { camera.ModelView = lookAt(vec3(278, 278, 800), vec3(278, 278, 0), vec3(0, 1, 0));