Esempio n. 1
0
    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);
    }