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;
        }
Example #4
0
        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);
        }