Пример #1
0
        public void Execute(int index)
        {
            float2 position = particles[index].position;
            int    hash     = GridHashUtilities.Hash(position, radius);

            hashMap.Add(hash, index);
        }
Пример #2
0
        public void Execute(int index)
        {
            float2 forcePressure  = 0;
            float2 forceViscosity = 0;

            WaterParticle2D pi = particles[index];

            for (int i = 0; i < cellOffset.Length; i++)
            {
                float2 position    = pi.position + (float2)cellOffset[i] * particleRadius;
                int    bucketIndex = GridHashUtilities.Hash(position, particleRadius);

                NativeMultiHashMapIterator <int> iterator;
                bool hasValue = hashMap.TryGetFirstValue(bucketIndex, out int j, out iterator);

                while (hasValue)
                {
                    if (index == j)
                    {
                        hasValue = hashMap.TryGetNextValue(out j, ref iterator);
                        continue;
                    }

                    WaterParticle2D pj   = readOnlyParticles[j]; // particles[j];
                    float2          diff = pj.position - pi.position;

                    float distanceSquared = math.lengthsq(diff);
                    if (distanceSquared < particleRadiusSquared)
                    {
                        float  distance      = math.sqrt(distanceSquared);
                        float  radiusRatio   = particleRadius - distance;
                        float2 normalizedDir = diff / distance;

                        forcePressure  += -normalizedDir * MASS * (pi.pressure + pj.pressure) / (2f * pj.density) * SPIKY_GRAD * radiusRatio * radiusRatio;
                        forceViscosity += VISC * MASS * (pj.velocity - pi.velocity) / pj.density * VISC_LAP * (particleRadius - distance);
                    }
                    hasValue = hashMap.TryGetNextValue(out j, ref iterator);
                }
            }

            float2 forceFravity = GRAVITY * pi.density;

            pi.force         = forcePressure + forceViscosity + forceFravity;
            particles[index] = pi;
        }
Пример #3
0
        public void Execute(int index)
        {
            WaterParticle2D pi = particles[index];

            pi.density = 0;

            for (int i = 0; i < cellOffset.Length; i++)
            {
                float2 position    = pi.position + (float2)cellOffset[i] * particleRadius;
                int    bucketIndex = GridHashUtilities.Hash(position, particleRadius);

                NativeMultiHashMapIterator <int> iterator;
                bool hasValue = hashMap.TryGetFirstValue(bucketIndex, out int j, out iterator);

                while (hasValue)
                {
                    WaterParticle2D pj = readOnlyParticles[j]; // particles[j];

                    float2 diff       = pj.position - pi.position;
                    float  distanceSq = math.lengthsq(diff);
                    if (distanceSq < particleRadiusSquared)
                    {
                        float ratio = particleRadius - math.sqrt(distanceSq);
                        pi.density += MASS * POLY6 * ratio * ratio * ratio;

                        //float squaredRatio = particleRadiusSquared - distanceSq;
                        //pi.density += MASS * POLY6 * squaredRatio * squaredRatio * squaredRatio;
                    }

                    hasValue = hashMap.TryGetNextValue(out j, ref iterator);
                }
            }

            pi.pressure      = GAS_CONST * (pi.density - REST_DENS);
            particles[index] = pi;
        }