From 95827a4a52bcc96f28f6d3e04c87476ce8365dd2 Mon Sep 17 00:00:00 2001 From: Bill Thiede Date: Sun, 29 Jan 2023 09:05:16 -0800 Subject: [PATCH] rtiow: descend both children in BVHTriangles::hit. --- rtiow/renderer/src/bvh_triangles.rs | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/rtiow/renderer/src/bvh_triangles.rs b/rtiow/renderer/src/bvh_triangles.rs index f7e7246..4775d8d 100644 --- a/rtiow/renderer/src/bvh_triangles.rs +++ b/rtiow/renderer/src/bvh_triangles.rs @@ -194,13 +194,15 @@ where } } } else { - let hr = self.intersect_bvh(r, node.left_child, t_min, t_max); - if hr.is_some() { - return hr; - } - let hr = self.intersect_bvh(r, node.left_child + 1, t_min, t_max); - if hr.is_some() { - return hr; + let r1 = self.intersect_bvh(r, node.left_child, t_min, t_max); + let r2 = self.intersect_bvh(r, node.left_child + 1, t_min, t_max); + // Merge results, if both hit, take the one closest to the ray origin (smallest t + // value). + match (&r1, &r2) { + (Some(_), None) => return r1, + (None, Some(_)) => return r2, + (None, None) => (), + (Some(rp1), Some(rp2)) => return if rp1.t < rp2.t { r1 } else { r2 }, } } None @@ -282,7 +284,7 @@ fn ray_triangle_intersect_moller_trumbore(r: Ray, tri: &Triangle) -> Option EPSILON { return Some(RayTriangleResult { t, - p: r.origin + r.direction * t, + p: r.point_at_parameter(t), }); } None