private void SimulateBuoyancy(FluidVolume fluidVolume) { Bounds bounds = buoyancyCollider.bounds; bounds.Expand(boundsExtentBias); float tangentOffset = bounds.size.x / (float)samples; float bitangentOffset = bounds.size.z / (float)samples; float impulse = -Physics.gravity.y * Time.fixedDeltaTime; if (useWeighting) { impulse *= (weightFactor + weightFactorBias) * GetComponent <Rigidbody>().mass *inverseVolume; } else { impulse *= fluidVolume.density; } Vector3 min = new Vector3(bounds.min.x, fluidVolume.GetComponent <Collider>().bounds.min.y, bounds.min.z); for (int x = 0; x < samples; x++) { for (int z = 0; z < samples; z++) { Vector3 offset = new Vector3(tangentOffset * ((float)x + 0.5f), 0.0f, bitangentOffset * ((float)z + 0.5f)); Vector3 start = min + offset; ApplySampleImpulse(start, tangentOffset, bitangentOffset, fluidVolume.RelativeHeightAtPoint(start), impulse); } } }