public IInterpolater[] interpolaters = { new LinearInterpolater() }; // default to using LERP for everything protected override sealed void effectParticle(SSParticle particle, float deltaT) { _timeSinceReset += deltaT; float timeElapsed = float.IsNaN(particleLifetime) ? _timeSinceReset : (1f - particle.life / particleLifetime); float lastKey = keyframes.Keys [keyframes.Count - 1]; if (timeElapsed > lastKey) { applyValue(particle, keyframes [lastKey]); } else { float prevKey = keyframes.Keys [0]; for (int i = 1; i < keyframes.Keys.Count; ++i) { float key = keyframes.Keys [i]; if (timeElapsed < key) { IInterpolater interpolater = i < interpolaters.Length ? interpolaters [i] : interpolaters[interpolaters.Length - 1]; float progression = (timeElapsed - prevKey) / (key - prevKey); T value = computeValue(interpolater, keyframes [prevKey], keyframes [key], progression); applyValue(particle, value); break; } prevKey = key; } } }
protected override Color4 computeValue(IInterpolater interpolater, Color4 prevFrame, Color4 nextKeyframe, float ammount) { return(new Color4( interpolater.compute(prevFrame.R, nextKeyframe.R, ammount), interpolater.compute(prevFrame.G, nextKeyframe.G, ammount), interpolater.compute(prevFrame.B, nextKeyframe.B, ammount), interpolater.compute(prevFrame.A, nextKeyframe.A, ammount))); }
protected override Vector3 computeValue(IInterpolater interpolater, Vector3 prevKeyframe, Vector3 nextKeyframe, float ammount) { return(new Vector3( interpolater.compute(prevKeyframe.X, nextKeyframe.X, ammount), interpolater.compute(prevKeyframe.Y, nextKeyframe.Y, ammount), interpolater.compute(prevKeyframe.Z, nextKeyframe.Z, ammount) )); }
protected override float computeValue(IInterpolater interpolater, float prevKeyframe, float nextKeyframe, float ammount) { return(interpolater.compute(prevKeyframe, nextKeyframe, ammount)); }
protected abstract T computeValue(IInterpolater interpolater, T prevFrame, T nextKeyframe, float ammount);