From cf5d54b9dac175489a412dbd0cd2d954e83cbed8 Mon Sep 17 00:00:00 2001 From: yankejustin Date: Fri, 7 Aug 2015 13:58:58 -0400 Subject: [PATCH] Optimize ray intersection calculation Check to make sure the direction is not 0 only once. Also, check to make sure it is 0 first so we don't unnecessarily calculate if the position is greater-than or less-than another without purpose. --- TrueCraft.API/Ray.cs | 35 +++++++++++++++++++++++------------ 1 file changed, 23 insertions(+), 12 deletions(-) diff --git a/TrueCraft.API/Ray.cs b/TrueCraft.API/Ray.cs index dbd3e57..2da021e 100644 --- a/TrueCraft.API/Ray.cs +++ b/TrueCraft.API/Ray.cs @@ -94,18 +94,29 @@ namespace TrueCraft.API Vector3 maxT = new Vector3(-1.0f); //Vector3 minT = new Vector3(-1.0f); //calcul intersection with each faces - if (Position.X < box.Min.X && Direction.X != 0.0f) - maxT.X = (box.Min.X - Position.X) / Direction.X; - else if (Position.X > box.Max.X && Direction.X != 0.0f) - maxT.X = (box.Max.X - Position.X) / Direction.X; - if (Position.Y < box.Min.Y && Direction.Y != 0.0f) - maxT.Y = (box.Min.Y - Position.Y) / Direction.Y; - else if (Position.Y > box.Max.Y && Direction.Y != 0.0f) - maxT.Y = (box.Max.Y - Position.Y) / Direction.Y; - if (Position.Z < box.Min.Z && Direction.Z != 0.0f) - maxT.Z = (box.Min.Z - Position.Z) / Direction.Z; - else if (Position.Z > box.Max.Z && Direction.Z != 0.0f) - maxT.Z = (box.Max.Z - Position.Z) / Direction.Z; + if (Direction.X != 0.0f) + { + if (Position.X < box.Min.X) + maxT.X = (box.Min.X - Position.X) / Direction.X; + else if (Position.X > box.Max.X) + maxT.X = (box.Max.X - Position.X) / Direction.X; + } + + if (Direction.Y != 0.0f) + { + if (Position.Y < box.Min.Y) + maxT.Y = (box.Min.Y - Position.Y) / Direction.Y; + else if (Position.Y > box.Max.Y) + maxT.Y = (box.Max.Y - Position.Y) / Direction.Y; + } + + if (Direction.Z != 0.0f) + { + if (Position.Z < box.Min.Z) + maxT.Z = (box.Min.Z - Position.Z) / Direction.Z; + else if (Position.Z > box.Max.Z) + maxT.Z = (box.Max.Z - Position.Z) / Direction.Z; + } //get the maximum maxT if (maxT.X > maxT.Y && maxT.X > maxT.Z)