| 48 | } |
| 49 | |
| 50 | BytesContainer ParticleSystem::LoadTimeline() const |
| 51 | { |
| 52 | BytesContainer result; |
| 53 | ScopeLock lock(Locker); |
| 54 | |
| 55 | // Serialize timeline to stream |
| 56 | MemoryWriteStream stream(512); |
| 57 | { |
| 58 | // Save properties |
| 59 | stream.WriteInt32(4); |
| 60 | stream.WriteFloat(FramesPerSecond); |
| 61 | stream.WriteInt32(DurationFrames); |
| 62 | |
| 63 | // Save emitters |
| 64 | const int32 emittersCount = Emitters.Count(); |
| 65 | stream.WriteInt32(emittersCount); |
| 66 | |
| 67 | // Save tracks |
| 68 | const int32 tracksCount = Tracks.Count(); |
| 69 | stream.WriteInt32(tracksCount); |
| 70 | for (int32 i = 0; i < tracksCount; i++) |
| 71 | { |
| 72 | const auto& track = Tracks[i]; |
| 73 | |
| 74 | stream.WriteByte((byte)track.Type); |
| 75 | stream.WriteByte((byte)track.Flag); |
| 76 | stream.WriteInt32(track.ParentIndex); |
| 77 | stream.WriteInt32(track.ChildrenCount); |
| 78 | stream.Write(track.Name, -13); |
| 79 | stream.Write(track.Color); |
| 80 | |
| 81 | Guid id; |
| 82 | switch (track.Type) |
| 83 | { |
| 84 | case Track::Types::Emitter: |
| 85 | id = Emitters[track.AsEmitter.Index].GetID(); |
| 86 | stream.Write(id); |
| 87 | stream.WriteInt32(track.AsEmitter.Index); |
| 88 | stream.WriteInt32(track.AsEmitter.StartFrame); |
| 89 | stream.WriteInt32(track.AsEmitter.DurationFrames); |
| 90 | break; |
| 91 | case Track::Types::Folder: |
| 92 | break; |
| 93 | default: |
| 94 | return result; |
| 95 | } |
| 96 | } |
| 97 | |
| 98 | // Save parameters overrides |
| 99 | if (EmittersParametersOverrides.HasItems()) |
| 100 | { |
| 101 | stream.WriteInt32(EmittersParametersOverrides.Count()); |
| 102 | for (auto i = EmittersParametersOverrides.Begin(); i.IsNotEnd(); ++i) |
| 103 | { |
| 104 | stream.WriteInt32(i->Key.First); |
| 105 | stream.Write(i->Key.Second); |
| 106 | stream.Write(i->Value); |
| 107 | } |