#pragma once #include #include #include #include "ray.h" #include "intersections.h" #include "lighting.h" constexpr glm::vec3 light_position = glm::vec3(5); constexpr float light_bias = 0.01f; constexpr int max_depth = 2; constexpr int num_indirect_samples = 4; struct Object { glm::vec3 position = glm::vec3(0); glm::vec3 color = glm::vec3(1); tinyobj::attrib_t attrib; std::vector shapes; std::vector materials; }; struct Scene { std::vector objects; Object& load_from_file(const std::string_view path) { Object o; tinyobj::LoadObj(&o.attrib, &o.shapes, &o.materials, nullptr, path.data()); return objects.emplace_back(o); } }; glm::vec3 fetch_position(const Object& object, const tinyobj::mesh_t& mesh, const int32_t index, const int32_t vertex); glm::vec3 fetch_normal(const Object& object, const tinyobj::mesh_t& mesh, const int32_t index, const int32_t vertex); struct HitResult { glm::vec3 position, normal; Object object; }; std::optional test_mesh(const Ray ray, const Object& object, const tinyobj::mesh_t& mesh, float& tClosest); std::optional test_scene(const Ray ray, const Scene& scene, float tClosest = std::numeric_limits::infinity()); struct SceneResult { HitResult hit; glm::vec3 color, indirect; }; std::optional cast_scene(const Ray ray, const Scene& scene, const int depth = 0);