void ApplyImpulses(FlexContainer.ParticleData _particleData) { if (m_currentAsset && m_instanceHandle) { FlexExt.Instance instance = m_instanceHandle.instance; int[] indices = new int[instance.numParticles]; FlexUtils.FastCopy(instance.particleIndices, indices); foreach (var info in m_impulses) { if (info.impulse.sqrMagnitude < float.Epsilon) { continue; } float mass = 0; foreach (var index in indices) { if (info.particle == -1 || info.particle == index) { Vector4 particle = _particleData.GetParticle(index); mass += 1.0f / particle.w; } } if (mass < float.Epsilon) { continue; } Vector3 velocityChange = info.impulse / mass; foreach (var index in indices) { _particleData.SetVelocity(index, _particleData.GetVelocity(index) + velocityChange); } } } }
void MoveFixedParticles(FlexContainer.ParticleData _particleData) { if (Application.isPlaying) { if (m_currentAsset && m_currentAsset.fixedParticles.Length > 0 && m_instanceHandle) { FlexExt.Instance instance = m_instanceHandle.instance; Vector4[] particles = m_currentAsset.particles; foreach (var index in m_currentAsset.fixedParticles) { if (index < particles.Length) { Vector4 particle = transform.TransformPoint(particles[index]); particle.w = 0.0f; _particleData.SetParticle(indices[index], particle); } } } } else { if (m_currentAsset && m_instanceHandle) { FlexExt.Instance instance = m_instanceHandle.instance; Vector4[] particles = m_currentAsset.particles; for (int i = 0; i < particles.Length; ++i) { Vector4 particle = transform.TransformPoint(particles[i]); particle.w = _particleData.GetParticle(indices[i]).w; _particleData.SetParticle(indices[i], particle); } } } }
void TeleportParticles(FlexContainer.ParticleData _particleData) { Matrix4x4 offset = Matrix4x4.TRS(m_teleportPosition, Quaternion.identity, Vector3.one) * Matrix4x4.TRS(Vector3.zero, m_teleportRotation, Vector3.one) * Matrix4x4.TRS(Vector3.zero, Quaternion.Inverse(transform.rotation), Vector3.one) * Matrix4x4.TRS(-transform.position, Quaternion.identity, Vector3.one); if (m_currentAsset && m_instanceHandle) { FlexExt.Instance instance = m_instanceHandle.instance; int[] indices = new int[instance.numParticles]; FlexUtils.FastCopy(instance.particleIndices, indices); foreach (var index in indices) { Vector4 particle = _particleData.GetParticle(index); float storeW = particle.w; particle = offset.MultiplyPoint3x4(particle); particle.w = storeW; _particleData.SetParticle(index, particle); _particleData.SetVelocity(index, Vector3.zero); } } transform.position = m_teleportPosition; transform.rotation = m_teleportRotation; transform.hasChanged = false; }
protected override void OnFlexUpdate(FlexContainer.ParticleData _particleData) { if (Application.isPlaying && m_referencePoints != null && m_referencePoints.Length >= 3) { Vector3 p0 = _particleData.GetParticle(m_referencePoints[0]); Vector3 p1 = _particleData.GetParticle(m_referencePoints[1]); Vector3 p2 = _particleData.GetParticle(m_referencePoints[2]); Vector3 clothZ = Vector3.Cross(p1 - p0, p2 - p0).normalized, clothY = Vector3.Cross(clothZ, p1 - p0).normalized; Quaternion globalRotation = Quaternion.LookRotation(clothZ, clothY) * Quaternion.Inverse(m_localRotation); Vector3 globalPosition = (p0 + p1 + p2) / 3 - globalRotation * m_localPosition; transform.position = globalPosition; transform.rotation = globalRotation; transform.hasChanged = false; } base.OnFlexUpdate(_particleData); }
void OnFlexUpdate(FlexContainer.ParticleData _particleData) { FlexActor actor = GetComponent <FlexActor>(); if (actor is FlexSourceActor) { FlexSourceActor sourceActor = actor as FlexSourceActor; var main = m_particleSystem.main; float time = Time.time - Time.fixedTime; int[] indices = sourceActor.indices; int indexCount = sourceActor.indexCount; float[] ages = sourceActor.ages; m_particleSystem.Clear(); m_particleSystem.Emit(indices.Length); if (m_particles.Length != indexCount) { m_particles = new ParticleSystem.Particle[indexCount]; } float startLifetime = main.startLifetime.Evaluate(0); Color32 startColor = main.startColor.Evaluate(0); float startSize = main.startSize.Evaluate(0); for (int i = 0; i < indexCount; ++i) { ParticleSystem.Particle p = m_particles[i]; p.velocity = _particleData.GetVelocity(indices[i]);; p.position = (Vector3)_particleData.GetParticle(indices[i]) + p.velocity * (time - Time.fixedDeltaTime); p.remainingLifetime = ages[i] - time; p.startLifetime = startLifetime; p.startColor = startColor; p.startSize = startSize; m_particles[i] = p; } //m_particleSystem.SetParticles(m_particles, m_particles.Length); } else if (actor) { var main = m_particleSystem.main; float time = Time.time - Time.fixedTime; int[] indices = actor.indices; int indexCount = actor.indexCount; //m_particleSystem.Clear(); //m_particleSystem.Emit(indices.Length); if (m_particles.Length != indexCount) { m_particles = new ParticleSystem.Particle[indexCount]; } Color32 startColor = main.startColor.Evaluate(0); float startSize = main.startSize.Evaluate(0); for (int i = 0; i < indexCount; ++i) { ParticleSystem.Particle p = m_particles[i]; p.velocity = _particleData.GetVelocity(indices[i]); p.position = (Vector3)_particleData.GetParticle(indices[i]) + p.velocity * (time - Time.fixedDeltaTime); p.remainingLifetime = m_particleSystem.main.startLifetime.Evaluate(0); p.startLifetime = p.remainingLifetime; p.startColor = startColor; p.startSize = startSize; m_particles[i] = p; } //m_particleSystem.SetParticles(m_particles, m_particles.Length); } m_particleSystem.SetParticles(m_particles, m_particles.Length); }