private void ComputeBounds(out ushort[] lowerValues, out ushort[] upperValues, AABB aabb)
{
lowerValues = new ushort[2];
upperValues = new ushort[2];
Box2DXDebug.Assert(aabb.UpperBound.x >= aabb.LowerBound.x);
Box2DXDebug.Assert(aabb.UpperBound.y >= aabb.LowerBound.y);
Vector2 minVertex = Common.Math.Clamp(aabb.LowerBound, _worldAABB.LowerBound, _worldAABB.UpperBound);
Vector2 maxVertex = Common.Math.Clamp(aabb.UpperBound, _worldAABB.LowerBound, _worldAABB.UpperBound);
// Bump lower bounds downs and upper bounds up. This ensures correct sorting of
// lower/upper bounds that would have equal values.
// TODO_ERIN implement fast float to uint16 conversion.
lowerValues[0] = (ushort)((ushort)(_quantizationFactor.x * (minVertex.x - _worldAABB.LowerBound.x)) & (BROADPHASE_MAX - 1));
upperValues[0] = (ushort)((ushort)(_quantizationFactor.x * (maxVertex.x - _worldAABB.LowerBound.x)) | 1);
lowerValues[1] = (ushort)((ushort)(_quantizationFactor.y * (minVertex.y - _worldAABB.LowerBound.y)) & (BROADPHASE_MAX - 1));
upperValues[1] = (ushort)((ushort)(_quantizationFactor.y * (maxVertex.y - _worldAABB.LowerBound.y)) | 1);
}