public SusceptibleParticleSystem( ParticleSystemForceReceiver forceReceiver, float influence, ForceMaterial material ) { this.ForceReceiver = forceReceiver; this.Influence = influence; this.Material = material; }
/* TODO: make ParticleSystemForceReceiver update itself. * Query all force fields in FixedUpdate method of ParticleSystemForceReceiver, * apply forces and call FlushParticles (). This way we will flush particles only once. */ private void ApplyToParticles(float timeFactor) { var origin = Origin; float radiusSq = Radius * Radius; var susceptibleReceivers = ParticleSystemForceReceiver.GetSusceptibleReceivers(Kind); foreach (var receiverInfo in susceptibleReceivers) { var receiver = receiverInfo.ForceReceiver; var bounds = receiver.Bounds; if (bounds.SqrDistance(origin) <= radiusSq) { float influence = receiverInfo.Influence; float velocityChangeAmount = PhysicsHelper.ConvertToVelocityChange(Amount, Mode, receiver.ParticleMass); velocityChangeAmount *= influence * timeFactor * AnimatedMultiplier; int count; var particles = receiver.ReadParticles(out count); bool changed = false; for (int i = 0; i < count; i++) { var particle = particles [i]; var distanceVector = ( Vector2 )particle.position - origin; float distance = distanceVector.magnitude; if (distance < Radius) { float distanceFactor = DecreaseWithDistance ? 1 - distance / Radius : 1; float particleVelocityChangeAmount = velocityChangeAmount * distanceFactor; var direction = distanceVector.normalized; var velocityChange = direction * particleVelocityChangeAmount; particle.velocity += ( Vector3 )velocityChange; particles [i] = particle; changed = true; } } if (changed) { receiver.FlushParticles(); } } } }
/* TODO: make ParticleSystemForceReceiver update itself. * Query all force fields in FixedUpdate method of ParticleSystemForceReceiver, * apply forces and call FlushParticles (). This way we will flush particles only once. */ private void ApplyToParticles() { var susceptibleReceivers = ParticleSystemForceReceiver.GetSusceptibleReceivers(Kind); foreach (var receiverInfo in susceptibleReceivers) { var receiver = receiverInfo.ForceReceiver; float velocityChangeAmount = PhysicsHelper.ConvertToVelocityChange(Amount, Mode, receiver.ParticleMass); var velocityChange = Direction * velocityChangeAmount * receiverInfo.Influence; int count; var particles = receiver.ReadParticles(out count); for (int i = 0; i < count; i++) { particles [i].velocity += ( Vector3 )velocityChange; } receiver.FlushParticles(); } }