コード例 #1
0
        internal void Dispatch()
        {
            if (useBoidsFlocking)
            {
                if (m_boidsFlock == null)
                {
                    CreateBoids();
                }

                m_boidsFlock.UpdateBoids(SystemComp.transform);
            }

            if (MaxForces == 0)
            {
                return;
            }

            if (m_forcesCount[0] > 0)
            {
                m_forcesBuffer[0].SetData(m_forcesStruct[0]);
                ComputeShader.SetBuffer(UpdateForcesKernel, SID._Forces, m_forcesBuffer[0]);
                Manager.BindPariclesToKernel(ComputeShader, UpdateForcesKernel);
                ComputeShader.Dispatch(UpdateForcesKernel, Manager.DispatchCount, m_forcesCount[0], 1);
            }

            if (m_forcesCount[1] > 0)
            {
                m_forcesBuffer[1].SetData(m_forcesStruct[1]);
                ComputeShader.SetBuffer(UpdateTurbulenceForcesKernel, SID._TurbulenceForces, m_forcesBuffer[1]);

                for (int k = 0; k < m_forcesCount[1]; ++k)
                {
                    TCForce force = m_forcesReference[1][k];

                    if (force.CurrentForceVolume == null)
                    {
                        continue;
                    }

                    ComputeShader.SetTexture(UpdateTurbulenceForcesKernel, SID._TurbulenceTexture, force.CurrentForceVolume);

                    Matrix4x4 rotation = Matrix4x4.TRS(Vector3.zero, force.transform.rotation, Vector3.one);
                    TCHelper.SetMatrix(ComputeShader, SID._TurbulenceRotation, rotation);
                    TCHelper.SetMatrix(ComputeShader, SID._TurbulenceRotationInv, rotation.inverse);

                    //TODO: Just bind one force?
                    ComputeShader.SetInt("turbulenceKernelOffset", k);

                    Manager.BindPariclesToKernel(ComputeShader, UpdateTurbulenceForcesKernel);
                    ComputeShader.Dispatch(UpdateTurbulenceForcesKernel, Manager.DispatchCount, 1, 1);
                }
            }
        }
コード例 #2
0
        void UpdateMatrix(ParticleEmitterShape emitShape, Transform trans)
        {
            var localScale = trans.localScale;

            Profiler.BeginSample("Set matrices");
            Matrix4x4 id = Matrix4x4.identity;

            switch (Manager.SimulationSpace)
            {
            case Space.World:
                var rot = trans.rotation;
                if (m_lastRot != rot || m_lastScale != localScale)
                {
                    m_emitMatrix         = Matrix4x4.TRS(Vector3.zero, rot, localScale);
                    m_emitRotationMatrix = Matrix4x4.TRS(Vector3.zero, rot, Vector3.one);
                    m_lastRot            = rot;
                    m_lastScale          = localScale;
                }

                TCHelper.SetMatrix(ComputeShader, SID._EmitterMatrix, m_emitMatrix);
                TCHelper.SetMatrix(ComputeShader, SID._EmitterRotationMatrix, m_emitRotationMatrix);

                break;

            case Space.Local:
                TCHelper.SetMatrix(ComputeShader, SID._EmitterMatrix, Matrix4x4.TRS(Vector3.zero, Quaternion.identity, localScale));
                TCHelper.SetMatrix(ComputeShader, SID._EmitterRotationMatrix, id);
                break;

            case Space.LocalWithScale:
                TCHelper.SetMatrix(ComputeShader, SID._EmitterMatrix, id);
                TCHelper.SetMatrix(ComputeShader, SID._EmitterRotationMatrix, id);
                break;

            case Space.Parent:
                if (trans.parent != null)
                {
                    var rot2 = trans.localRotation;
                    TCHelper.SetMatrix(ComputeShader, SID._EmitterMatrix, Matrix4x4.TRS(Vector3.zero, rot2, localScale));
                    TCHelper.SetMatrix(ComputeShader, SID._EmitterRotationMatrix, Matrix4x4.TRS(Vector3.zero, rot2, Vector3.one));
                }
                break;
            }

            if (emitShape.startDirectionType == StartDirection.Vector)
            {
                TCHelper.SetMatrix(ComputeShader, SID._EmitterStartRotationMatrix,
                                   Matrix4x4.TRS(Vector3.zero, Quaternion.FromToRotation(Vector3.forward, emitShape.startDirectionVector), Vector3.one));
            }

            Profiler.EndSample();
        }