public void GetPositionParams(ref Vector3 pos, float lodSize, out MaterialSampleParams ps, bool skipCache = false) { Vector3 localPosition = pos - m_planetShape.Center(); ps.DistanceToCenter = localPosition.Length(); ps.LodSize = lodSize; if (ps.DistanceToCenter < 0.01f) { ps.SurfaceDepth = 0; ps.Gravity = Vector3.Down; ps.Latitude = 0; ps.Longitude = 0; ps.Texcoord = Vector2.One / 2; ps.Face = 0; ps.Normal = Vector3.Backward; ps.SampledHeight = 0; return; } ps.Gravity = localPosition / ps.DistanceToCenter; MyCubemapHelpers.CalculateSampleTexcoord(ref localPosition, out ps.Face, out ps.Texcoord); // this guarantess texcoord in [0,1) if (skipCache) { ps.SampledHeight = m_planetShape.GetValueForPosition(ps.Face, ref ps.Texcoord, out ps.Normal); } else { ps.SampledHeight = m_planetShape.GetValueForPositionWithCache(ps.Face, ref ps.Texcoord, out ps.Normal); } ps.SurfaceDepth = m_planetShape.SignedDistanceWithSample(lodSize, ps.DistanceToCenter, ps.SampledHeight) * ps.Normal.Z; ps.Latitude = ps.Gravity.Y; Vector2 lon = new Vector2(-ps.Gravity.X, -ps.Gravity.Z); lon.Normalize(); ps.Longitude = lon.Y; if (-ps.Gravity.X > 0) { ps.Longitude = 2 - ps.Longitude; } }