// @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 Ray {
  final Vector position;
  final Vector direction;

  Ray(this.position, this.direction);

  @override
  String toString() {
    return 'Ray [$position, $direction]';
  }
}

class Camera {
  final Vector position;
  final Vector lookAt;
  final Vector up;
  Vector equator, screen;

  Camera(this.position, this.lookAt, this.up) {
    equator = lookAt.normalize().cross(up);
    screen = position + lookAt;
  }

  Ray getRay(double vx, double vy) {
    var pos = screen - (equator.multiplyScalar(vx) - up.multiplyScalar(vy));
    pos.y = pos.y * -1.0;
    var dir = pos - position;
    var ray = Ray(pos, dir.normalize());
    return ray;
  }

  @override
  String toString() {
    return 'Camera []';
  }
}

class Background {
  final Color color;
  final double ambience;

  Background(this.color, this.ambience);
}

class Scene {
  Camera camera;
  List<BaseShape> shapes;
  List<Light> lights;
  Background background;

  Scene() {
    camera = Camera(
        Vector(0.0, 0.0, -0.5), Vector(0.0, 0.0, 1.0), Vector(0.0, 1.0, 0.0));
    shapes = [];
    lights = [];
    background = Background(Color(0.0, 0.0, 0.5), 0.2);
  }
}
