// @dart=2.8
// 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 Vector position;
  final Color color;
  final double 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;
  CanvasElement 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') as CanvasElement;
  }
  var 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);
}
