public void Execute(int index) { float2 position = particles[index].position; int hash = GridHashUtilities.Hash(position, radius); hashMap.Add(hash, index); }
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; }
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; }