Example #1
0
        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);
        }
Example #3
0
 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);