public override bool Hit(Ray r, float tMin, float tMax, ref HitRecord record) { Vec3f oc = r.Origin - Center; float a = Vec3f.Dot(r.Direction, r.Direction); float b = Vec3f.Dot(oc, r.Direction); float c = Vec3f.Dot(oc, oc) - Radius * Radius; float discriminant = b * b - a * c; if (discriminant > 0) { float tempSqrt = MathF.Sqrt(b * b - a * c); float temp = (-b - tempSqrt) / a; if (temp < tMax && temp > tMin) { record.t = temp; record.Point = r.PointAtParameter(record.t); record.Normal = (record.Point - Center) / Radius; record.Material = this.Material; return(true); } temp = (-b + tempSqrt) / a; if (temp < tMax && temp > tMin) { record.t = temp; record.Point = r.PointAtParameter(record.t); record.Normal = (record.Point - Center) / Radius; record.Material = this.Material; return(true); } } return(false); }
public override bool Hit(Ray r, float tMin, float tMax, ref HitRecord record) { if (HitArray == null) { HitArray = HitList.ToArray(); } HitRecord tmpRecord = new HitRecord(); bool flagHitAnything = false; float closest_so_far = tMax; foreach (var h in HitArray) { if (h.Hit(r, tMin, closest_so_far, ref tmpRecord)) { flagHitAnything = true; closest_so_far = tmpRecord.t; record = tmpRecord; } } return(flagHitAnything); }
public abstract bool Hit(Ray r, float tMin, float tMax, ref HitRecord record);
public abstract bool Scatter(Ray r, HitRecord rec, out Vec3f attenuation, out Ray Scattered, Random drand);