summaryrefslogtreecommitdiff
path: root/hw4/bin/HW4.cpp
diff options
context:
space:
mode:
author53hornet <53hornet@gmail.com>2019-02-02 23:33:15 -0500
committer53hornet <53hornet@gmail.com>2019-02-02 23:33:15 -0500
commitdb072ad4dc181eca5a1458656b130beb43f475bf (patch)
treea3c03c7f5497cb70503e2486662fa85cfb53415a /hw4/bin/HW4.cpp
downloadcsci427-db072ad4dc181eca5a1458656b130beb43f475bf.tar.xz
csci427-db072ad4dc181eca5a1458656b130beb43f475bf.zip
Diffstat (limited to 'hw4/bin/HW4.cpp')
-rw-r--r--hw4/bin/HW4.cpp93
1 files changed, 93 insertions, 0 deletions
diff --git a/hw4/bin/HW4.cpp b/hw4/bin/HW4.cpp
new file mode 100644
index 0000000..698ef7e
--- /dev/null
+++ b/hw4/bin/HW4.cpp
@@ -0,0 +1,93 @@
+#include <string>
+#include <chrono>
+#include <iostream>
+
+#include "util.h"
+#include "image.h"
+#include "scene.h"
+#include "imageIO.h"
+#include "sceneIO.h"
+
+
+image generateImage(const scene& s)
+{
+ image result(s.getCamera().width(), s.getCamera().height());
+
+ // for every pixel
+ for(image::size_type y=0; y < result.height(); y++)
+ for(image::size_type x=0; x < result.width(); x++)
+ {
+ // generate view ray
+ ray r = s.getCamera()(x,y);
+
+ // intersect scene
+ intersectionPoint ip = s.intersect(r);
+
+ // shade pixel
+ if(ip.isHit())
+ {
+ // for each light source
+ for(unsigned int l=0; l < s.numberOfLightsources(); l++)
+ {
+ // connect to light source
+ lightSample ls = s.getLightsource(l).intensityAt(ip.position());
+
+ // shade
+ result(x,y) += ip.shade(ls);
+ }
+ }
+ else result(x,y) = color(0.0f, 0.0f, 0.0f);
+ }
+
+
+ // Done.
+ return result;
+}
+
+
+
+int main(int argc, char** argv)
+{
+ // parse command line
+ if(argc < 2)
+ {
+ std::cout << "Usage: " << argv[0] << " <scene.xml> [scene2.xml ...]" << std::endl;
+ return -1;
+ }
+
+ // for each filename, import scene and render
+ unsigned int pos=1;
+ while(pos < argc)
+ {
+ // get filename
+ std::string filename = argv[pos++];
+
+ // import
+ std::cerr << " * Reading " << filename << "...";
+ auto startImport = std::chrono::system_clock::now();
+
+ scene s;
+ importScene(filename, s);
+
+ auto endImport = std::chrono::system_clock::now();
+ std::chrono::duration<float> durationImport = endImport - startImport;
+ std::cerr << durationImport.count() << " seconds." << std::endl;
+
+ // render
+ std::cerr << " * Rendering... ";
+ auto startTime = std::chrono::system_clock::now();
+
+ image result = generateImage(s);
+
+ auto endTime = std::chrono::system_clock::now();
+ std::chrono::duration<float> duration = endTime - startTime;
+ std::cerr << duration.count() << " seconds." << std::endl;
+
+ // save image
+ std::cerr << " * Writing result." << std::endl;
+ exportImage(getFilename(filename) + ".ppm", result);
+ }
+
+ // Done.
+ return 0;
+}