// 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 = Scene();
  scene.camera = Camera(
      Vector(0.0, 0.0, -15.0), Vector(-0.2, 0.0, 5.0), Vector(0.0, 1.0, 0.0));
  scene.background = Background(Color(0.5, 0.5, 0.5), 0.4);

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

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

  var plane = Plane(
      Vector(0.1, 0.9, -0.5).normalize(),
      1.2,
      Chessboard(
          Color(1.0, 1.0, 1.0), 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 = Light(Vector(5.0, 10.0, -1.0), Color(0.8, 0.8, 0.8));

  var light1 = Light(Vector(-3.0, 5.0, -15.0), 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 = Engine(
      canvasWidth: imageWidth,
      canvasHeight: imageHeight,
      pixelWidth: pixelSize,
      pixelHeight: pixelSize,
      renderDiffuse: renderDiffuse,
      renderShadows: renderShadows,
      renderReflections: renderReflections,
      renderHighlights: renderHighlights,
      rayDepth: rayDepth);

  raytracer.renderScene(scene, canvas);
}
