Beispiel #1
0
    // Update is called once per frame
    void Update()
    {
        ParticleSystem.Particle[] targetParticles;
        var nTargetParticles = target.GetParticles(out targetParticles);

        if (nTargetParticles <= 0)
        {
            return;
        }

        var points = targetParticles.Where((p, j) => j < nTargetParticles).Select(p => p.position).ToArray();

        _knn.build(points, Enumerable.Range(0, points.Length).ToArray());

        var startColor = target.shuriken.startColor;

        for (int i = 0; i < nTargetParticles; i++)
        {
            targetParticles[i].color = startColor;
        }
        foreach (var c in centers)
        {
            var targetIndices = _knn.knearest(c.pos.position, c.nFriends);
            var limit         = targetIndices.Length;
            var skips         = (int)(0.9f * limit);
            for (var i = 0; i < limit; i++)
            {
                var iTarget = targetIndices[i];
                targetParticles[iTarget].color = c.color;
            }
        }

        target.SetParticles(targetParticles, nTargetParticles);
    }
Beispiel #2
0
    // Update is called once per frame
    void Update()
    {
        ParticleSystem.Particle[] targetParticles;
        var nTargetParticles = target.GetParticles(out targetParticles);

        ParticleSystem.Particle[] modParticles;
        var nModParticles = modulator.GetParticles(out modParticles);

        if (nTargetParticles <= 0 || nModParticles <= 0)
        {
            return;
        }

        var points = targetParticles.Where((p, j) => j < nTargetParticles).Select(p => p.position).ToArray();

        _targetKnn.build(points, Enumerable.Range(0, points.Length).ToArray());

        var startColor = target.shuriken.startColor;

        for (var iTarget = 0; iTarget < nTargetParticles; iTarget++)
        {
            var color = targetParticles[iTarget].color;
            targetParticles[iTarget].color = new Color32(
                (byte)(color.r + 0.11f * startColor.r),
                (byte)(color.g + 0.11f * startColor.g),
                (byte)(color.b + 0.11f * startColor.b),
                (byte)(color.a + 0.11f * startColor.a));
        }

        var sqrModRadius = modRadius * modRadius;

        for (int iMod = 0; iMod < nModParticles; iMod++)
        {
            var pMod          = modParticles[iMod];
            var targetIndices = _targetKnn.knearest(pMod.position, kNumber);
            var color         = pMod.color;
            foreach (var iTarget in targetIndices)
            {
                var pTarget = targetParticles[iTarget];
                if (sqrModRadius < (pTarget.position - pMod.position).sqrMagnitude)
                {
                    continue;
                }
                pTarget.color            = color;
                targetParticles[iTarget] = pTarget;
            }
        }

        target.SetParticles(targetParticles, nTargetParticles);
    }
Beispiel #3
0
    // Update is called once per frame
    void Update()
    {
        ParticleSystem.Particle[] targetParticles;
        var nTargetParticles = target.GetParticles(out targetParticles);

        ParticleSystem.Particle[] modParticles;
        var nModParticles = modulator.GetParticles(out modParticles);

        if (nTargetParticles <= 0 || nModParticles <= 0)
        {
            return;
        }

        var points = modParticles.Where((p, j) => j < nModParticles).Select(p => p.position).ToArray();

        _modulatorKnn.build(points, Enumerable.Range(0, points.Length).ToArray());

        var sqrModRadius = modRadius * modRadius;

        for (int iTarget = 0; iTarget < nTargetParticles; iTarget++)
        {
            var pTarget     = targetParticles[iTarget];
            var modIndices  = _modulatorKnn.knearest(pTarget.position, kNumber);
            var count       = 0;
            var sumVelocity = Vector3.zero;
            foreach (var iMod in modIndices)
            {
                var pMod = modParticles[iMod];
                if (sqrModRadius < (pTarget.position - pMod.position).sqrMagnitude)
                {
                    continue;
                }
                sumVelocity += modParticles[iMod].velocity;
                count++;
            }
#if true
            if (count == 0)
            {
                continue;
            }
            pTarget.velocity         = (1f - modulation) * pTarget.velocity + modulation * sumVelocity / count;
            targetParticles[iTarget] = pTarget;
#endif
        }

        target.SetParticles(targetParticles, nTargetParticles);
    }
Beispiel #4
0
    // Update is called once per frame
    void Update()
    {
        ParticleSystem.Particle[] targetParticles;
        var nTargetParticles = target.GetParticles(out targetParticles);

        if (nTargetParticles <= 0)
        {
            return;
        }

        var points = targetParticles.Where((p, j) => j < nTargetParticles).Select(p => p.position).ToArray();

        _knn.build(points, Enumerable.Range(0, points.Length).ToArray());

        var sqrModRadius = modRadius * modRadius;

        for (int iMe = 0; iMe < nTargetParticles; iMe++)
        {
            var pMe             = targetParticles[iMe];
            var particleIndices = _knn.knearest(pMe.position, kNumber);
            var count           = 0;
            var sumVelocity     = Vector3.zero;
            foreach (var iNeighbor in particleIndices)
            {
                if (iMe == iNeighbor)
                {
                    continue;
                }
                var pNeighbor = targetParticles[iNeighbor];
                if (sqrModRadius < (pMe.position - pNeighbor.position).sqrMagnitude)
                {
                    continue;
                }
                sumVelocity += pNeighbor.velocity;
                count++;
            }

            if (count == 0)
            {
                continue;
            }
            pMe.velocity         = (1f - modulation) * pMe.velocity + (modulation / count) * sumVelocity;
            targetParticles[iMe] = pMe;
        }

        target.SetParticles(targetParticles, nTargetParticles);
    }