// The ray tracer code in this file is written by Adam Burmister. It
// is available in its original form from:
//
//   http://labs.flog.co.nz/raytracer/
//
// Ported from the v8 benchmark suite by Google 2012.
part of ray_trace;

class Light {
  final position;
  final color;
  final intensity;

  Light(this.position, this.color, [this.intensity = 10.0]);
}

// 'event' null means that we are benchmarking
void renderScene(event) {
  var scene = new Scene();
  scene.camera = new Camera(new Vector(0.0, 0.0, -15.0),
      new Vector(-0.2, 0.0, 5.0), new Vector(0.0, 1.0, 0.0));
  scene.background = new Background(new Color(0.5, 0.5, 0.5), 0.4);

  var sphere = new Sphere(new Vector(-1.5, 1.5, 2.0), 1.5,
      new Solid(new Color(0.0, 0.5, 0.5), 0.3, 0.0, 0.0, 2.0));

  var sphere1 = new Sphere(new Vector(1.0, 0.25, 1.0), 0.5,
      new Solid(new Color(0.9, 0.9, 0.9), 0.1, 0.0, 0.0, 1.5));

  var plane = new Plane(
      new Vector(0.1, 0.9, -0.5).normalize(),
      1.2,
      new Chessboard(new Color(1.0, 1.0, 1.0), new Color(0.0, 0.0, 0.0), 0.2,
          0.0, 1.0, 0.7));

  scene.shapes.add(plane);
  scene.shapes.add(sphere);
  scene.shapes.add(sphere1);

  var light = new Light(new Vector(5.0, 10.0, -1.0), new Color(0.8, 0.8, 0.8));

  var light1 =
      new Light(new Vector(-3.0, 5.0, -15.0), new Color(0.8, 0.8, 0.8), 100.0);

  scene.lights.add(light);
  scene.lights.add(light1);

  int imageWidth, imageHeight, pixelSize;
  bool renderDiffuse, renderShadows, renderHighlights, renderReflections;
  var canvas;
  if (event == null) {
    imageWidth = 100;
    imageHeight = 100;
    pixelSize = 5;
    renderDiffuse = true;
    renderShadows = true;
    renderHighlights = true;
    renderReflections = true;
    canvas = null;
  } else {
    imageWidth =
        int.parse((querySelector('#imageWidth') as InputElement).value);
    imageHeight =
        int.parse((querySelector('#imageHeight') as InputElement).value);
    pixelSize = int.parse(
        (querySelector('#pixelSize') as InputElement).value.split(',')[0]);
    renderDiffuse =
        (querySelector('#renderDiffuse') as CheckboxInputElement).checked;
    renderShadows =
        (querySelector('#renderShadows') as CheckboxInputElement).checked;
    renderHighlights =
        (querySelector('#renderHighlights') as CheckboxInputElement).checked;
    renderReflections =
        (querySelector('#renderReflections') as CheckboxInputElement).checked;
    canvas = querySelector("#canvas");
  }
  int rayDepth = 2;

  var raytracer = new Engine(
      canvasWidth: imageWidth,
      canvasHeight: imageHeight,
      pixelWidth: pixelSize,
      pixelHeight: pixelSize,
      renderDiffuse: renderDiffuse,
      renderShadows: renderShadows,
      renderReflections: renderReflections,
      renderHighlights: renderHighlights,
      rayDepth: rayDepth);

  raytracer.renderScene(scene, canvas);
}
