Implement BVH

This commit is contained in:
CJSatnarine
2024-07-08 17:31:04 -04:00
parent 5ca33d1762
commit 80f3aff65d
18 changed files with 81908 additions and 351689 deletions

View File

@@ -3,6 +3,8 @@ project(Raytracer VERSION 0.1.0 LANGUAGES C CXX)
add_executable(Raytracer add_executable(Raytracer
ImageGenerator.cpp ImageGenerator.cpp
aabb.h
bvh.h
camera.h camera.h
colour.h colour.h
hittable.h hittable.h

View File

@@ -1,4 +1,5 @@
#include "rayTracer.h" #include "rayTracer.h"
#include "bvh.h"
#include "camera.h" #include "camera.h"
#include "hittable.h" #include "hittable.h"
#include "hittableList.h" #include "hittableList.h"
@@ -9,18 +10,6 @@ int main(void) {
// World. // World.
hittableList world; hittableList world;
// auto groundMaterial = make_shared<lambertian>(colour(0.1, 0.0, 0.0));
// auto centreMaterial = make_shared<lambertian>(colour(0.1, 0.2, 0.5));
// auto leftMaterial = make_shared<dielectric>(1.50);
// auto bubbleMaterial = make_shared<dielectric>(1.00 / 1.50);
// auto rightMaterial = make_shared<metal>(colour(1.0, 0.0, 0.0), 1.0);
// world.add(make_shared<sphere>(point3( 0.0, -100.5, -1.0), 100.0, groundMaterial));
// world.add(make_shared<sphere>(point3( 0.0, 0.0, -1.2), 0.5, centreMaterial));
// world.add(make_shared<sphere>(point3(-1.0, 0.0, -1.0), 0.5, leftMaterial));
// world.add(make_shared<sphere>(point3(-1.0, 0.0, -1.0), 0.4, bubbleMaterial));
// world.add(make_shared<sphere>(point3( 1.0, 0.0, -1.0), 0.5, rightMaterial));
// Code from the book. // Code from the book.
auto ground_material = make_shared<lambertian>(colour(0.5, 0.5, 0.5)); auto ground_material = make_shared<lambertian>(colour(0.5, 0.5, 0.5));
world.add(make_shared<sphere>(point3(0,-1000,0), 1000, ground_material)); world.add(make_shared<sphere>(point3(0,-1000,0), 1000, ground_material));
@@ -65,6 +54,8 @@ int main(void) {
auto material3 = make_shared<metal>(colour(0.7, 0.6, 0.5), 0.0); auto material3 = make_shared<metal>(colour(0.7, 0.6, 0.5), 0.0);
world.add(make_shared<sphere>(point3(4, 1, 0), 1.0, material3)); world.add(make_shared<sphere>(point3(4, 1, 0), 1.0, material3));
world = hittableList(make_shared<bvh_node>(world));
// Camera. // Camera.
camera cam; camera cam;
cam.aspectRatio = 16.0 / 9.0; cam.aspectRatio = 16.0 / 9.0;

58
aabb.h Normal file
View File

@@ -0,0 +1,58 @@
#ifndef AABB_H
#define AABB_H
#include "rayTracer.h"
class aabb {
public:
interval x, y, z;
aabb() {} // The default AABB is empty, since intervals are empty by default.
aabb(const interval& x, const interval& y, const interval& z) : x(x), y(y), z(z) {}
aabb(const point3& a, const point3& b) {
// Treat the two points a and b as extrema for the bounding box, so we don't require a particular minimum/maximum coordinate order.
x = (a[0] <= b[0]) ? interval(a[0], b[0]) : interval(b[0], a[0]);
y = (a[1] <= b[1]) ? interval(a[1], b[1]) : interval(b[1], a[1]);
z = (a[2] <= b[2]) ? interval(a[2], b[2]) : interval(b[2], a[2]);
}
aabb(const aabb& box0, const aabb& box1) {
x = interval(box0.x, box1.x);
y = interval(box0.y, box1.y);
z = interval(box0.z, box1.z);
}
const interval& axisInterval(int n) const {
if (n == 1) return y;
if (n == 2) return z;
return x;
}
bool hit(const ray& r, interval rayT) const {
const point3& rayOrigin = r.origin();
const vec3& rayDirection = r.direction();
for (int axis = 0; axis < 3; axis++) {
const interval& ax = axisInterval(axis);
const double adInv = 1.0 / rayDirection[axis];
auto t0 = (ax.min - rayOrigin[axis]) * adInv;
auto t1 = (ax.max - rayOrigin[axis]) * adInv;
if (t0 < t1) {
if (t0 > rayT.min) rayT.min = t0;
if (t1 < rayT.max) rayT.max = t1;
} else {
if (t1 > rayT.min) rayT.min = t1;
if (t0 < rayT.max) rayT.max = t0;
}
if (rayT.max <= rayT.min) return false;
}
return true;
}
};
#endif

View File

@@ -39,7 +39,7 @@
{ {
"directoryIndex" : 0, "directoryIndex" : 0,
"id" : "Raytracer::@6890427a1f51a3e7e1df", "id" : "Raytracer::@6890427a1f51a3e7e1df",
"jsonFile" : "target-Raytracer-Debug-de18b889ec06b3c1ffd0.json", "jsonFile" : "target-Raytracer-Debug-53e51d7b7c539400eaa2.json",
"name" : "Raytracer", "name" : "Raytracer",
"projectIndex" : 0 "projectIndex" : 0
} }

View File

@@ -26,7 +26,7 @@
"objects" : "objects" :
[ [
{ {
"jsonFile" : "codemodel-v2-3325df503f174f7a816b.json", "jsonFile" : "codemodel-v2-f57fe542ed13663d4779.json",
"kind" : "codemodel", "kind" : "codemodel",
"version" : "version" :
{ {
@@ -99,7 +99,7 @@
} }
}, },
{ {
"jsonFile" : "codemodel-v2-3325df503f174f7a816b.json", "jsonFile" : "codemodel-v2-f57fe542ed13663d4779.json",
"kind" : "codemodel", "kind" : "codemodel",
"version" : "version" :
{ {

View File

@@ -90,7 +90,9 @@
7, 7,
8, 8,
9, 9,
10 10,
11,
12
] ]
} }
], ],
@@ -102,6 +104,16 @@
"path" : "ImageGenerator.cpp", "path" : "ImageGenerator.cpp",
"sourceGroupIndex" : 0 "sourceGroupIndex" : 0
}, },
{
"backtrace" : 1,
"path" : "aabb.h",
"sourceGroupIndex" : 1
},
{
"backtrace" : 1,
"path" : "bvh.h",
"sourceGroupIndex" : 1
},
{ {
"backtrace" : 1, "backtrace" : 1,
"path" : "camera.h", "path" : "camera.h",

View File

@@ -195,11 +195,18 @@ CMakeFiles/Raytracer.dir/ImageGenerator.cpp.o: \
/home/cjsatnarine/Code/Raytracer/interval.h \ /home/cjsatnarine/Code/Raytracer/interval.h \
/home/cjsatnarine/Code/Raytracer/vec3.h \ /home/cjsatnarine/Code/Raytracer/vec3.h \
/home/cjsatnarine/Code/Raytracer/ray.h \ /home/cjsatnarine/Code/Raytracer/ray.h \
/home/cjsatnarine/Code/Raytracer/camera.h \ /home/cjsatnarine/Code/Raytracer/bvh.h \
/home/cjsatnarine/Code/Raytracer/aabb.h /usr/include/c++/13/algorithm \
/usr/include/c++/13/bits/stl_algo.h \
/usr/include/c++/13/bits/algorithmfwd.h \
/usr/include/c++/13/bits/stl_heap.h \
/usr/include/c++/13/bits/uniform_int_dist.h \
/usr/include/c++/13/pstl/glue_algorithm_defs.h \
/home/cjsatnarine/Code/Raytracer/hittable.h \ /home/cjsatnarine/Code/Raytracer/hittable.h \
/home/cjsatnarine/Code/Raytracer/material.h \
/home/cjsatnarine/Code/Raytracer/hittableList.h \ /home/cjsatnarine/Code/Raytracer/hittableList.h \
/usr/include/c++/13/vector /usr/include/c++/13/bits/stl_vector.h \ /usr/include/c++/13/vector /usr/include/c++/13/bits/stl_vector.h \
/usr/include/c++/13/bits/stl_bvector.h \ /usr/include/c++/13/bits/stl_bvector.h \
/usr/include/c++/13/bits/vector.tcc \ /usr/include/c++/13/bits/vector.tcc \
/home/cjsatnarine/Code/Raytracer/camera.h \
/home/cjsatnarine/Code/Raytracer/material.h \
/home/cjsatnarine/Code/Raytracer/sphere.h /home/cjsatnarine/Code/Raytracer/sphere.h

View File

@@ -3,6 +3,8 @@
CMakeFiles/Raytracer.dir/ImageGenerator.cpp.o CMakeFiles/Raytracer.dir/ImageGenerator.cpp.o
/home/cjsatnarine/Code/Raytracer/ImageGenerator.cpp /home/cjsatnarine/Code/Raytracer/ImageGenerator.cpp
/home/cjsatnarine/Code/Raytracer/aabb.h
/home/cjsatnarine/Code/Raytracer/bvh.h
/home/cjsatnarine/Code/Raytracer/camera.h /home/cjsatnarine/Code/Raytracer/camera.h
/home/cjsatnarine/Code/Raytracer/colour.h /home/cjsatnarine/Code/Raytracer/colour.h
/home/cjsatnarine/Code/Raytracer/hittable.h /home/cjsatnarine/Code/Raytracer/hittable.h
@@ -16,9 +18,11 @@ CMakeFiles/Raytracer.dir/ImageGenerator.cpp.o
/usr/include/alloca.h /usr/include/alloca.h
/usr/include/asm-generic/errno-base.h /usr/include/asm-generic/errno-base.h
/usr/include/asm-generic/errno.h /usr/include/asm-generic/errno.h
/usr/include/c++/13/algorithm
/usr/include/c++/13/backward/auto_ptr.h /usr/include/c++/13/backward/auto_ptr.h
/usr/include/c++/13/backward/binders.h /usr/include/c++/13/backward/binders.h
/usr/include/c++/13/bit /usr/include/c++/13/bit
/usr/include/c++/13/bits/algorithmfwd.h
/usr/include/c++/13/bits/align.h /usr/include/c++/13/bits/align.h
/usr/include/c++/13/bits/alloc_traits.h /usr/include/c++/13/bits/alloc_traits.h
/usr/include/c++/13/bits/allocated_ptr.h /usr/include/c++/13/bits/allocated_ptr.h
@@ -67,10 +71,12 @@ CMakeFiles/Raytracer.dir/ImageGenerator.cpp.o
/usr/include/c++/13/bits/shared_ptr_base.h /usr/include/c++/13/bits/shared_ptr_base.h
/usr/include/c++/13/bits/specfun.h /usr/include/c++/13/bits/specfun.h
/usr/include/c++/13/bits/std_abs.h /usr/include/c++/13/bits/std_abs.h
/usr/include/c++/13/bits/stl_algo.h
/usr/include/c++/13/bits/stl_algobase.h /usr/include/c++/13/bits/stl_algobase.h
/usr/include/c++/13/bits/stl_bvector.h /usr/include/c++/13/bits/stl_bvector.h
/usr/include/c++/13/bits/stl_construct.h /usr/include/c++/13/bits/stl_construct.h
/usr/include/c++/13/bits/stl_function.h /usr/include/c++/13/bits/stl_function.h
/usr/include/c++/13/bits/stl_heap.h
/usr/include/c++/13/bits/stl_iterator.h /usr/include/c++/13/bits/stl_iterator.h
/usr/include/c++/13/bits/stl_iterator_base_funcs.h /usr/include/c++/13/bits/stl_iterator_base_funcs.h
/usr/include/c++/13/bits/stl_iterator_base_types.h /usr/include/c++/13/bits/stl_iterator_base_types.h
@@ -83,6 +89,7 @@ CMakeFiles/Raytracer.dir/ImageGenerator.cpp.o
/usr/include/c++/13/bits/streambuf_iterator.h /usr/include/c++/13/bits/streambuf_iterator.h
/usr/include/c++/13/bits/string_view.tcc /usr/include/c++/13/bits/string_view.tcc
/usr/include/c++/13/bits/stringfwd.h /usr/include/c++/13/bits/stringfwd.h
/usr/include/c++/13/bits/uniform_int_dist.h
/usr/include/c++/13/bits/unique_ptr.h /usr/include/c++/13/bits/unique_ptr.h
/usr/include/c++/13/bits/uses_allocator.h /usr/include/c++/13/bits/uses_allocator.h
/usr/include/c++/13/bits/uses_allocator_args.h /usr/include/c++/13/bits/uses_allocator_args.h
@@ -117,6 +124,7 @@ CMakeFiles/Raytracer.dir/ImageGenerator.cpp.o
/usr/include/c++/13/new /usr/include/c++/13/new
/usr/include/c++/13/ostream /usr/include/c++/13/ostream
/usr/include/c++/13/pstl/execution_defs.h /usr/include/c++/13/pstl/execution_defs.h
/usr/include/c++/13/pstl/glue_algorithm_defs.h
/usr/include/c++/13/pstl/glue_memory_defs.h /usr/include/c++/13/pstl/glue_memory_defs.h
/usr/include/c++/13/pstl/pstl_config.h /usr/include/c++/13/pstl/pstl_config.h
/usr/include/c++/13/stdexcept /usr/include/c++/13/stdexcept

View File

@@ -2,6 +2,8 @@
# Generated by "Unix Makefiles" Generator, CMake Version 3.28 # Generated by "Unix Makefiles" Generator, CMake Version 3.28
CMakeFiles/Raytracer.dir/ImageGenerator.cpp.o: /home/cjsatnarine/Code/Raytracer/ImageGenerator.cpp \ CMakeFiles/Raytracer.dir/ImageGenerator.cpp.o: /home/cjsatnarine/Code/Raytracer/ImageGenerator.cpp \
/home/cjsatnarine/Code/Raytracer/aabb.h \
/home/cjsatnarine/Code/Raytracer/bvh.h \
/home/cjsatnarine/Code/Raytracer/camera.h \ /home/cjsatnarine/Code/Raytracer/camera.h \
/home/cjsatnarine/Code/Raytracer/colour.h \ /home/cjsatnarine/Code/Raytracer/colour.h \
/home/cjsatnarine/Code/Raytracer/hittable.h \ /home/cjsatnarine/Code/Raytracer/hittable.h \
@@ -15,9 +17,11 @@ CMakeFiles/Raytracer.dir/ImageGenerator.cpp.o: /home/cjsatnarine/Code/Raytracer/
/usr/include/alloca.h \ /usr/include/alloca.h \
/usr/include/asm-generic/errno-base.h \ /usr/include/asm-generic/errno-base.h \
/usr/include/asm-generic/errno.h \ /usr/include/asm-generic/errno.h \
/usr/include/c++/13/algorithm \
/usr/include/c++/13/backward/auto_ptr.h \ /usr/include/c++/13/backward/auto_ptr.h \
/usr/include/c++/13/backward/binders.h \ /usr/include/c++/13/backward/binders.h \
/usr/include/c++/13/bit \ /usr/include/c++/13/bit \
/usr/include/c++/13/bits/algorithmfwd.h \
/usr/include/c++/13/bits/align.h \ /usr/include/c++/13/bits/align.h \
/usr/include/c++/13/bits/alloc_traits.h \ /usr/include/c++/13/bits/alloc_traits.h \
/usr/include/c++/13/bits/allocated_ptr.h \ /usr/include/c++/13/bits/allocated_ptr.h \
@@ -66,10 +70,12 @@ CMakeFiles/Raytracer.dir/ImageGenerator.cpp.o: /home/cjsatnarine/Code/Raytracer/
/usr/include/c++/13/bits/shared_ptr_base.h \ /usr/include/c++/13/bits/shared_ptr_base.h \
/usr/include/c++/13/bits/specfun.h \ /usr/include/c++/13/bits/specfun.h \
/usr/include/c++/13/bits/std_abs.h \ /usr/include/c++/13/bits/std_abs.h \
/usr/include/c++/13/bits/stl_algo.h \
/usr/include/c++/13/bits/stl_algobase.h \ /usr/include/c++/13/bits/stl_algobase.h \
/usr/include/c++/13/bits/stl_bvector.h \ /usr/include/c++/13/bits/stl_bvector.h \
/usr/include/c++/13/bits/stl_construct.h \ /usr/include/c++/13/bits/stl_construct.h \
/usr/include/c++/13/bits/stl_function.h \ /usr/include/c++/13/bits/stl_function.h \
/usr/include/c++/13/bits/stl_heap.h \
/usr/include/c++/13/bits/stl_iterator.h \ /usr/include/c++/13/bits/stl_iterator.h \
/usr/include/c++/13/bits/stl_iterator_base_funcs.h \ /usr/include/c++/13/bits/stl_iterator_base_funcs.h \
/usr/include/c++/13/bits/stl_iterator_base_types.h \ /usr/include/c++/13/bits/stl_iterator_base_types.h \
@@ -82,6 +88,7 @@ CMakeFiles/Raytracer.dir/ImageGenerator.cpp.o: /home/cjsatnarine/Code/Raytracer/
/usr/include/c++/13/bits/streambuf_iterator.h \ /usr/include/c++/13/bits/streambuf_iterator.h \
/usr/include/c++/13/bits/string_view.tcc \ /usr/include/c++/13/bits/string_view.tcc \
/usr/include/c++/13/bits/stringfwd.h \ /usr/include/c++/13/bits/stringfwd.h \
/usr/include/c++/13/bits/uniform_int_dist.h \
/usr/include/c++/13/bits/unique_ptr.h \ /usr/include/c++/13/bits/unique_ptr.h \
/usr/include/c++/13/bits/uses_allocator.h \ /usr/include/c++/13/bits/uses_allocator.h \
/usr/include/c++/13/bits/uses_allocator_args.h \ /usr/include/c++/13/bits/uses_allocator_args.h \
@@ -116,6 +123,7 @@ CMakeFiles/Raytracer.dir/ImageGenerator.cpp.o: /home/cjsatnarine/Code/Raytracer/
/usr/include/c++/13/new \ /usr/include/c++/13/new \
/usr/include/c++/13/ostream \ /usr/include/c++/13/ostream \
/usr/include/c++/13/pstl/execution_defs.h \ /usr/include/c++/13/pstl/execution_defs.h \
/usr/include/c++/13/pstl/glue_algorithm_defs.h \
/usr/include/c++/13/pstl/glue_memory_defs.h \ /usr/include/c++/13/pstl/glue_memory_defs.h \
/usr/include/c++/13/pstl/pstl_config.h \ /usr/include/c++/13/pstl/pstl_config.h \
/usr/include/c++/13/stdexcept \ /usr/include/c++/13/stdexcept \
@@ -325,8 +333,6 @@ CMakeFiles/Raytracer.dir/ImageGenerator.cpp.o: /home/cjsatnarine/Code/Raytracer/
/usr/include/x86_64-linux-gnu/bits/iscanonical.h: /usr/include/x86_64-linux-gnu/bits/iscanonical.h:
/usr/include/x86_64-linux-gnu/bits/fp-logb.h:
/usr/include/x86_64-linux-gnu/bits/fp-fast.h: /usr/include/x86_64-linux-gnu/bits/fp-fast.h:
/usr/include/x86_64-linux-gnu/bits/types/wint_t.h: /usr/include/x86_64-linux-gnu/bits/types/wint_t.h:
@@ -385,13 +391,15 @@ CMakeFiles/Raytracer.dir/ImageGenerator.cpp.o: /home/cjsatnarine/Code/Raytracer/
/usr/include/c++/13/tr1/hypergeometric.tcc: /usr/include/c++/13/tr1/hypergeometric.tcc:
/usr/include/x86_64-linux-gnu/bits/types/__fpos_t.h: /usr/include/c++/13/tr1/exp_integral.tcc:
/usr/include/c++/13/bits/refwrap.h: /usr/include/c++/13/tr1/ell_integral.tcc:
/usr/include/c++/13/debug/debug.h: /usr/include/features-time64.h:
/usr/include/c++/13/stdexcept: /usr/include/c++/13/string_view:
/usr/include/c++/13/string:
/usr/include/c++/13/bits/ostream_insert.h: /usr/include/c++/13/bits/ostream_insert.h:
@@ -415,22 +423,10 @@ CMakeFiles/Raytracer.dir/ImageGenerator.cpp.o: /home/cjsatnarine/Code/Raytracer/
/usr/include/c++/13/bits/char_traits.h: /usr/include/c++/13/bits/char_traits.h:
/usr/include/x86_64-linux-gnu/bits/math-vector.h:
/usr/include/c++/13/bits/hash_bytes.h:
/usr/include/asm-generic/errno-base.h:
/usr/include/features-time64.h:
/usr/include/c++/13/string_view:
/usr/include/errno.h: /usr/include/errno.h:
/usr/include/c++/13/bits/functional_hash.h: /usr/include/c++/13/bits/functional_hash.h:
/usr/include/c++/13/bits/nested_exception.h:
/usr/include/c++/13/bits/istream.tcc: /usr/include/c++/13/bits/istream.tcc:
/usr/include/c++/13/bits/exception_ptr.h: /usr/include/c++/13/bits/exception_ptr.h:
@@ -465,8 +461,52 @@ CMakeFiles/Raytracer.dir/ImageGenerator.cpp.o: /home/cjsatnarine/Code/Raytracer/
/usr/include/alloca.h: /usr/include/alloca.h:
/usr/include/x86_64-linux-gnu/bits/endianness.h:
/usr/include/c++/13/tr1/poly_laguerre.tcc:
/usr/include/c++/13/bits/basic_string.h:
/usr/include/c++/13/bits/specfun.h:
/home/cjsatnarine/Code/Raytracer/rayTracer.h: /home/cjsatnarine/Code/Raytracer/rayTracer.h:
/usr/include/c++/13/bits/cxxabi_forced.h:
/home/cjsatnarine/Code/Raytracer/vec3.h:
/home/cjsatnarine/Code/Raytracer/colour.h:
/home/cjsatnarine/Code/Raytracer/hittable.h:
/usr/include/c++/13/backward/binders.h:
/home/cjsatnarine/Code/Raytracer/aabb.h:
/usr/include/x86_64-linux-gnu/bits/waitflags.h:
/usr/include/c++/13/bits/unique_ptr.h:
/usr/include/c++/13/bits/align.h:
/usr/include/c++/13/bits/nested_exception.h:
/home/cjsatnarine/Code/Raytracer/bvh.h:
/usr/include/c++/13/bits/ostream.tcc:
/usr/include/x86_64-linux-gnu/c++/13/bits/c++config.h:
/usr/include/c++/13/bits/ios_base.h:
/home/cjsatnarine/Code/Raytracer/ImageGenerator.cpp:
/usr/include/asm-generic/errno-base.h:
/usr/include/x86_64-linux-gnu/bits/math-vector.h:
/usr/include/c++/13/bits/hash_bytes.h:
/usr/include/c++/13/cwctype: /usr/include/c++/13/cwctype:
/usr/include/c++/13/bits/predefined_ops.h: /usr/include/c++/13/bits/predefined_ops.h:
@@ -477,31 +517,15 @@ CMakeFiles/Raytracer.dir/ImageGenerator.cpp.o: /home/cjsatnarine/Code/Raytracer/
/usr/include/c++/13/cwchar: /usr/include/c++/13/cwchar:
/usr/include/c++/13/bits/cxxabi_forced.h: /usr/include/c++/13/algorithm:
/home/cjsatnarine/Code/Raytracer/vec3.h: /usr/include/x86_64-linux-gnu/bits/types/error_t.h:
/home/cjsatnarine/Code/Raytracer/colour.h: /usr/include/x86_64-linux-gnu/bits/mathcalls-helper-functions.h:
/usr/include/x86_64-linux-gnu/bits/waitflags.h: /home/cjsatnarine/Code/Raytracer/ray.h:
/usr/include/c++/13/bits/align.h: /usr/include/c++/13/bits/stl_raw_storage_iter.h:
/usr/include/c++/13/bits/unique_ptr.h:
/home/cjsatnarine/Code/Raytracer/hittable.h:
/usr/include/c++/13/backward/binders.h:
/usr/include/c++/13/bits/stringfwd.h:
/usr/include/c++/13/bits/ostream.tcc:
/usr/include/x86_64-linux-gnu/c++/13/bits/c++config.h:
/usr/include/c++/13/bits/ios_base.h:
/home/cjsatnarine/Code/Raytracer/ImageGenerator.cpp:
/usr/include/c++/13/backward/auto_ptr.h: /usr/include/c++/13/backward/auto_ptr.h:
@@ -509,8 +533,26 @@ CMakeFiles/Raytracer.dir/ImageGenerator.cpp.o: /home/cjsatnarine/Code/Raytracer/
/usr/include/c++/13/bit: /usr/include/c++/13/bit:
/usr/include/x86_64-linux-gnu/bits/time64.h:
/usr/include/c++/13/bits/basic_ios.h:
/usr/include/c++/13/tr1/bessel_function.tcc:
/usr/include/c++/13/bits/shared_ptr_base.h:
/usr/include/x86_64-linux-gnu/bits/pthreadtypes-arch.h:
/usr/include/locale.h:
/usr/include/c++/13/ext/aligned_buffer.h:
/usr/include/c++/13/ios: /usr/include/c++/13/ios:
/usr/include/x86_64-linux-gnu/bits/fp-logb.h:
/usr/include/c++/13/bits/algorithmfwd.h:
/usr/include/c++/13/bits/concept_check.h: /usr/include/c++/13/bits/concept_check.h:
/usr/include/c++/13/bits/alloc_traits.h: /usr/include/c++/13/bits/alloc_traits.h:
@@ -525,30 +567,26 @@ CMakeFiles/Raytracer.dir/ImageGenerator.cpp.o: /home/cjsatnarine/Code/Raytracer/
/usr/include/c++/13/bits/atomic_lockfree_defines.h: /usr/include/c++/13/bits/atomic_lockfree_defines.h:
/usr/include/x86_64-linux-gnu/bits/time64.h:
/usr/include/c++/13/bits/basic_ios.h:
/usr/include/x86_64-linux-gnu/bits/pthreadtypes-arch.h:
/usr/include/locale.h:
/usr/include/c++/13/ext/aligned_buffer.h:
/usr/include/x86_64-linux-gnu/bits/endianness.h:
/usr/include/c++/13/tr1/poly_laguerre.tcc:
/usr/include/c++/13/bits/basic_string.h:
/usr/include/c++/13/bits/specfun.h:
/usr/include/x86_64-linux-gnu/c++/13/bits/os_defines.h: /usr/include/x86_64-linux-gnu/c++/13/bits/os_defines.h:
/usr/include/x86_64-linux-gnu/c++/13/bits/c++locale.h: /usr/include/x86_64-linux-gnu/c++/13/bits/c++locale.h:
/usr/include/c++/13/bits/ptr_traits.h: /usr/include/c++/13/bits/ptr_traits.h:
/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h:
/usr/include/c++/13/system_error:
/usr/include/c++/13/bits/range_access.h:
/usr/include/c++/13/debug/debug.h:
/usr/include/c++/13/stdexcept:
/usr/include/x86_64-linux-gnu/bits/types/__fpos_t.h:
/usr/include/c++/13/bits/refwrap.h:
/usr/include/c++/13/bits/locale_facets.tcc: /usr/include/c++/13/bits/locale_facets.tcc:
/usr/include/c++/13/bits/requires_hosted.h: /usr/include/c++/13/bits/requires_hosted.h:
@@ -559,8 +597,18 @@ CMakeFiles/Raytracer.dir/ImageGenerator.cpp.o: /home/cjsatnarine/Code/Raytracer/
/usr/include/c++/13/bits/shared_ptr.h: /usr/include/c++/13/bits/shared_ptr.h:
/usr/include/c++/13/bits/stringfwd.h:
/usr/include/c++/13/bits/uniform_int_dist.h:
/usr/include/c++/13/bits/shared_ptr_atomic.h: /usr/include/c++/13/bits/shared_ptr_atomic.h:
/usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h:
/usr/include/c++/13/cstddef:
/usr/include/c++/13/bits/stl_algo.h:
/usr/include/c++/13/bits/stl_algobase.h: /usr/include/c++/13/bits/stl_algobase.h:
/usr/include/c++/13/bits/allocator.h: /usr/include/c++/13/bits/allocator.h:
@@ -569,6 +617,12 @@ CMakeFiles/Raytracer.dir/ImageGenerator.cpp.o: /home/cjsatnarine/Code/Raytracer/
/usr/include/c++/13/bits/stl_construct.h: /usr/include/c++/13/bits/stl_construct.h:
/usr/include/c++/13/bits/stl_heap.h:
/usr/include/c++/13/ext/alloc_traits.h:
/usr/include/c++/13/new:
/usr/include/x86_64-linux-gnu/bits/libc-header-start.h: /usr/include/x86_64-linux-gnu/bits/libc-header-start.h:
/home/cjsatnarine/Code/Raytracer/material.h: /home/cjsatnarine/Code/Raytracer/material.h:
@@ -577,22 +631,12 @@ CMakeFiles/Raytracer.dir/ImageGenerator.cpp.o: /home/cjsatnarine/Code/Raytracer/
/usr/include/c++/13/bits/stl_iterator.h: /usr/include/c++/13/bits/stl_iterator.h:
/usr/include/c++/13/string:
/usr/include/asm-generic/errno.h: /usr/include/asm-generic/errno.h:
/usr/include/c++/13/bits/stl_iterator_base_funcs.h: /usr/include/c++/13/bits/stl_iterator_base_funcs.h:
/usr/include/c++/13/bits/stl_iterator_base_types.h: /usr/include/c++/13/bits/stl_iterator_base_types.h:
/usr/include/x86_64-linux-gnu/bits/types/error_t.h:
/usr/include/x86_64-linux-gnu/bits/mathcalls-helper-functions.h:
/home/cjsatnarine/Code/Raytracer/ray.h:
/usr/include/c++/13/bits/stl_raw_storage_iter.h:
/usr/include/x86_64-linux-gnu/bits/types/struct___jmp_buf_tag.h: /usr/include/x86_64-linux-gnu/bits/types/struct___jmp_buf_tag.h:
/usr/include/c++/13/bits/stl_tempbuf.h: /usr/include/c++/13/bits/stl_tempbuf.h:
@@ -635,10 +679,10 @@ CMakeFiles/Raytracer.dir/ImageGenerator.cpp.o: /home/cjsatnarine/Code/Raytracer/
/usr/include/c++/13/bits/uses_allocator_args.h: /usr/include/c++/13/bits/uses_allocator_args.h:
/usr/include/c++/13/bits/stl_function.h:
/usr/include/c++/13/tr1/beta_function.tcc: /usr/include/c++/13/tr1/beta_function.tcc:
/usr/include/c++/13/bits/stl_function.h:
/usr/include/c++/13/bits/utility.h: /usr/include/c++/13/bits/utility.h:
/home/cjsatnarine/Code/Raytracer/hittableList.h: /home/cjsatnarine/Code/Raytracer/hittableList.h:
@@ -665,10 +709,6 @@ CMakeFiles/Raytracer.dir/ImageGenerator.cpp.o: /home/cjsatnarine/Code/Raytracer/
/usr/include/c++/13/ostream: /usr/include/c++/13/ostream:
/usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h:
/usr/include/c++/13/cstddef:
/usr/include/x86_64-linux-gnu/bits/types/struct_FILE.h: /usr/include/x86_64-linux-gnu/bits/types/struct_FILE.h:
/usr/include/c++/13/bits/stl_pair.h: /usr/include/c++/13/bits/stl_pair.h:
@@ -683,7 +723,11 @@ CMakeFiles/Raytracer.dir/ImageGenerator.cpp.o: /home/cjsatnarine/Code/Raytracer/
/usr/include/c++/13/debug/assertions.h: /usr/include/c++/13/debug/assertions.h:
/usr/include/c++/13/ext/concurrence.h: /usr/include/c++/13/tr1/gamma.tcc:
/usr/include/c++/13/cctype:
/usr/include/c++/13/ext/atomicity.h:
/usr/include/x86_64-linux-gnu/bits/types/sigset_t.h: /usr/include/x86_64-linux-gnu/bits/types/sigset_t.h:
@@ -707,36 +751,16 @@ CMakeFiles/Raytracer.dir/ImageGenerator.cpp.o: /home/cjsatnarine/Code/Raytracer/
/usr/include/c++/13/limits: /usr/include/c++/13/limits:
/usr/include/c++/13/ext/alloc_traits.h:
/usr/include/c++/13/new:
/usr/include/x86_64-linux-gnu/c++/13/bits/gthr.h: /usr/include/x86_64-linux-gnu/c++/13/bits/gthr.h:
/usr/include/c++/13/bits/basic_ios.tcc: /usr/include/c++/13/bits/basic_ios.tcc:
/usr/include/c++/13/pstl/execution_defs.h: /usr/include/c++/13/pstl/execution_defs.h:
/usr/include/c++/13/ext/concurrence.h:
/usr/include/c++/13/pstl/glue_algorithm_defs.h:
/usr/include/x86_64-linux-gnu/bits/wordsize.h: /usr/include/x86_64-linux-gnu/bits/wordsize.h:
/usr/include/c++/13/pstl/pstl_config.h: /usr/include/c++/13/pstl/pstl_config.h:
/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h:
/usr/include/c++/13/bits/range_access.h:
/usr/include/c++/13/system_error:
/usr/include/c++/13/bits/shared_ptr_base.h:
/usr/include/c++/13/tr1/bessel_function.tcc:
/usr/include/c++/13/tr1/exp_integral.tcc:
/usr/include/c++/13/tr1/ell_integral.tcc:
/usr/include/c++/13/cctype:
/usr/include/c++/13/ext/atomicity.h:
/usr/include/c++/13/tr1/gamma.tcc:

Binary file not shown.

76
bvh.h Normal file
View File

@@ -0,0 +1,76 @@
#ifndef BVH_H
#define BVH_H
#include "aabb.h"
#include <algorithm>
#include "hittable.h"
#include "hittableList.h"
#include "rayTracer.h"
class bvh_node : public hittable {
public:
bvh_node(hittableList list) : bvh_node(list.objects, 0, list.objects.size()) {
// This constructor (without span indices) creates an implicit copy of the hittable list, which we will modify. The lifetime of the copied list only extends until this constructor exits.
}
bvh_node(std::vector<shared_ptr<hittable>>& objects, size_t start, size_t end) {
int axis = randomInt(0,2);
auto comparator = (axis == 0) ? boxXCompare
: (axis == 1) ? boxYCompare
: boxZCompare;
size_t object_span = end - start;
if (object_span == 1) {
left = right = objects[start];
} else if (object_span == 2) {
left = objects[start];
right = objects[start+1];
} else {
std::sort(objects.begin() + start, objects.begin() + end, comparator);
auto mid = start + object_span / 2;
left = make_shared<bvh_node>(objects, start, mid);
right = make_shared<bvh_node>(objects, mid, end);
}
bBox = aabb(left->boundingBox(), right->boundingBox());
}
bool hit(const ray& r, interval ray_t, hitRecord& rec) const override {
if (!bBox.hit(r, ray_t)) return false;
bool hitLeft = left->hit(r, ray_t, rec);
bool hitRight = right->hit(r, interval(ray_t.min, hitLeft ? rec.t : ray_t.max), rec);
return hitLeft || hitRight;
}
aabb boundingBox() const override { return bBox; }
private:
shared_ptr<hittable> left;
shared_ptr<hittable> right;
aabb bBox;
static bool boxCompare(const shared_ptr<hittable> a, const shared_ptr<hittable> b, int axisIndex) {
auto aAxisInterval = a->boundingBox().axisInterval(axisIndex);
auto bAxisInterval = b->boundingBox().axisInterval(axisIndex);
return aAxisInterval.min < bAxisInterval.min;
}
static bool boxXCompare(const shared_ptr<hittable> a, const shared_ptr<hittable> b) {
return boxCompare(a, b, 0);
}
static bool boxYCompare(const shared_ptr<hittable> a, const shared_ptr<hittable> b) {
return boxCompare(a, b, 1);
}
static bool boxZCompare(const shared_ptr<hittable> a, const shared_ptr<hittable> b) {
return boxCompare(a, b, 2);
}
};
#endif

View File

@@ -2,6 +2,7 @@
#define HITTABLE_H #define HITTABLE_H
#include "rayTracer.h" #include "rayTracer.h"
#include "aabb.h"
class material; class material;
@@ -29,6 +30,8 @@ class hittable {
virtual ~hittable() = default; virtual ~hittable() = default;
virtual bool hit(const ray& r, interval rayT, hitRecord& rec) const = 0; virtual bool hit(const ray& r, interval rayT, hitRecord& rec) const = 0;
virtual aabb boundingBox() const = 0;
}; };
#endif #endif

View File

@@ -1,11 +1,15 @@
#ifndef HITTABLE_LIST_H #ifndef HITTABLE_LIST_H
#define HITTABLE_LIST_H #define HITTABLE_LIST_H
#include "aabb.h"
#include "hittable.h" #include "hittable.h"
#include "rayTracer.h" #include "rayTracer.h"
#include <vector> #include <vector>
class hittableList : public hittable { class hittableList : public hittable {
private:
aabb bBox;
public: public:
std::vector<shared_ptr<hittable>> objects; std::vector<shared_ptr<hittable>> objects;
@@ -20,6 +24,7 @@ class hittableList : public hittable {
void add(shared_ptr<hittable> object) { void add(shared_ptr<hittable> object) {
objects.push_back(object); objects.push_back(object);
bBox = aabb(bBox, object->boundingBox());
} }
bool hit (const ray& r, interval rayT, hitRecord& rec) const override { bool hit (const ray& r, interval rayT, hitRecord& rec) const override {
@@ -38,6 +43,10 @@ class hittableList : public hittable {
return hitAnything; return hitAnything;
} }
aabb boundingBox() const override {
return bBox;
}
}; };
#endif #endif

433144
image.ppm

File diff suppressed because it is too large Load Diff

View File

@@ -12,6 +12,12 @@ class interval {
interval(double min, double max) : min(min), max(max) {} interval(double min, double max) : min(min), max(max) {}
interval(const interval& a, const interval& b) {
// Create the interval tightly enclosing the two input intervals.
min = a.min <= b.min ? a.min : b.min;
max = a.max >= b.max ? a.max : b.max;
}
double size() const { double size() const {
return max - min; return max - min;
} }
@@ -30,6 +36,11 @@ class interval {
return x; return x;
} }
interval expand(double delta) const {
auto padding = delta / 2;
return interval(min - padding, max + padding);
}
static const interval empty, universe; static const interval empty, universe;
}; };

View File

@@ -40,6 +40,11 @@ inline double randomDouble(double min, double max) {
return min + (max - min) * randomDouble(); return min + (max - min) * randomDouble();
} }
inline int randomInt(int min, int max) {
// Returns a random integer in [min, max].
return int(randomDouble(min, max++));
}
// Common headers. // Common headers.
#include "colour.h" #include "colour.h"
#include "interval.h" #include "interval.h"

View File

@@ -11,6 +11,7 @@ class sphere : public hittable {
shared_ptr<material> mat; shared_ptr<material> mat;
bool isMoving; bool isMoving;
vec3 centreVec; vec3 centreVec;
aabb bBox;
point3 sphereCentre(double time) const { point3 sphereCentre(double time) const {
// Linearly interpolate from centre1 to centre2 accoedingf to time, where t=0 yields centre1 and t=1 yields centre2. // Linearly interpolate from centre1 to centre2 accoedingf to time, where t=0 yields centre1 and t=1 yields centre2.
@@ -19,10 +20,18 @@ class sphere : public hittable {
public: public:
// Stationary sphere. // Stationary sphere.
sphere(const point3& centre, double radius, shared_ptr<material> mat) : centre1(centre), radius(fmax(0, radius)), mat(mat), isMoving(false) {} sphere(const point3& centre, double radius, shared_ptr<material> mat) : centre1(centre), radius(fmax(0, radius)), mat(mat), isMoving(false) {
auto rvec = vec3(radius, radius, radius);
bBox = aabb(centre1 - rvec, centre1 + rvec);
}
// Moving sphere. // Moving sphere.
sphere(const point3& centre1, const point3& centre2, double radius, shared_ptr<material> mat) : centre1(centre1), radius(fmax(0, radius)), mat(mat), isMoving(true) { sphere(const point3& centre1, const point3& centre2, double radius, shared_ptr<material> mat) : centre1(centre1), radius(fmax(0, radius)), mat(mat), isMoving(true) {
auto rvec = vec3(radius, radius, radius);
aabb box1(centre1 - rvec, centre1 + rvec);
aabb box2(centre2 - rvec, centre2 + rvec);
bBox = aabb(box1, box2);
centreVec = centre2 - centre1; centreVec = centre2 - centre1;
} }
@@ -59,6 +68,10 @@ class sphere : public hittable {
return true; return true;
} }
aabb boundingBox() const override {
return bBox;
}
}; };
#endif #endif