diff --git a/src/main.rs b/src/main.rs index 7774631..68312f8 100644 --- a/src/main.rs +++ b/src/main.rs @@ -124,11 +124,22 @@ fn main() -> io::Result<()> { let base = m_camera * base; let ray = m_camera * normalize(ray); + let mut dist = f32::INFINITY; for f in &mesh { let color = clamp(to_ivec3(f.normal * 120.0 + 128.0), ivec3(0, 0, 0), ivec3(255, 255, 255)); - let ds = (0..3).map(|k| edge_dist(f.vertices[k], f.vertices[(k + 1) % 3], base, ray)); - if ds.into_iter().all(|d| d > 0.0) { + let fs = (0..3).map(|k| edge_dist(f.vertices[k], f.vertices[(k + 1) % 3], base, ray)); + if fs.into_iter().all(|f| f > 0.0) { + let m = Mat3 { c0: f.vertices[1] - f.vertices[0], c1: f.vertices[2] - f.vertices[0], c2: -ray }; + if let Some(m) = m.inverse() { + let rel = m * (base - f.vertices[0]); + if rel.z > dist { + continue; + } + dist = rel.z; + } else { + continue; + } img.put_pixel(x, y, Color(color.x as u8, color.y as u8, color.z as u8)); } }