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; } } }); }
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; } } }
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; } } }); }
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; } } }); }
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; } }); }