package tracer.primatives;

import tracer.geometry.Ray3d;
import tracer.geometry.Vector3d;

public class Sphere extends Primitive {
  Vector3d c;
  double r, r2;

  public Sphere(Vector3d center, double radius) {
    c = center;
    r = radius;
    r2 = r * r;
  }

  public Isect intersect(Ray3d ry) {
    double b, disc, t;
    Isect ip;
    Vector3d v;
    v = Vector3d.sub(c, ry.getStartPoint());
    b = Vector3d.dot(v, ry.getDirection());
    disc = b * b - Vector3d.dot(v, v) + r2;
    if (disc < 0.0) {
      return null;
    }
    disc = Math.sqrt(disc);
    t = (b - disc < 1e-6) ? b + disc : b - disc;
    if (t < 1e-6) {
      return null;
    }
    ip = new Isect();
    ip.t = t;
    ip.enter = Vector3d.dot(v, v) > r2 + 1e-6 ? 1 : 0;
    ip.prim = this;
    ip.surf = surf;
    return ip;
  }

  public Vector3d normal(Vector3d p) {
    Vector3d r;
    r = Vector3d.sub(p, c);
    r.normalize();
    return r;
  }

  public String toString() {
    return "Sphere {" + c.toString() + "," + r + "}";
  }
}