summaryrefslogblamecommitdiff
path: root/hw3/bin/HW3.cpp
blob: 4dbb9e62c9fd83f1e2a18b2744bd7bce6d2195e4 (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++)

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