| // @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; |
| |
| abstract class BaseShape { |
| final Vector position; |
| final Materials material; |
| |
| BaseShape(this.position, this.material); |
| |
| IntersectionInfo intersect(Ray ray); |
| |
| @override |
| String toString() { |
| return 'BaseShape'; |
| } |
| } |
| |
| class Plane extends BaseShape { |
| final double d; |
| |
| Plane(Vector pos, this.d, Materials material) : super(pos, material); |
| |
| @override |
| IntersectionInfo intersect(Ray ray) { |
| var info = IntersectionInfo(); |
| |
| var Vd = position.dot(ray.direction); |
| if (Vd == 0) return info; // no intersection |
| |
| var t = -(position.dot(ray.position) + d) / Vd; |
| if (t <= 0) return info; |
| |
| info.shape = this; |
| info.isHit = true; |
| info.position = ray.position + ray.direction.multiplyScalar(t); |
| info.normal = position; |
| info.distance = t; |
| |
| if (material.hasTexture) { |
| var vU = Vector(position.y, position.z, -position.x); |
| var vV = vU.cross(position); |
| var u = info.position.dot(vU); |
| var v = info.position.dot(vV); |
| info.color = material.getColor(u, v); |
| } else { |
| info.color = material.getColor(0, 0); |
| } |
| |
| return info; |
| } |
| |
| @override |
| String toString() { |
| return 'Plane [$position, d=$d]'; |
| } |
| } |
| |
| class Sphere extends BaseShape { |
| double radius; |
| |
| Sphere(Vector pos, this.radius, Materials material) : super(pos, material); |
| |
| @override |
| IntersectionInfo intersect(Ray ray) { |
| var info = IntersectionInfo(); |
| info.shape = this; |
| |
| var dst = ray.position - position; |
| |
| var B = dst.dot(ray.direction); |
| var C = dst.dot(dst) - (radius * radius); |
| var D = (B * B) - C; |
| |
| if (D > 0) { |
| // intersection! |
| info.isHit = true; |
| info.distance = (-B) - sqrt(D); |
| info.position = |
| ray.position + ray.direction.multiplyScalar(info.distance); |
| info.normal = (info.position - position).normalize(); |
| |
| info.color = material.getColor(0, 0); |
| } else { |
| info.isHit = false; |
| } |
| return info; |
| } |
| |
| @override |
| String toString() { |
| return 'Sphere [position=$position, radius=$radius]'; |
| } |
| } |