package main import ( maths "math" ) type Ray struct { Origin Vec3 Direction Vec3 Valid bool } func (r Ray) At(t float64) Vec3 { return r.Origin.Add(r.Direction.Mul(SplatVec3(t))); } func (r Ray) Colour(world Hittable, md uint) Vec3 { if md <= 0 { return SplatVec3(0); } hit := world.Hit(r, Interval{0.001, maths.Inf(1)}) if hit.Valid { scat := hit.Mat.Scatter(r, hit); if scat.Valid { return scat.Colour(world, md - 1).Mul(hit.Mat.Attenuation()); } return SplatVec3(0); } unit_dir := r.Direction.Unit(); a := (unit_dir.Y + 1) / 2; return Vec3{0.5, 0.7, 1.0}.Mul(SplatVec3(a)). Add(SplatVec3(1).Mul(SplatVec3(1.0 - a))); }