FParticleTrackCache.cs 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. using UnityEngine;
  2. using System.Collections.Generic;
  3. namespace Flux
  4. {
  5. public class FParticleTrackCache : FTrackCache {
  6. private List<KeyValuePair<int,ParticleSystem.Particle[]>> _particles = new List<KeyValuePair<int,ParticleSystem.Particle[]>>();
  7. public FParticleTrackCache(FTrack track)
  8. :base(track)
  9. {
  10. }
  11. protected override bool BuildInternal()
  12. {
  13. FSequence sequence = Track.Sequence;
  14. FParticleTrack particleTrack = (FParticleTrack)Track;
  15. float currentTime = sequence.CurrentTime;
  16. if( currentTime >= 0 )
  17. {
  18. sequence.Stop();
  19. }
  20. _particles.Clear();
  21. for( int frame = 0, numFrames = sequence.Length+1; frame != numFrames; ++frame )
  22. {
  23. particleTrack.UpdateEvents(frame, frame*particleTrack.Sequence.InverseFrameRate);
  24. ParticleSystem.Particle[] particleBuffer = new ParticleSystem.Particle[particleTrack.ParticleSystem.main.maxParticles];
  25. KeyValuePair<int, ParticleSystem.Particle[]> entry = new KeyValuePair<int, ParticleSystem.Particle[]>( particleTrack.ParticleSystem.GetParticles( particleBuffer ), particleBuffer );
  26. _particles.Add( entry );
  27. }
  28. sequence.Stop();
  29. if( currentTime >= 0 )
  30. {
  31. sequence.SetCurrentTime( currentTime );
  32. }
  33. return true;
  34. }
  35. protected override bool ClearInternal()
  36. {
  37. _particles.Clear();
  38. return true;
  39. }
  40. public override void GetPlaybackAt(float sequenceTime)
  41. {
  42. FParticleTrack particleTrack = (FParticleTrack)Track;
  43. int frame = (int)(sequenceTime*particleTrack.Sequence.FrameRate);
  44. particleTrack.ParticleSystem.SetParticles( _particles[frame].Value, _particles[frame].Key );
  45. }
  46. }
  47. }