diff options
Diffstat (limited to 'hw5/bin/HW4.cpp')
-rw-r--r-- | hw5/bin/HW4.cpp | 93 |
1 files changed, 93 insertions, 0 deletions
diff --git a/hw5/bin/HW4.cpp b/hw5/bin/HW4.cpp new file mode 100644 index 0000000..79f4ecf --- /dev/null +++ b/hw5/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; +} |