diff --git a/in_one_weekend/src/main.zig b/in_one_weekend/src/main.zig index 85831ab..d5a409a 100644 --- a/in_one_weekend/src/main.zig +++ b/in_one_weekend/src/main.zig @@ -18,14 +18,14 @@ const fps = 60; fn hitSphere(center: Point3, radius: f32, ray: Ray) f32 { const ssr = ray.origin.sub(center); // Sphere-space ray, (A - C) in book - const a = Vec3.dot(ray.direction, ray.direction); - const b = 2.0 * Vec3.dot(ssr, ray.direction); - const c = Vec3.dot(ssr, ssr) - (radius * radius); - const discriminant = b * b - 4 * a * c; + const a = ray.direction.length_squared(); + const half_b = Vec3.dot(ssr, ray.direction); + const c = ssr.length_squared() - (radius * radius); + const discriminant = half_b * half_b - a * c; if (discriminant < 0) { return -1; } else { - return (-b - std.math.sqrt(discriminant)) / (2 * a); + return (-half_b - std.math.sqrt(discriminant)) / a; } } diff --git a/in_one_weekend/src/vec3.zig b/in_one_weekend/src/vec3.zig index c0f54dd..bc607b2 100644 --- a/in_one_weekend/src/vec3.zig +++ b/in_one_weekend/src/vec3.zig @@ -41,6 +41,10 @@ pub const Vec3 = packed struct { return math.sqrt(self.x * self.x + self.y * self.y + self.z * self.z); } + pub fn length_squared(self: Vec3) f32 { + return self.x * self.x + self.y * self.y + self.z * self.z; + } + pub fn dot(u: Vec3, v: Vec3) f32 { return u.x * v.x + u.y * v.y + u.z * v.z; }