void FixedUpdateBuoyancy(ICollProvider collProvider) { float archimedesForceMagnitude = WATER_DENSITY * Mathf.Abs(Physics.gravity.y); for (int i = 0; i < _forcePoints.Length; i++) { FloaterForcePoints point = _forcePoints[i]; var transformedPoint = transform.TransformPoint(point._offsetPosition + new Vector3(0, _centerOfMass.y, 0)); Vector3 undispPos; if (!collProvider.ComputeUndisplacedPosition(ref transformedPoint, _samplingData, out undispPos)) { // If we couldn't get wave shape, assume flat water at sea level undispPos = transformedPoint; undispPos.y = OceanRenderer.Instance.SeaLevel; } Vector3 displaced; collProvider.SampleDisplacement(ref undispPos, _samplingData, out displaced); var dispPos = undispPos + displaced; var heightDiff = dispPos.y - transformedPoint.y; if (heightDiff > 0) { RB.AddForceAtPosition(archimedesForceMagnitude * heightDiff * Vector3.up * point._weight * _forceMultiplier / _totalWeight, transformedPoint); } } }
void FixedUpdateBuoyancy() { float archimedesForceMagnitude = WATER_DENSITY * Mathf.Abs(Physics.gravity.y); var collProvider = OceanRenderer.Instance.CollisionProvider; for (int i = 0; i < ForcePoints.Length; i++) { FloaterForcePoints point = ForcePoints[i]; var transformedPoint = transform.TransformPoint(point._offsetPosition + new Vector3(0, _centerOfMass.y, 0)); Vector3 undispPos; if (!collProvider.ComputeUndisplacedPosition(ref transformedPoint, out undispPos, _minSpatialLength)) { // If we couldn't get wave shape, assume flat water at sea level undispPos = transformedPoint; undispPos.y = OceanRenderer.Instance.SeaLevel; } var waterSurfaceVel = Vector3.zero; bool dispValid, velValid; collProvider.SampleDisplacementVel(ref undispPos, out point._displaced, out dispValid, out waterSurfaceVel, out velValid, _minSpatialLength); var dispPos = undispPos + point._displaced; float height; collProvider.SampleHeight(ref transformedPoint, out height, _minSpatialLength); float distance = dispPos.y - transformedPoint.y; if (height - transformedPoint.y > 0) { _rb.AddForceAtPosition(archimedesForceMagnitude * distance * Vector3.up * point._factor * _forceMultiplier, transformedPoint); } } }