#include #include #include #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] << " [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 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; }