public void GetResultEOF(ref ParticleDataSnapshot storeTo)
        {
            ParticleSystem[] systems = GameObject.FindObjectsOfType<ParticleSystem>();
            SGenericParticleSystem[] surrogates = new SGenericParticleSystem[systems.Length];

            if(systems != null && systems.Length > 0){
                int i = systems.Length;
                while(--i > -1)                {
                    ParticleSystem system = systems[i];
                    if (system == null)
                        continue;

                    //--------------- Check if captureable --------------------
                    int id = system.GetInstanceID();
                    if (flaggedAsCapturable.ContainsKey(id)) {
                        if (!flaggedAsCapturable[id])
                            continue;
                    } else {
                        bool isCaptureable = GameObjectUtility.GetComponentInParent<vBugParticleRecordable>(system.gameObject) != null;
                        flaggedAsCapturable.Add(id, isCaptureable);

                        if (!isCaptureable)
                            continue;
                    }
                    //--------------- Check if captureable --------------------

                    Renderer renderer = system.GetComponent<Renderer>();
                    if (renderer == null || !(renderer is ParticleSystemRenderer))
                        continue;

                    ParticleSystem.Particle[] particles = GetParticleBuffer(system.particleCount); //fetch buffer;
                    int maxParticles = system.GetParticles(particles);

                    //--------------- Local to world --------------------
                    Matrix4x4 m = system.transform.localToWorldMatrix;
                    if (system.simulationSpace == ParticleSystemSimulationSpace.Local) {
                        for (int p = 0; p < maxParticles; p++)
                            particles[p].position = m.MultiplyPoint(particles[p].position);
                    }
                    //--------------- Local to world --------------------

                    SGenericParticleSystem surrogate = new SGenericParticleSystem(system, (ParticleSystemRenderer)renderer, particles, maxParticles);
                    surrogate.renderer.materialInstanceID = MaterialDataGrabber.RegisterMaterial(system);
                    surrogates[i] = surrogate;
                    buffers.Add(particles); //store buffer

                }
            }

            storeTo.particleSystems.AddRange(surrogates);
        }
        public void GetResultEOF(ref ParticleDataSnapshot storeTo)
        {
            ParticleEmitter[] emitters = GameObject.FindObjectsOfType<ParticleEmitter>();
            SGenericParticleSystem[] surrogates = new SGenericParticleSystem[emitters.Length];

            int e = 0;
            if (emitters != null && emitters.Length > 0) {
                int i = emitters.Length;
                while (--i > -1){
                    ParticleEmitter emitter = emitters[i];

                    //--------------- Check if captureable --------------------
                    int id = emitter.GetInstanceID();
                    if (flaggedAsCapturable.ContainsKey(id)) {
                        if (!flaggedAsCapturable[id])
                            continue;
                    } else {
                        bool isCaptureable = GameObjectUtility.GetComponentInParent<vBugParticleRecordable>(emitter.gameObject) != null;
                        flaggedAsCapturable.Add(id, isCaptureable);

                        if(!isCaptureable)
                            continue;
                    }
                    //--------------- Check if captureable --------------------

                    ParticleRenderer renderer = emitter.gameObject.GetComponent<ParticleRenderer>();
                    if (renderer != null){
                        Particle[] particles = emitter.particles;

                        if (!emitter.useWorldSpace) {
                            Matrix4x4 m = emitter.transform.localToWorldMatrix;
                            for (int p = 0; p < particles.Length; p++)
                                particles[p].position = m.MultiplyPoint(particles[p].position);
                        }

                        SGenericParticleSystem surrogate = new SGenericParticleSystem(emitter, renderer, particles);
                        surrogate.renderer.materialInstanceID = MaterialDataGrabber.RegisterMaterial(renderer);
                        surrogates[e++] = surrogate;
                    }
                }
            }

            if (e != emitters.Length)
                Array.Resize(ref surrogates, e);

            storeTo.particleSystems.AddRange(surrogates);
        }
        //--------------- Serialize / Deserialize --------------------
        public static byte[] Serialize(SGenericParticleSystem input)
        {
            if (input == null)
                return null;

            ComposedPrimitives prims = new ComposedPrimitives();
            prims.AddValue(input.instanceID);
            prims.AddValue(input.goInstanceID);
            prims.AddValue(input.isLegacy);
            prims.AddValue(input.isWorldSpace);
            prims.AddValue(input.emit);
            prims.AddValue(input.enabled);
            prims.AddValue(input.position.x);
            prims.AddValue(input.position.y);
            prims.AddValue(input.position.z);

            ComposedByteStream stream = ComposedByteStream.FetchStream(4);
            stream.AddStream(prims.Compose());
            stream.AddStream(input.name);
            stream.AddStream(SParticleRenderer.Serialize(input.renderer));
            stream.AddStream(SGenericParticleArray.Serialize(input.particles));
            return stream.Compose();
        }
        public static SGenericParticleSystem Deserialize(byte[] input)
        {
            if (input == null || input.Length == 0)
                return null;

            SGenericParticleSystem result = new SGenericParticleSystem();
            ComposedByteStream stream = ComposedByteStream.FromByteArray(input);
            ComposedPrimitives prims = ComposedPrimitives.FromByteArray(stream.ReadNextStream<byte>());
            result.name = stream.ReadNextStream();
            result.renderer = SParticleRenderer.Deserialize(stream.ReadNextStream<byte>());
            result.particles = SGenericParticleArray.Deserialize(stream.ReadNextStream<byte>());

            result.instanceID = prims.ReadNextValue<int>();
            result.goInstanceID = prims.ReadNextValue<int>();
            result.isLegacy = prims.ReadNextValue<bool>();
            result.isWorldSpace = prims.ReadNextValue<bool>();
            result.emit = prims.ReadNextValue<bool>();
            result.enabled = prims.ReadNextValue<bool>();
            result.position = new Vector3(
                prims.ReadNextValue<float>(),
                prims.ReadNextValue<float>(),
                prims.ReadNextValue<float>());

            stream.Dispose();
            return result;
        }