40 private int currentSampleIndex;
45 private Vector3[] samples;
50 private Vector3 cumulativeFrame;
55 private Vector3 cumulativeFrameSquared;
60 private int cumulativeFrameSamples;
66 private int maxSamples;
72 public void Init(
int sampleCount)
74 maxSamples = sampleCount;
75 samples =
new Vector3[sampleCount];
84 currentSampleIndex = 0;
85 ActualSampleCount = 0;
86 cumulativeFrame = Vector3.zero;
87 cumulativeFrameSquared = Vector3.zero;
88 cumulativeFrameSamples = 0;
89 CurrentStandardDeviation = 0.0f;
90 StandardDeviationDeltaAfterLatestSample = 0.0f;
91 StandardDeviationsAwayOfLatestSample = 0.0f;
92 Average = Vector3.zero;
95 for (
int index = 0; index < samples.Length; index++)
97 samples[index] = Vector3.zero;
114 Vector3 oldSample = samples[currentSampleIndex];
115 cumulativeFrame -= oldSample;
116 cumulativeFrameSquared -= (oldSample.Mul(oldSample));
119 samples[currentSampleIndex] = value;
120 cumulativeFrame += value;
121 cumulativeFrameSquared += value.Mul(value);
124 cumulativeFrameSamples++;
125 ActualSampleCount = Mathf.Min(maxSamples, cumulativeFrameSamples);
128 Vector3 deltaFromAverage = (Average - value);
129 float oldStandardDeviation = CurrentStandardDeviation;
130 StandardDeviationsAwayOfLatestSample = oldStandardDeviation == 0 ? 0 : (deltaFromAverage / oldStandardDeviation).magnitude;
135 Average = cumulativeFrame / ActualSampleCount;
136 float newStandardDev = Mathf.Sqrt((cumulativeFrameSquared / ActualSampleCount - Average.Mul(Average)).magnitude);
137 StandardDeviationDeltaAfterLatestSample = oldStandardDeviation - newStandardDev;
138 CurrentStandardDeviation = newStandardDev;
141 currentSampleIndex = (currentSampleIndex + 1) % maxSamples;