summaryrefslogtreecommitdiff
path: root/hw3/bin/HW3.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'hw3/bin/HW3.cpp')
-rw-r--r--hw3/bin/HW3.cpp90
1 files changed, 90 insertions, 0 deletions
diff --git a/hw3/bin/HW3.cpp b/hw3/bin/HW3.cpp
new file mode 100644
index 0000000..4dbb9e6
--- /dev/null
+++ b/hw3/bin/HW3.cpp
@@ -0,0 +1,90 @@
+#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++)
+
+ // For debugging -- render a single delinquent pixel.
+ // for (image::size_type y=41; y < 42; y++)
+ // for (image::size_type x=126; x < 127; 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 << std::endl;
+ scene s;
+ importScene(filename, s);
+
+ // 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;
+}