summaryrefslogblamecommitdiff
path: root/hw6/bin/HW4.cpp
blob: 79f4ecf1564a537e85b149d7d777f3669376bd94 (plain) (tree)




























































































                                                                                      
#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;
}