private Intersections MinIntersections(RayPacket256 rayPacket256, Scene scene) { Intersections mins = new Intersections(Intersections.NullDistance, Intersections.NullIndex); for (int i = 0; i < scene.Things.Length; i++) { Vector256 <float> distance = scene.Things[i].Intersect(rayPacket256); if (!Intersections.AllNullIntersections(distance)) { var notNullMask = Compare(distance, Intersections.NullDistance, FloatComparisonMode.NotEqualOrderedNonSignaling); var nullMinMask = Compare(mins.Distances, Intersections.NullDistance, FloatComparisonMode.EqualOrderedNonSignaling); var lessMinMask = Compare(mins.Distances, distance, FloatComparisonMode.GreaterThanOrderedNonSignaling); var minMask = And(notNullMask, Or(nullMinMask, lessMinMask)); var minDis = BlendVariable(mins.Distances, distance, minMask); var minIndices = BlendVariable(mins.ThingIndices, Vector256.Create(i), minMask.AsInt32()); mins.Distances = minDis; mins.ThingIndices = minIndices; } } return(mins); }