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; }