예제 #1
0
        public static void PostProcess(List <Sample3D[]> samples3D, PostProcessor3D postProcessor)
        {
            PolarCoordinatesPostProcessor polarPP = postProcessor as PolarCoordinatesPostProcessor;

            var origin = polarPP.Origin.Position;
            var zScale = polarPP.ZScale;

            var rangePartitioner = Partitioner.Create(samples3D);

            Parallel.ForEach(rangePartitioner, samples3DArray =>
            {
                for (int i = 0; i < samples3DArray.Length; i++)
                {
                    var newPosition = samples3DArray[i].Position - origin;
                    var scaledZ     = newPosition.Z * zScale; // TODO: z-scale based on distance of "ground" from origin??? This might be possilbe to make this automatic based on that...
                    if (scaledZ > Math.PI / 2f || scaledZ < -1 * Math.PI / 2f)
                    {
                        samples3DArray[i].Disabled = true;
                    }
                    else
                    {
                        newPosition = Vector3.Transform(new Vector3(newPosition.X, newPosition.Y, 0f), Quaternion.CreateFromYawPitchRoll(0, scaledZ, 0));

                        newPosition += origin;
                        samples3DArray[i].Position = newPosition;
                    }
                }
            });
        }
예제 #2
0
        public static void PostProcess(List <Sample3D[]> samples3D, PostProcessor3D postProcessor)
        {
            StrobePostProcessor strobe = postProcessor as StrobePostProcessor;
            float animationValue       = strobe.AnimationValue * (float)Math.PI * 2f;

            foreach (var samples3DArray in samples3D)
            {
                int sampleLength = samples3DArray.Length;
                for (int i = 0; i < sampleLength; i++)
                {
                    var sinValue = Math.Sin((samples3DArray[i].Position.Y * strobe.Scale) + animationValue);
                    samples3DArray[i].Disabled = sinValue < 0;
                }
            }
        }
예제 #3
0
        public static void PostProcess(List <Sample3D[]> samples3D, PostProcessor3D postProcessor)
        {
            RadialPulsePostProcessor pulse = postProcessor as RadialPulsePostProcessor;

            var pos = pulse.Position;
            var min = pulse.CurrentMinDistance;
            var max = pulse.CurrentMaxDistance;
            var rangePartitioner = Partitioner.Create(samples3D);

            Parallel.ForEach(rangePartitioner, samples3DArray =>
            {
                for (int i = 0; i < samples3DArray.Length; i++)
                {
                    float distance = Vector3.Distance(samples3DArray[i].Position, pos);
                    if (distance > max || distance < min)
                    {
                        samples3DArray[i].Disabled = true;
                    }
                }
            });
        }
예제 #4
0
        public static void PostProcess(List <Sample3D[]> samples3D, PostProcessor3D postProcessor)
        {
            var mask = postProcessor as PolarCoordHorizonMaskPostProcessor;

            var yCuttoff = mask.YCutoff;

            var rangePartitioner = Partitioner.Create(samples3D);

            Parallel.ForEach(rangePartitioner, samples3DArray =>
            {
                for (int i = 0; i < samples3DArray.Length; i++)
                {
                    // TODO: right now this is just based on a line formed by a hardcoded offset from origin Z and 0 on the Y axis. This *should* be
                    // based on the camera's line of sight.

                    // For now, just disable all samples that are below the horizon
                    if (samples3DArray[i].Position.Z < mask.PolarCoordinates.Origin.Position.Z && samples3DArray[i].Position.Y < yCuttoff)
                    {
                        samples3DArray[i].Disabled = true;
                    }
                }
            });
        }
예제 #5
0
        public static void PostProcess(List <Sample3D[]> samples3D, PostProcessor3D postProcessor)
        {
            HyperbolicCoordinatesPostProcessor hyperbolicPP = postProcessor as HyperbolicCoordinatesPostProcessor;

            var origin = hyperbolicPP.Origin.Position;
            var zScale = hyperbolicPP.ZScale;

            var rangePartitioner = Partitioner.Create(samples3D);

            Parallel.ForEach(rangePartitioner, samples3DArray =>
            {
                for (int i = 0; i < samples3DArray.Length; i++)
                {
                    var newPosition = samples3DArray[i].Position - origin;
                    newPosition.Z  *= zScale;

                    // https://stackoverflow.com/questions/23744120/conversion-from-rectangular-to-hyperbolic-coordinates-not-reversible
                    newPosition = new Vector3(newPosition.X, (float)Math.Sqrt(newPosition.Z * newPosition.Y), (float)Math.Log(newPosition.Y / newPosition.Z));

                    newPosition += origin;
                    samples3DArray[i].Position = newPosition;
                }
            });
        }