diff --git a/CMakeLists.txt b/CMakeLists.txt
index 162568b..6420001 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -73,6 +73,9 @@ set(headers
src/sceneStructs.h
src/preview.h
src/utilities.h
+
+ external/include/json.hpp
+ external/include/tiny_gltf.h
)
set(sources
@@ -110,6 +113,7 @@ source_group(Headers FILES ${headers})
source_group(Sources FILES ${sources})
source_group(imgui FILES ${imgui})
+#add_subdirectory(src/ImGui)
#add_subdirectory(stream_compaction) # TODO: uncomment if using your stream compaction
cuda_add_executable(${CMAKE_PROJECT_NAME} ${sources} ${headers} ${imgui})
diff --git a/Performance Analysis.xlsx b/Performance Analysis.xlsx
new file mode 100644
index 0000000..b77632b
Binary files /dev/null and b/Performance Analysis.xlsx differ
diff --git a/README.md b/README.md
index f044c82..4b41bd2 100644
--- a/README.md
+++ b/README.md
@@ -3,11 +3,116 @@ CUDA Denoiser For CUDA Path Tracer
**University of Pennsylvania, CIS 565: GPU Programming and Architecture, Project 4**
-* (TODO) YOUR NAME HERE
-* Tested on: (TODO) Windows 22, i7-2222 @ 2.22GHz 22GB, GTX 222 222MB (Moore 2222 Lab)
+* Saksham Nagpal
+ * [LinkedIn](https://www.linkedin.com/in/nagpalsaksham/)
+* Tested on: Windows 11 Home, AMD Ryzen 7 6800H Radeon @ 3.2GHz 16GB, NVIDIA GeForce RTX 3050 Ti Laptop GPU 4096MB
-### (TODO: Your README)
+## Summary
+This project is a CUDA-based denoiser integrated into my [CUDA Pathtracer](https://github.com/Saksham03/CUDA-Path-Tracer) and is an implementation of the paper [Edge-Avoiding A-Trous Wavelet Transform for fast Global Illumination Filtering](https://jo.dreggn.org/home/2010_atrous.pdf) by the authors Dammertz, Sewtz, Hanika, and Lensch. In summary, the A-Trous Wavelet Transform is essentially a smoothing filter guided by various geometry buffers (G-Buffers). The algorithm is extended to incorporate an edge stopping function based on the input g-buffers that allows successful elimination of noise while preserving sharp edges. I will briefly go over the implementation details followed by an evaluation of the algorithm's qualitative as well as quantitative performance.
-*DO NOT* leave the README to the last minute! It is a crucial part of the
-project, and we will not be able to grade you without a good README.
+
+## Table of Contents
+
+* [Visual Parity Analysis](#visual-h)
+ 1. [Are the results 'Visually Acceptable'?](#visual-1)
+ 2. [Effect of Filter Size](#visual-2)
+ 3. [Type of Scene](#visual-3)
+* [Performance Analysis](#perf-h)
+ 1. [Denoising Overhead](#perf-1)
+ 2. [Image Resolution](#perf-2)
+ 3. [Filter Size](#perf-3)
+
+
+# Visual Parity Analysis
+In this section, I compare the results of the A-Trous Wavelet Transform Denoiser with the 'ground-truth' path-traced renders. I go over how good the denoised renders look, and how various parameters can affect the same.
+
+
+## 1. Are the results 'Visually Acceptable'?
+In this section, I tabulate how _well_ the denoiser performs at 1/10th iterations as that of the path tracer. I use [this](https://www.textcompare.org/image/) visual diffing tool to generate the images in the last column. These images signify the per-pixel differencce between the images in the first two columns, where the magenta color signifies unmatched values. As seen from the results, we can make some deductions:
+1. Perfectly specular and diffuse materials are handled well by the denoising algorith.
+2. Perfectly refractive materials work well for the most part, but we get some loss in the detailing.
+3. Size of the light source also plays an important factor in generating good or bad visual parity.
+4. Meshes with albedo mapping do take a hit from this algorithm, since the approximated blur makes the lose quite a bit of detailing.
+
+
+| Pathtraced, 1000 iterations | Denoised, 100 iterations | Difference |
+|:--:|:--:|:--:|
+|  |  |  |
+|  |  |  |
+|  |  |  |
+
+| Pathtraced, 5000 iterations | Denoised, 500 iterations | Difference |
+|:--:|:--:|:--:|
+|  |  |  |
+
+Overall, in summary, I think the denoiser's results are extremely acceptable given that they are generated using only 1/10th iterations as that of the path tracer, and the loss in visual quality is a trade-off that we can afford against the increase in computation time (as a result of decrease in the number of iterations).
+
+
+## 2. Effect of Filter Size
+
+In this section, I try different sizes of the filter resolution and see how it affects the visual quality of the renders. As shown later in the [Performance Analysis](#perf-h) section, a larger filter size is naturally going to cause the denoiser to take longer to generate the final render. In addition to that, an increasing filter size also means increasing the range of influence from neighboring pixels on a particular pixel. This can have results we might or might not want. In the table below, at each filter size I note down the observations for the same and compare it with the previous iteration.
+
+| Filter Size | Resulting Render | Observation |
+|:--:|:--:|:--:|
+| None (Pathtraced) |
|Noisy render (100 iterations). To compare - visually notable features such as albedo mapping and refractive material.|
+| 8X8 |
| With a small filter, the effect is limited as the filter spans across very limited pixels. |
+| 16X16 |
| Effect a bit more pronounced than the previous filter size, yet effect is limited. |
+| 32X32 |
| Better clarity, however the albedo mapping seems to be getting too much blurred out. |
+| 64X64 |
| At the cost of clarity, we lose more detail on the refractive material and albedo mapping. |
+| 2048X2048 |
| Filter too large, albedos start bleeding over each other and refractive material loses a lot of detail. |
+
+
+## 3. Type of Scene
+
+|  |  |
+|:--:|:--:|
+| Larger light source, specular material | Smaller light source, refractive material |
+
+A quick look at the `difference` image from the two scenes (where `difference` highlights the per-pixel difference between path-traced image and its equivalent denoised render at 1/10th iterations) highlights the following observations:
+* Scenes with larger light sources get denoised better at fewer iterations. This is probably because during path tracing, more of our rays end up hitting the light source, and hence the denoiser has more useful data to work with. With smaller light sources, the path-traced image is going to have a lot of grainy spurious black spots. These will interfere when the denoiser's filter accounts them in the nieghbouring pixels while approximating a blur, and hence the final result will need a few more iterations to start looking visuallty acceptable.
+* Material types also affect the quality of the final render, since it is not only the light's interaction with the material itself that varies but also the way how the light is further reflected into the scene. Each material's BSDF reflects light rays differently into the scene, which gets factored in when the denoiser is approximating the edge-avoiding blur. We see the caustics in the second image having the most noisy output which supports our stated hypothesis.
+* The edges around the light source are also a good contributor to the image difference, which makes sense because of the potention 'bloom' effect that would happen during denoising. The negihbouring pixels from non-emitting sources will average out values from the pixels lying on the light source which will contribute abnormally higher rgb values due to the emissive property of the material.
+
+
+# Performance Analysis
+
+In this section, I take a look at some quantitative metrics that might help us dictate the performance of the denoiser in terms of its computational cost.
+
+
+## 1. Denoising Overhead
+The below image shows on a per-iteration basis that how much % of time we spend denoising VS path-tracing (the tests were performed on the cornell box scene named `cornell.txt` in the `scenes` directory and at a fixed filter size of 80x80):
+
+
+
+Since we perform denoising only at the very end, and that too only once, we see that it takes almost a constant chunk of time regardless of the number of iterations we spend path-tracing. Consequently, we spend lesser and lesser proportion of time denoising our final render. This deterministic nature of the denoiser can be useful in accurately accounting for its overhead in varying cases.
+
+
+## 2. Image Resolution
+
+The following graph depicts the trend followed by the time taken by the denoiser as a function of the resolution of the final render (the tests were performed on the cornell box scene named `cornell.txt` in the `scenes` directory and at a fixed filter size of 80x80):
+
+
+
+We see an exponential increase in the render time with the increase in the size of the resolution. While the exponential trend is an interesting revelation, the increase was nonetheless expected because a higher resolution means more pixels to approximate a blur for.
+
+For a better idea on how much fraction of the time we spend on path tracing VS denoising at various resolutions, I use a logarithmic scale to plot the said trend:
+
+
+
+It is interesting to note that although the scale for the computation time differs significantly for path tracing VS denoising, both follow a very similar increasing trend with respect to the resolution of the final render.
+
+
+## 3. Filter Size
+
+Finally, we take a look at how various filter sizes contribute to the runtime cost of the denoiser.The following tests were performed on the cornell box scene named `cornell.txt` in the `scenes` directory and at a fixed 1000 iterations for the path tracer:
+
+
+
+As expected, a larger filter size makes the denoising algorithm to take longer, since now each pixel needs to consider a much higher number of neighbouring pixels while approximating the edge-avoiding blur.
+
+Similar to the Image Resolution section, I plot the fraction of time spent path tracing VS denosing to visualize how much of a computational hit does the filter size cause:
+
+
+
+As can be seen from the above graph, we spend a larger and larger fraction of time denoising VS path tracing as the size of our filter increases.
diff --git a/assets/Avocado.bin b/assets/Avocado.bin
new file mode 100644
index 0000000..b98140c
Binary files /dev/null and b/assets/Avocado.bin differ
diff --git a/assets/Avocado.gltf b/assets/Avocado.gltf
new file mode 100644
index 0000000..55fcd95
--- /dev/null
+++ b/assets/Avocado.gltf
@@ -0,0 +1,155 @@
+{
+ "accessors": [
+ {
+ "bufferView": 0,
+ "componentType": 5126,
+ "count": 406,
+ "type": "VEC2"
+ },
+ {
+ "bufferView": 1,
+ "componentType": 5126,
+ "count": 406,
+ "type": "VEC3"
+ },
+ {
+ "bufferView": 2,
+ "componentType": 5126,
+ "count": 406,
+ "type": "VEC4"
+ },
+ {
+ "bufferView": 3,
+ "componentType": 5126,
+ "count": 406,
+ "type": "VEC3",
+ "max": [
+ 0.02128091,
+ 0.06284806,
+ 0.0138090011
+ ],
+ "min": [
+ -0.02128091,
+ -4.773855E-05,
+ -0.013809
+ ]
+ },
+ {
+ "bufferView": 4,
+ "componentType": 5123,
+ "count": 2046,
+ "type": "SCALAR"
+ }
+ ],
+ "asset": {
+ "generator": "glTF Tools for Unity",
+ "version": "2.0"
+ },
+ "bufferViews": [
+ {
+ "buffer": 0,
+ "byteLength": 3248
+ },
+ {
+ "buffer": 0,
+ "byteOffset": 3248,
+ "byteLength": 4872
+ },
+ {
+ "buffer": 0,
+ "byteOffset": 8120,
+ "byteLength": 6496
+ },
+ {
+ "buffer": 0,
+ "byteOffset": 14616,
+ "byteLength": 4872
+ },
+ {
+ "buffer": 0,
+ "byteOffset": 19488,
+ "byteLength": 4092
+ }
+ ],
+ "buffers": [
+ {
+ "uri": "Avocado.bin",
+ "byteLength": 23580
+ }
+ ],
+ "images": [
+ {
+ "uri": "Avocado_baseColor.png"
+ },
+ {
+ "uri": "Avocado_roughnessMetallic.png"
+ },
+ {
+ "uri": "Avocado_normal.png"
+ }
+ ],
+ "meshes": [
+ {
+ "primitives": [
+ {
+ "attributes": {
+ "TEXCOORD_0": 0,
+ "NORMAL": 1,
+ "TANGENT": 2,
+ "POSITION": 3
+ },
+ "indices": 4,
+ "material": 0
+ }
+ ],
+ "name": "Avocado"
+ }
+ ],
+ "materials": [
+ {
+ "pbrMetallicRoughness": {
+ "baseColorTexture": {
+ "index": 0
+ },
+ "metallicRoughnessTexture": {
+ "index": 1
+ }
+ },
+ "normalTexture": {
+ "index": 2
+ },
+ "name": "2256_Avocado_d"
+ }
+ ],
+ "nodes": [
+ {
+ "mesh": 0,
+ "rotation": [
+ 0.0,
+ 1.0,
+ 0.0,
+ 0.0
+ ],
+ "name": "Avocado"
+ }
+ ],
+ "scene": 0,
+ "scenes": [
+ {
+ "nodes": [
+ 0
+ ]
+ }
+ ],
+ "textures": [
+ {
+ "source": 0
+ },
+ {
+ "source": 1
+ },
+ {
+ "source": 2
+ }
+ ]
+}
\ No newline at end of file
diff --git a/assets/Avocado_baseColor.png b/assets/Avocado_baseColor.png
new file mode 100644
index 0000000..38630ed
Binary files /dev/null and b/assets/Avocado_baseColor.png differ
diff --git a/assets/Avocado_normal.png b/assets/Avocado_normal.png
new file mode 100644
index 0000000..73f90d5
Binary files /dev/null and b/assets/Avocado_normal.png differ
diff --git a/assets/Box.gltf b/assets/Box.gltf
new file mode 100644
index 0000000..7f603f0
--- /dev/null
+++ b/assets/Box.gltf
@@ -0,0 +1,142 @@
+{
+ "asset": {
+ "generator": "COLLADA2GLTF",
+ "version": "2.0"
+ },
+ "scene": 0,
+ "scenes": [
+ {
+ "nodes": [
+ 0
+ ]
+ }
+ ],
+ "nodes": [
+ {
+ "children": [
+ 1
+ ],
+ "matrix": [
+ 1.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ -1.0,
+ 0.0,
+ 0.0,
+ 1.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 1.0
+ ]
+ },
+ {
+ "mesh": 0
+ }
+ ],
+ "meshes": [
+ {
+ "primitives": [
+ {
+ "attributes": {
+ "NORMAL": 1,
+ "POSITION": 2
+ },
+ "indices": 0,
+ "mode": 4,
+ "material": 0
+ }
+ ],
+ "name": "Mesh"
+ }
+ ],
+ "accessors": [
+ {
+ "bufferView": 0,
+ "byteOffset": 0,
+ "componentType": 5123,
+ "count": 36,
+ "max": [
+ 23
+ ],
+ "min": [
+ 0
+ ],
+ "type": "SCALAR"
+ },
+ {
+ "bufferView": 1,
+ "byteOffset": 0,
+ "componentType": 5126,
+ "count": 24,
+ "max": [
+ 1.0,
+ 1.0,
+ 1.0
+ ],
+ "min": [
+ -1.0,
+ -1.0,
+ -1.0
+ ],
+ "type": "VEC3"
+ },
+ {
+ "bufferView": 1,
+ "byteOffset": 288,
+ "componentType": 5126,
+ "count": 24,
+ "max": [
+ 0.5,
+ 0.5,
+ 0.5
+ ],
+ "min": [
+ -0.5,
+ -0.5,
+ -0.5
+ ],
+ "type": "VEC3"
+ }
+ ],
+ "materials": [
+ {
+ "pbrMetallicRoughness": {
+ "baseColorFactor": [
+ 0.800000011920929,
+ 0.0,
+ 0.0,
+ 1.0
+ ],
+ "metallicFactor": 0.0
+ },
+ "name": "Red"
+ }
+ ],
+ "bufferViews": [
+ {
+ "buffer": 0,
+ "byteOffset": 576,
+ "byteLength": 72,
+ "target": 34963
+ },
+ {
+ "buffer": 0,
+ "byteOffset": 0,
+ "byteLength": 576,
+ "byteStride": 12,
+ "target": 34962
+ }
+ ],
+ "buffers": [
+ {
+ "byteLength": 648,
+ "uri": "Box0.bin"
+ }
+ ]
+}
diff --git a/assets/Box0.bin b/assets/Box0.bin
new file mode 100644
index 0000000..d7798ab
Binary files /dev/null and b/assets/Box0.bin differ
diff --git a/assets/Bunny.bin b/assets/Bunny.bin
new file mode 100644
index 0000000..0386d12
Binary files /dev/null and b/assets/Bunny.bin differ
diff --git a/assets/Bunny.gltf b/assets/Bunny.gltf
new file mode 100644
index 0000000..d14d291
--- /dev/null
+++ b/assets/Bunny.gltf
@@ -0,0 +1,152 @@
+{
+ "accessors": [
+ {
+ "bufferView": 1,
+ "componentType": 5126,
+ "count": 36218,
+ "max": [
+ 0.06100910156965256,
+ 0.1873210072517395,
+ 0.05879969894886017
+ ],
+ "min": [
+ -0.09468989819288254,
+ 0.03298740088939667,
+ -0.061873599886894226
+ ],
+ "type": "VEC3"
+ },
+ {
+ "bufferView": 1,
+ "byteOffset": 434616,
+ "componentType": 5126,
+ "count": 36218,
+ "max": [
+ 1.0,
+ 0.9999903440475464,
+ 0.9999992847442627
+ ],
+ "min": [
+ -0.9999505281448364,
+ -0.999995231628418,
+ -0.9999715685844421
+ ],
+ "type": "VEC3"
+ },
+ {
+ "bufferView": 0,
+ "componentType": 5125,
+ "count": 208353,
+ "type": "SCALAR"
+ }
+ ],
+ "asset": {
+ "extras": {
+ "author": "3D graphics 101 (https://sketchfab.com/3dgraphics)",
+ "license": "CC-BY-NC-4.0 (http://creativecommons.org/licenses/by-nc/4.0/)",
+ "source": "https://sketchfab.com/3d-models/stanford-bunny-zipper-reconstruction-6b197d03ba2447ba83ae94f64b908539",
+ "title": "Stanford Bunny (Zipper reconstruction)"
+ },
+ "generator": "Sketchfab-12.64.0",
+ "version": "2.0"
+ },
+ "bufferViews": [
+ {
+ "buffer": 0,
+ "byteLength": 833412,
+ "name": "floatBufferViews",
+ "target": 34963
+ },
+ {
+ "buffer": 0,
+ "byteLength": 869232,
+ "byteOffset": 833412,
+ "byteStride": 12,
+ "name": "floatBufferViews",
+ "target": 34962
+ }
+ ],
+ "buffers": [
+ {
+ "byteLength": 1702644,
+ "uri": "Bunny.bin"
+ }
+ ],
+ "materials": [
+ {
+ "doubleSided": true,
+ "name": "Scene_-_Root",
+ "pbrMetallicRoughness": {
+ "baseColorFactor": [
+ 0.5,
+ 0.5,
+ 0.5,
+ 1.0
+ ],
+ "metallicFactor": 0.0,
+ "roughnessFactor": 0.9
+ }
+ }
+ ],
+ "meshes": [
+ {
+ "name": "Object_0",
+ "primitives": [
+ {
+ "attributes": {
+ "NORMAL": 1,
+ "POSITION": 0
+ },
+ "indices": 2,
+ "material": 0,
+ "mode": 4
+ }
+ ]
+ }
+ ],
+ "nodes": [
+ {
+ "children": [
+ 1
+ ],
+ "matrix": [
+ 1.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 1.0,
+ 2.220446049250313e-16,
+ 0.0,
+ 0.0,
+ -2.220446049250313e-16,
+ 1.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 1.0
+ ],
+ "name": "Sketchfab_model"
+ },
+ {
+ "children": [
+ 2
+ ],
+ "name": "Geode"
+ },
+ {
+ "mesh": 0,
+ "name": "Object_2"
+ }
+ ],
+ "scene": 0,
+ "scenes": [
+ {
+ "name": "Sketchfab_Scene",
+ "nodes": [
+ 0
+ ]
+ }
+ ]
+}
diff --git a/assets/Dragon-20231011T150823Z-001.zip b/assets/Dragon-20231011T150823Z-001.zip
new file mode 100644
index 0000000..b6a46be
Binary files /dev/null and b/assets/Dragon-20231011T150823Z-001.zip differ
diff --git a/assets/Orange.bin b/assets/Orange.bin
new file mode 100644
index 0000000..e2b8b99
Binary files /dev/null and b/assets/Orange.bin differ
diff --git a/assets/Orange.gltf b/assets/Orange.gltf
new file mode 100644
index 0000000..1da7a35
--- /dev/null
+++ b/assets/Orange.gltf
@@ -0,0 +1,191 @@
+{
+ "accessors": [
+ {
+ "bufferView": 2,
+ "componentType": 5126,
+ "count": 592,
+ "max": [
+ 13.927929878234863,
+ 13.892550468444824,
+ 7.208002090454102
+ ],
+ "min": [
+ -13.868430137634277,
+ -13.88306999206543,
+ -13.88012981414795
+ ],
+ "type": "VEC3"
+ },
+ {
+ "bufferView": 2,
+ "byteOffset": 7104,
+ "componentType": 5126,
+ "count": 592,
+ "max": [
+ 0.9989652037620544,
+ 0.9990018010139465,
+ 0.9972373843193054
+ ],
+ "min": [
+ -0.9940516352653503,
+ -0.9990112781524658,
+ -0.9989686012268066
+ ],
+ "type": "VEC3"
+ },
+ {
+ "bufferView": 1,
+ "componentType": 5126,
+ "count": 592,
+ "max": [
+ 0.9950000047683716,
+ 0.9581609964370728
+ ],
+ "min": [
+ 0.004999999888241291,
+ 0.004999995231628418
+ ],
+ "type": "VEC2"
+ },
+ {
+ "bufferView": 0,
+ "componentType": 5125,
+ "count": 2760,
+ "type": "SCALAR"
+ }
+ ],
+ "asset": {
+ "extras": {
+ "author": "polyplant3d (https://sketchfab.com/polyplant3d)",
+ "license": "CC-BY-4.0 (http://creativecommons.org/licenses/by/4.0/)",
+ "source": "https://sketchfab.com/3d-models/orange-fruit-cbdf758f21924c168c1c3da1afed9754",
+ "title": "orange fruit"
+ },
+ "generator": "Sketchfab-12.68.0",
+ "version": "2.0"
+ },
+ "bufferViews": [
+ {
+ "buffer": 0,
+ "byteLength": 11040,
+ "name": "floatBufferViews",
+ "target": 34963
+ },
+ {
+ "buffer": 0,
+ "byteLength": 4736,
+ "byteOffset": 11040,
+ "byteStride": 8,
+ "name": "floatBufferViews",
+ "target": 34962
+ },
+ {
+ "buffer": 0,
+ "byteLength": 14208,
+ "byteOffset": 15776,
+ "byteStride": 12,
+ "name": "floatBufferViews",
+ "target": 34962
+ }
+ ],
+ "buffers": [
+ {
+ "byteLength": 29984,
+ "uri": "Orange.bin"
+ }
+ ],
+ "images": [
+ {
+ "uri": "orange_halb3DC_null_color_baseColor.jpeg"
+ }
+ ],
+ "materials": [
+ {
+ "doubleSided": true,
+ "name": "orange_halb3DC_null_color",
+ "pbrMetallicRoughness": {
+ "baseColorTexture": {
+ "index": 0
+ },
+ "metallicFactor": 0.0,
+ "roughnessFactor": 0.6
+ }
+ }
+ ],
+ "meshes": [
+ {
+ "name": "Object_0",
+ "primitives": [
+ {
+ "attributes": {
+ "NORMAL": 1,
+ "POSITION": 0,
+ "TEXCOORD_0": 2
+ },
+ "indices": 3,
+ "material": 0,
+ "mode": 4
+ }
+ ]
+ }
+ ],
+ "nodes": [
+ {
+ "children": [
+ 1
+ ],
+ "matrix": [
+ 1.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 2.220446049250313e-16,
+ -1.0,
+ 0.0,
+ 0.0,
+ 1.0,
+ 2.220446049250313e-16,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 1.0
+ ],
+ "name": "Sketchfab_model"
+ },
+ {
+ "children": [
+ 2
+ ],
+ "name": "sdsdfs.unity_1.obj.cleaner.gles"
+ },
+ {
+ "mesh": 0,
+ "name": "Object_2"
+ }
+ ],
+ "samplers": [
+ {
+ "magFilter": 9729,
+ "minFilter": 9987,
+ "wrapS": 10497,
+ "wrapT": 10497
+ }
+ ],
+ "scene": 0,
+ "scenes": [
+ {
+ "name": "Sketchfab_Scene",
+ "nodes": [
+ 0
+ ]
+ }
+ ],
+ "textures": [
+ {
+ "sampler": 0,
+ "source": 0
+ }
+ ]
+}
diff --git a/assets/Suzanne.bin b/assets/Suzanne.bin
new file mode 100644
index 0000000..60f54db
Binary files /dev/null and b/assets/Suzanne.bin differ
diff --git a/assets/Suzanne.gltf b/assets/Suzanne.gltf
new file mode 100644
index 0000000..5660784
--- /dev/null
+++ b/assets/Suzanne.gltf
@@ -0,0 +1,193 @@
+{
+ "accessors" : [
+ {
+ "bufferView" : 0,
+ "byteOffset" : 0,
+ "componentType" : 5123,
+ "count" : 11808,
+ "max" : [
+ 11807
+ ],
+ "min" : [
+ 0
+ ],
+ "type" : "SCALAR"
+ },
+ {
+ "bufferView" : 1,
+ "byteOffset" : 0,
+ "componentType" : 5126,
+ "count" : 11808,
+ "max" : [
+ 1.336914,
+ 0.950195,
+ 0.825684
+ ],
+ "min" : [
+ -1.336914,
+ -0.974609,
+ -0.800781
+ ],
+ "type" : "VEC3"
+ },
+ {
+ "bufferView" : 2,
+ "byteOffset" : 0,
+ "componentType" : 5126,
+ "count" : 11808,
+ "max" : [
+ 0.996339,
+ 0.999958,
+ 0.999929
+ ],
+ "min" : [
+ -0.996339,
+ -0.985940,
+ -0.999994
+ ],
+ "type" : "VEC3"
+ },
+ {
+ "bufferView" : 3,
+ "byteOffset" : 0,
+ "componentType" : 5126,
+ "count" : 11808,
+ "max" : [
+ 0.998570,
+ 0.999996,
+ 0.999487,
+ 1.000000
+ ],
+ "min" : [
+ -0.999233,
+ -0.999453,
+ -0.999812,
+ 1.000000
+ ],
+ "type" : "VEC4"
+ },
+ {
+ "bufferView" : 4,
+ "byteOffset" : 0,
+ "componentType" : 5126,
+ "count" : 11808,
+ "max" : [
+ 0.999884,
+ 0.884359
+ ],
+ "min" : [
+ 0.000116,
+ 0.000116
+ ],
+ "type" : "VEC2"
+ }
+ ],
+ "asset" : {
+ "generator" : "VKTS glTF 2.0 exporter",
+ "version" : "2.0"
+ },
+ "bufferViews" : [
+ {
+ "buffer" : 0,
+ "byteLength" : 23616,
+ "byteOffset" : 0,
+ "target" : 34963
+ },
+ {
+ "buffer" : 0,
+ "byteLength" : 141696,
+ "byteOffset" : 23616,
+ "target" : 34962
+ },
+ {
+ "buffer" : 0,
+ "byteLength" : 141696,
+ "byteOffset" : 165312,
+ "target" : 34962
+ },
+ {
+ "buffer" : 0,
+ "byteLength" : 188928,
+ "byteOffset" : 307008,
+ "target" : 34962
+ },
+ {
+ "buffer" : 0,
+ "byteLength" : 94464,
+ "byteOffset" : 495936,
+ "target" : 34962
+ }
+ ],
+ "buffers" : [
+ {
+ "byteLength" : 590400,
+ "uri" : "Suzanne.bin"
+ }
+ ],
+ "images" : [
+ {
+ "uri" : "Suzanne_BaseColor.png"
+ },
+ {
+ "uri" : "Suzanne_MetallicRoughness.png"
+ }
+ ],
+ "materials" : [
+ {
+ "name" : "Suzanne",
+ "pbrMetallicRoughness" : {
+ "baseColorTexture" : {
+ "index" : 0
+ },
+ "metallicRoughnessTexture" : {
+ "index" : 1
+ }
+ }
+ }
+ ],
+ "meshes" : [
+ {
+ "name" : "Suzanne",
+ "primitives" : [
+ {
+ "attributes" : {
+ "NORMAL" : 2,
+ "POSITION" : 1,
+ "TANGENT" : 3,
+ "TEXCOORD_0" : 4
+ },
+ "indices" : 0,
+ "material" : 0,
+ "mode" : 4
+ }
+ ]
+ }
+ ],
+ "nodes" : [
+ {
+ "mesh" : 0,
+ "name" : "Suzanne"
+ }
+ ],
+ "samplers" : [
+ {}
+ ],
+ "scene" : 0,
+ "scenes" : [
+ {
+ "nodes" : [
+ 0
+ ]
+ }
+ ],
+ "textures" : [
+ {
+ "sampler" : 0,
+ "source" : 0
+ },
+ {
+ "sampler" : 0,
+ "source" : 1
+ }
+ ]
+}
diff --git a/assets/Suzanne_BaseColor.png b/assets/Suzanne_BaseColor.png
new file mode 100644
index 0000000..1baf37d
Binary files /dev/null and b/assets/Suzanne_BaseColor.png differ
diff --git a/assets/Watermelon.bin b/assets/Watermelon.bin
new file mode 100644
index 0000000..2ed73c7
Binary files /dev/null and b/assets/Watermelon.bin differ
diff --git a/assets/Watermelon.gltf b/assets/Watermelon.gltf
new file mode 100644
index 0000000..38f4ef0
--- /dev/null
+++ b/assets/Watermelon.gltf
@@ -0,0 +1,226 @@
+{
+ "accessors": [
+ {
+ "bufferView": 2,
+ "componentType": 5126,
+ "count": 1057,
+ "max": [
+ 0.9999997019767761,
+ -4.371138828673793e-08,
+ 0.9999994039535522
+ ],
+ "min": [
+ -0.9999990463256836,
+ -1.0,
+ -0.9999987483024597
+ ],
+ "type": "VEC3"
+ },
+ {
+ "bufferView": 2,
+ "byteOffset": 12684,
+ "componentType": 5126,
+ "count": 1057,
+ "max": [
+ 0.9951868653297424,
+ 0.6717398762702942,
+ 0.9951868653297424
+ ],
+ "min": [
+ -0.9951868653297424,
+ -1.0,
+ -0.9951868653297424
+ ],
+ "type": "VEC3"
+ },
+ {
+ "bufferView": 1,
+ "componentType": 5126,
+ "count": 1057,
+ "max": [
+ 0.9996512532234192,
+ 0.9987801909446716
+ ],
+ "min": [
+ 0.016094159334897995,
+ 0.46866166591644287
+ ],
+ "type": "VEC2"
+ },
+ {
+ "bufferView": 0,
+ "componentType": 5125,
+ "count": 5946,
+ "type": "SCALAR"
+ }
+ ],
+ "asset": {
+ "extras": {
+ "author": "catafest (https://sketchfab.com/catafest)",
+ "license": "CC-BY-4.0 (http://creativecommons.org/licenses/by/4.0/)",
+ "source": "https://sketchfab.com/3d-models/watermelon-fruit-f120452f84bf4e979139b106bf9f096c",
+ "title": "Watermelon fruit"
+ },
+ "generator": "Sketchfab-12.67.0",
+ "version": "2.0"
+ },
+ "bufferViews": [
+ {
+ "buffer": 0,
+ "byteLength": 23784,
+ "name": "floatBufferViews",
+ "target": 34963
+ },
+ {
+ "buffer": 0,
+ "byteLength": 8456,
+ "byteOffset": 23784,
+ "byteStride": 8,
+ "name": "floatBufferViews",
+ "target": 34962
+ },
+ {
+ "buffer": 0,
+ "byteLength": 25368,
+ "byteOffset": 32240,
+ "byteStride": 12,
+ "name": "floatBufferViews",
+ "target": 34962
+ }
+ ],
+ "buffers": [
+ {
+ "byteLength": 57608,
+ "uri": "Watermelon.bin"
+ }
+ ],
+ "extensionsUsed": [
+ "KHR_materials_unlit"
+ ],
+ "images": [
+ {
+ "uri": "watermelon_baseColor.png"
+ }
+ ],
+ "materials": [
+ {
+ "doubleSided": true,
+ "extensions": {
+ "KHR_materials_unlit": {}
+ },
+ "name": "watermelon",
+ "pbrMetallicRoughness": {
+ "baseColorTexture": {
+ "index": 0
+ },
+ "metallicFactor": 0.0
+ }
+ }
+ ],
+ "meshes": [
+ {
+ "name": "Object_0",
+ "primitives": [
+ {
+ "attributes": {
+ "NORMAL": 1,
+ "POSITION": 0,
+ "TEXCOORD_0": 2
+ },
+ "indices": 3,
+ "material": 0,
+ "mode": 4
+ }
+ ]
+ }
+ ],
+ "nodes": [
+ {
+ "children": [
+ 1
+ ],
+ "matrix": [
+ 0.1953413188457489,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 4.337448596863889e-17,
+ -0.1953413188457489,
+ 0.0,
+ 0.0,
+ 0.1953413188457489,
+ 4.337448596863889e-17,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 1.0
+ ],
+ "name": "Sketchfab_model"
+ },
+ {
+ "children": [
+ 2
+ ],
+ "name": "root"
+ },
+ {
+ "children": [
+ 3
+ ],
+ "matrix": [
+ 1.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 2.220446049250313e-16,
+ 1.0,
+ 0.0,
+ 0.0,
+ -1.0,
+ 2.220446049250313e-16,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 1.0
+ ],
+ "name": "GLTF_SceneRootNode"
+ },
+ {
+ "children": [
+ 4
+ ],
+ "name": "Sphere_0"
+ },
+ {
+ "mesh": 0,
+ "name": "Object_4"
+ }
+ ],
+ "samplers": [
+ {
+ "magFilter": 9729,
+ "minFilter": 9987,
+ "wrapS": 10497,
+ "wrapT": 10497
+ }
+ ],
+ "scene": 0,
+ "scenes": [
+ {
+ "name": "Sketchfab_Scene",
+ "nodes": [
+ 0
+ ]
+ }
+ ],
+ "textures": [
+ {
+ "sampler": 0,
+ "source": 0
+ }
+ ]
+}
diff --git a/assets/default_baseColor.png b/assets/default_baseColor.png
new file mode 100644
index 0000000..5038734
Binary files /dev/null and b/assets/default_baseColor.png differ
diff --git a/assets/dragon.bin b/assets/dragon.bin
new file mode 100644
index 0000000..494daad
Binary files /dev/null and b/assets/dragon.bin differ
diff --git a/assets/dragon.gltf b/assets/dragon.gltf
new file mode 100644
index 0000000..4b2f271
--- /dev/null
+++ b/assets/dragon.gltf
@@ -0,0 +1,114 @@
+{
+ "asset":{
+ "generator":"Khronos glTF Blender I/O v3.6.27",
+ "version":"2.0"
+ },
+ "scene":0,
+ "scenes":[
+ {
+ "name":"Scene",
+ "nodes":[
+ 0
+ ]
+ }
+ ],
+ "nodes":[
+ {
+ "mesh":0,
+ "name":"dragon",
+ "rotation":[
+ 0.7071068286895752,
+ 0,
+ 0,
+ 0.7071068286895752
+ ]
+ }
+ ],
+ "materials":[
+ {
+ "doubleSided":true,
+ "name":"Default OBJ",
+ "pbrMetallicRoughness":{
+ "baseColorFactor":[
+ 0.800000011920929,
+ 0.800000011920929,
+ 0.800000011920929,
+ 1
+ ],
+ "metallicFactor":0,
+ "roughnessFactor":0.5
+ }
+ }
+ ],
+ "meshes":[
+ {
+ "name":"dragon",
+ "primitives":[
+ {
+ "attributes":{
+ "POSITION":0,
+ "NORMAL":1
+ },
+ "indices":2,
+ "material":0
+ }
+ ]
+ }
+ ],
+ "accessors":[
+ {
+ "bufferView":0,
+ "componentType":5126,
+ "count":439102,
+ "max":[
+ 0.20739500224590302,
+ 0.5277529954910278,
+ 0.2829580008983612
+ ],
+ "min":[
+ -0.239779993891716,
+ -0.47224700450897217,
+ -0.4220220148563385
+ ],
+ "type":"VEC3"
+ },
+ {
+ "bufferView":1,
+ "componentType":5126,
+ "count":439102,
+ "type":"VEC3"
+ },
+ {
+ "bufferView":2,
+ "componentType":5125,
+ "count":2613918,
+ "type":"SCALAR"
+ }
+ ],
+ "bufferViews":[
+ {
+ "buffer":0,
+ "byteLength":5269224,
+ "byteOffset":0,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":5269224,
+ "byteOffset":5269224,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":10455672,
+ "byteOffset":10538448,
+ "target":34963
+ }
+ ],
+ "buffers":[
+ {
+ "byteLength":20994120,
+ "uri":"dragon.bin"
+ }
+ ]
+}
diff --git a/assets/orange_fruit.zip b/assets/orange_fruit.zip
new file mode 100644
index 0000000..52f5713
Binary files /dev/null and b/assets/orange_fruit.zip differ
diff --git a/assets/orange_halb3DC_null_color_baseColor.jpeg b/assets/orange_halb3DC_null_color_baseColor.jpeg
new file mode 100644
index 0000000..260d5e3
Binary files /dev/null and b/assets/orange_halb3DC_null_color_baseColor.jpeg differ
diff --git a/assets/stanford_bunny_zipper_reconstruction.zip b/assets/stanford_bunny_zipper_reconstruction.zip
new file mode 100644
index 0000000..94c99bb
Binary files /dev/null and b/assets/stanford_bunny_zipper_reconstruction.zip differ
diff --git a/assets/teapot.bin b/assets/teapot.bin
new file mode 100644
index 0000000..3286076
Binary files /dev/null and b/assets/teapot.bin differ
diff --git a/assets/teapot.gltf b/assets/teapot.gltf
new file mode 100644
index 0000000..6b98be9
--- /dev/null
+++ b/assets/teapot.gltf
@@ -0,0 +1,208 @@
+{
+ "asset":{
+ "generator":"Khronos glTF Blender I/O v3.6.27",
+ "version":"2.0"
+ },
+ "scene":0,
+ "scenes":[
+ {
+ "name":"Scene",
+ "nodes":[
+ 2
+ ]
+ }
+ ],
+ "nodes":[
+ {
+ "mesh":0,
+ "name":"Object_3"
+ },
+ {
+ "children":[
+ 0
+ ],
+ "name":"teapot.obj.cleaner.materialmerger.gles"
+ },
+ {
+ "children":[
+ 1
+ ],
+ "name":"Sketchfab_model",
+ "rotation":[
+ -0.70710688829422,
+ 0,
+ 0,
+ 0.7071066498756409
+ ]
+ }
+ ],
+ "materials":[
+ {
+ "doubleSided":true,
+ "name":"default",
+ "pbrMetallicRoughness":{
+ "metallicFactor":0,
+ "roughnessFactor":0.8999999761581421
+ }
+ },
+ {
+ "doubleSided":true,
+ "name":"Default",
+ "pbrMetallicRoughness":{
+ "metallicFactor":0,
+ "roughnessFactor":0.8999999761581421
+ }
+ }
+ ],
+ "meshes":[
+ {
+ "name":"Object_1",
+ "primitives":[
+ {
+ "attributes":{
+ "POSITION":0,
+ "NORMAL":1,
+ "TEXCOORD_0":2
+ },
+ "indices":3,
+ "material":0
+ },
+ {
+ "attributes":{
+ "POSITION":4,
+ "NORMAL":5,
+ "TEXCOORD_0":6
+ },
+ "indices":7,
+ "material":1
+ }
+ ]
+ }
+ ],
+ "accessors":[
+ {
+ "bufferView":0,
+ "componentType":5126,
+ "count":6534,
+ "max":[
+ 82.29399871826172,
+ 47.9283561706543,
+ 59.87300491333008
+ ],
+ "min":[
+ -71.89253234863281,
+ -47.9283561706543,
+ 0
+ ],
+ "type":"VEC3"
+ },
+ {
+ "bufferView":1,
+ "componentType":5126,
+ "count":6534,
+ "type":"VEC3"
+ },
+ {
+ "bufferView":2,
+ "componentType":5126,
+ "count":6534,
+ "type":"VEC2"
+ },
+ {
+ "bufferView":3,
+ "componentType":5123,
+ "count":36456,
+ "type":"SCALAR"
+ },
+ {
+ "bufferView":4,
+ "componentType":5126,
+ "count":1922,
+ "max":[
+ 33.56470489501953,
+ 33.5647087097168,
+ 79.00656127929688
+ ],
+ "min":[
+ -33.5647087097168,
+ -33.5647087097168,
+ 58.93854904174805
+ ],
+ "type":"VEC3"
+ },
+ {
+ "bufferView":5,
+ "componentType":5126,
+ "count":1922,
+ "type":"VEC3"
+ },
+ {
+ "bufferView":6,
+ "componentType":5126,
+ "count":1922,
+ "type":"VEC2"
+ },
+ {
+ "bufferView":7,
+ "componentType":5123,
+ "count":10656,
+ "type":"SCALAR"
+ }
+ ],
+ "bufferViews":[
+ {
+ "buffer":0,
+ "byteLength":78408,
+ "byteOffset":0,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":78408,
+ "byteOffset":78408,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":52272,
+ "byteOffset":156816,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":72912,
+ "byteOffset":209088,
+ "target":34963
+ },
+ {
+ "buffer":0,
+ "byteLength":23064,
+ "byteOffset":282000,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":23064,
+ "byteOffset":305064,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":15376,
+ "byteOffset":328128,
+ "target":34962
+ },
+ {
+ "buffer":0,
+ "byteLength":21312,
+ "byteOffset":343504,
+ "target":34963
+ }
+ ],
+ "buffers":[
+ {
+ "byteLength":364816,
+ "uri":"teapot.bin"
+ }
+ ]
+}
diff --git a/assets/watermelon_baseColor.png b/assets/watermelon_baseColor.png
new file mode 100644
index 0000000..c24eda3
Binary files /dev/null and b/assets/watermelon_baseColor.png differ
diff --git a/assets/watermelon_fruit.zip b/assets/watermelon_fruit.zip
new file mode 100644
index 0000000..faff241
Binary files /dev/null and b/assets/watermelon_fruit.zip differ
diff --git a/cmake/CUDAComputesList.cmake b/cmake/CUDAComputesList.cmake
index 87629ae..3156a63 100644
--- a/cmake/CUDAComputesList.cmake
+++ b/cmake/CUDAComputesList.cmake
@@ -60,6 +60,8 @@ IF( CUDA_COMPUTE_20
OR CUDA_COMPUTE_70
OR CUDA_COMPUTE_72
OR CUDA_COMPUTE_75
+ OR CUDA_COMPUTE_80
+ OR CUDA_COMPUTE_86
)
SET(FALLBACK OFF)
ELSE()
@@ -70,8 +72,8 @@ LIST(LENGTH COMPUTES_DETECTED_LIST COMPUTES_LEN)
IF(${COMPUTES_LEN} EQUAL 0 AND ${FALLBACK})
MESSAGE(STATUS "You can use -DCOMPUTES_DETECTED_LIST=\"AB;XY\" (semicolon separated list of CUDA Compute versions to enable the specified computes")
MESSAGE(STATUS "Individual compute versions flags are also available under CMake Advance options")
- LIST(APPEND COMPUTES_DETECTED_LIST "30" "50" "60" "70")
- MESSAGE(STATUS "No computes detected. Fall back to 30, 50, 60 70")
+ LIST(APPEND COMPUTES_DETECTED_LIST "30" "50" "60" "70" "80")
+ MESSAGE(STATUS "No computes detected. Fall back to 30, 50, 60, 70, 80")
ENDIF()
LIST(LENGTH COMPUTES_DETECTED_LIST COMPUTES_LEN)
@@ -90,7 +92,7 @@ MACRO(SET_COMPUTE VERSION)
ENDMACRO(SET_COMPUTE)
# Iterate over compute versions. Create variables and enable computes if needed
-FOREACH(VER 20 30 32 35 37 50 52 53 60 61 62 70 72 75)
+FOREACH(VER 20 30 32 35 37 50 52 53 60 61 62 70 72 75 80 86)
OPTION(CUDA_COMPUTE_${VER} "CUDA Compute Capability ${VER}" OFF)
MARK_AS_ADVANCED(CUDA_COMPUTE_${VER})
IF(${CUDA_COMPUTE_${VER}})
diff --git a/cmake/FindGLFW.cmake b/cmake/FindGLFW.cmake
index 014ae83..9cf3786 100644
--- a/cmake/FindGLFW.cmake
+++ b/cmake/FindGLFW.cmake
@@ -20,57 +20,57 @@
include(FindPackageHandleStandardArgs)
if (WIN32)
- # Find include files
- find_path(
- GLFW_INCLUDE_DIR
- NAMES GLFW/glfw3.h
- PATHS
- $ENV{PROGRAMFILES}/include
- ${GLFW_ROOT_DIR}/include
- DOC "The directory where GLFW/glfw.h resides")
+ # Find include files
+ find_path(
+ GLFW_INCLUDE_DIR
+ NAMES GLFW/glfw3.h
+ PATHS
+ $ENV{PROGRAMFILES}/include
+ ${GLFW_ROOT_DIR}/include
+ DOC "The directory where GLFW/glfw.h resides")
- # Use glfw3.lib for static library
- if (GLFW_USE_STATIC_LIBS)
- set(GLFW_LIBRARY_NAME glfw3)
- else()
- set(GLFW_LIBRARY_NAME glfw3dll)
- endif()
+ # Use glfw3.lib for static library
+ if (GLFW_USE_STATIC_LIBS)
+ set(GLFW_LIBRARY_NAME glfw3)
+ else()
+ set(GLFW_LIBRARY_NAME glfw3dll)
+ endif()
- # Find library files
- find_library(
- GLFW_LIBRARY
- NAMES ${GLFW_LIBRARY_NAME}
- PATHS
- $ENV{PROGRAMFILES}/lib
- ${GLFW_ROOT_DIR}/lib)
+ # Find library files
+ find_library(
+ GLFW_LIBRARY
+ NAMES ${GLFW_LIBRARY_NAME}
+ PATHS
+ $ENV{PROGRAMFILES}/lib
+ ${GLFW_ROOT_DIR}/lib)
- unset(GLFW_LIBRARY_NAME)
+ unset(GLFW_LIBRARY_NAME)
else()
- # Find include files
- find_path(
- GLFW_INCLUDE_DIR
- NAMES GLFW/glfw.h
- PATHS
- /usr/include
- /usr/local/include
- /sw/include
- /opt/local/include
- DOC "The directory where GL/glfw.h resides")
+ # Find include files
+ find_path(
+ GLFW_INCLUDE_DIR
+ NAMES GLFW/glfw.h
+ PATHS
+ /usr/include
+ /usr/local/include
+ /sw/include
+ /opt/local/include
+ DOC "The directory where GL/glfw.h resides")
- # Find library files
- # Try to use static libraries
- find_library(
- GLFW_LIBRARY
- NAMES glfw3
- PATHS
- /usr/lib64
- /usr/lib
- /usr/local/lib64
- /usr/local/lib
- /sw/lib
- /opt/local/lib
- ${GLFW_ROOT_DIR}/lib
- DOC "The GLFW library")
+ # Find library files
+ # Try to use static libraries
+ find_library(
+ GLFW_LIBRARY
+ NAMES glfw3
+ PATHS
+ /usr/lib64
+ /usr/lib
+ /usr/local/lib64
+ /usr/local/lib
+ /sw/lib
+ /opt/local/lib
+ ${GLFW_ROOT_DIR}/lib
+ DOC "The GLFW library")
endif()
# Handle REQUIRD argument, define *_FOUND variable
@@ -78,8 +78,8 @@ find_package_handle_standard_args(GLFW DEFAULT_MSG GLFW_INCLUDE_DIR GLFW_LIBRARY
# Define GLFW_LIBRARIES and GLFW_INCLUDE_DIRS
if (GLFW_FOUND)
- set(GLFW_LIBRARIES ${OPENGL_LIBRARIES} ${GLFW_LIBRARY})
- set(GLFW_INCLUDE_DIRS ${GLFW_INCLUDE_DIR})
+ set(GLFW_LIBRARIES ${OPENGL_LIBRARIES} ${GLFW_LIBRARY})
+ set(GLFW_INCLUDE_DIRS ${GLFW_INCLUDE_DIR})
endif()
# Hide some variables
diff --git a/cmake/FindGLM.cmake b/cmake/FindGLM.cmake
index e2d45a8..55086f6 100644
--- a/cmake/FindGLM.cmake
+++ b/cmake/FindGLM.cmake
@@ -2,12 +2,12 @@
# Find GLM
#
# Try to find GLM : OpenGL Mathematics.
-# This module defines
+# This module defines
# - GLM_INCLUDE_DIRS
# - GLM_FOUND
#
# The following variables can be set as arguments for the module.
-# - GLM_ROOT_DIR : Root library directory of GLM
+# - GLM_ROOT_DIR : Root library directory of GLM
#
# References:
# - https://github.com/Groovounet/glm/blob/master/util/FindGLM.cmake
@@ -18,26 +18,26 @@
include(FindPackageHandleStandardArgs)
if (WIN32)
- # Find include files
- find_path(
- GLM_INCLUDE_DIR
- NAMES glm/glm.hpp
- PATHS
- $ENV{PROGRAMFILES}/include
- ${GLM_ROOT_DIR}/include
- DOC "The directory where glm/glm.hpp resides")
+ # Find include files
+ find_path(
+ GLM_INCLUDE_DIR
+ NAMES glm/glm.hpp
+ PATHS
+ $ENV{PROGRAMFILES}/include
+ ${GLM_ROOT_DIR}/include
+ DOC "The directory where glm/glm.hpp resides")
else()
- # Find include files
- find_path(
- GLM_INCLUDE_DIR
- NAMES glm/glm.hpp
- PATHS
- /usr/include
- /usr/local/include
- /sw/include
- /opt/local/include
- ${GLM_ROOT_DIR}/include
- DOC "The directory where glm/glm.hpp resides")
+ # Find include files
+ find_path(
+ GLM_INCLUDE_DIR
+ NAMES glm/glm.hpp
+ PATHS
+ /usr/include
+ /usr/local/include
+ /sw/include
+ /opt/local/include
+ ${GLM_ROOT_DIR}/include
+ DOC "The directory where glm/glm.hpp resides")
endif()
# Handle REQUIRD argument, define *_FOUND variable
@@ -45,7 +45,7 @@ find_package_handle_standard_args(GLM DEFAULT_MSG GLM_INCLUDE_DIR)
# Define GLM_INCLUDE_DIRS
if (GLM_FOUND)
- set(GLM_INCLUDE_DIRS ${GLM_INCLUDE_DIR})
+ set(GLM_INCLUDE_DIRS ${GLM_INCLUDE_DIR})
endif()
# Hide some variables
diff --git a/external/include/GL/Copying.txt b/external/include/GL/Copying.txt
deleted file mode 100644
index fc36ad9..0000000
--- a/external/include/GL/Copying.txt
+++ /dev/null
@@ -1,27 +0,0 @@
-
- Freeglut Copyright
- ------------------
-
- Freeglut code without an explicit copyright is covered by the following
- copyright:
-
- Copyright (c) 1999-2000 Pawel W. Olszta. All Rights Reserved.
- Permission is hereby granted, free of charge, to any person obtaining a copy
- of this software and associated documentation files (the "Software"), to deal
- in the Software without restriction, including without limitation the rights
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- copies or substantial portions of the Software.
-
- The above copyright notice and this permission notice shall be included in
- all copies or substantial portions of the Software.
-
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- PAWEL W. OLSZTA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
- IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
- CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
- Except as contained in this notice, the name of Pawel W. Olszta shall not be
- used in advertising or otherwise to promote the sale, use or other dealings
- in this Software without prior written authorization from Pawel W. Olszta.
diff --git a/external/include/GL/Readme.txt b/external/include/GL/Readme.txt
deleted file mode 100644
index f454169..0000000
--- a/external/include/GL/Readme.txt
+++ /dev/null
@@ -1,101 +0,0 @@
-freeglut 2.8.1-1.mp for MSVC
-
-This package contains freeglut import libraries, headers, and Windows DLLs.
-These allow 32 and 64 bit GLUT applications to be compiled on Windows using
-Microsoft Visual C++.
-
-For more information on freeglut, visit http://freeglut.sourceforge.net/.
-
-
-Installation
-
-Create a folder on your PC which is readable by all users, for example
-“C:\Program Files\Common Files\MSVC\freeglut\” on a typical Windows system. Copy
-the “lib\” and “include\” folders from this zip archive to that location.
-
-The appropriate freeglut DLL can either be placed in the same folder as your
-application, or can be installed in a system-wide folder which appears in your
-%PATH% environment variable. Be careful not to mix the 32 bit DLL up with the 64
-bit DLL, as they are not interchangeable.
-
-
-Compiling 32 bit Applications
-
-To create a 32 bit freeglut application, create a new Win32 C++ project in MSVC.
-From the “Win32 Application Wizard”, choose a “Windows application”, check the
-“Empty project” box, and submit.
-
-You’ll now need to configure the compiler and linker settings. Open up the
-project properties, and select “All Configurations” (this is necessary to ensure
-our changes are applied for both debug and release builds). Open up the
-“general” section under “C/C++”, and configure the “include\” folder you created
-above as an “Additional Include Directory”. If you have more than one GLUT
-package which contains a “glut.h” file, it’s important to ensure that the
-freeglut include folder appears above all other GLUT include folders.
-
-Now open up the “general” section under “Linker”, and configure the “lib\”
-folder you created above as an “Additional Library Directory”. A freeglut
-application depends on the import libraries “freeglut.lib” and “opengl32.lib”,
-which can be configured under the “Input” section. However, it shouldn’t be
-necessary to explicitly state these dependencies, since the freeglut headers
-handle this for you. Now open the “Advanced” section, and enter “mainCRTStartup”
-as the “Entry Point” for your application. This is necessary because GLUT
-applications use “main” as the application entry point, not “WinMain”—without it
-you’ll get an undefined reference when you try to link your application.
-
-That’s all of your project properties configured, so you can now add source
-files to your project and build the application. If you want your application to
-be compatible with GLUT, you should “#include ”. If you want to use
-freeglut specific extensions, you should “#include ” instead.
-
-Don’t forget to either include the freeglut DLL when distributing applications,
-or provide your users with some method of obtaining it if they don’t already
-have it!
-
-
-Compiling 64 bit Applications
-
-Building 64 bit applications is almost identical to building 32 bit applications.
-When you use the configuration manager to add the x64 platform, it’s easiest to
-copy the settings from the Win32 platform. If you do so, it’s then only necessary
-to change the “Additional Library Directories” configuration so that it
-references the directory containing the 64 bit import library rather
-than the 32 bit one.
-
-
-Problems?
-
-If you have problems using this package (compiler / linker errors etc.), please
-check that you have followed all of the steps in this readme file correctly.
-Almost all of the problems which are reported with these packages are due to
-missing a step or not doing it correctly, for example trying to build a 32 bit
-app against the 64 bit import library. If you have followed all of the steps
-correctly but your application still fails to build, try building a very simple
-but functional program (the example at
-http://www.transmissionzero.co.uk/computing/using-glut-with-mingw/ works fine
-with MSVC). A lot of people try to build very complex applications after
-installing these packages, and often the error is with the application code or
-other library dependencies rather than freeglut.
-
-If you still can’t get it working after trying to compile a simple application,
-then please get in touch via http://www.transmissionzero.co.uk/contact/,
-providing as much detail as you can. Please don’t complain to the freeglut guys
-unless you’re sure it’s a freeglut bug, and have reproduced the issue after
-compiling freeglut from the latest SVN version—if that’s still the case, I’m sure
-they would appreciate a bug report or a patch.
-
-
-Changelog
-
-2013–05–11: Release 2.8.1-1.mp
-
- • First 2.8.1 MSVC release. I’ve built the package using Visual Studio 2012,
- and the only change I’ve made is to the DLL version resource—I’ve changed
- the description so that my MinGW and MSVC builds are distinguishable from
- each other (and other builds) using Windows Explorer.
-
-
-Martin Payne
-2013–05–11
-
-http://www.transmissionzero.co.uk/
diff --git a/external/include/json.hpp b/external/include/json.hpp
new file mode 100644
index 0000000..87475ab
--- /dev/null
+++ b/external/include/json.hpp
@@ -0,0 +1,26753 @@
+/*
+ __ _____ _____ _____
+ __| | __| | | | JSON for Modern C++
+| | |__ | | | | | | version 3.10.4
+|_____|_____|_____|_|___| https://github.com/nlohmann/json
+
+Licensed under the MIT License .
+SPDX-License-Identifier: MIT
+Copyright (c) 2013-2019 Niels Lohmann .
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+
+#ifndef INCLUDE_NLOHMANN_JSON_HPP_
+#define INCLUDE_NLOHMANN_JSON_HPP_
+
+#define NLOHMANN_JSON_VERSION_MAJOR 3
+#define NLOHMANN_JSON_VERSION_MINOR 10
+#define NLOHMANN_JSON_VERSION_PATCH 4
+
+#include // all_of, find, for_each
+#include // nullptr_t, ptrdiff_t, size_t
+#include // hash, less
+#include // initializer_list
+#ifndef JSON_NO_IO
+ #include // istream, ostream
+#endif // JSON_NO_IO
+#include // random_access_iterator_tag
+#include // unique_ptr
+#include // accumulate
+#include // string, stoi, to_string
+#include // declval, forward, move, pair, swap
+#include // vector
+
+// #include
+
+
+#include
+#include
+
+// #include
+
+
+#include // transform
+#include // array
+#include // forward_list
+#include // inserter, front_inserter, end
+#include