public double GetSurfaceHeight(Vector3d planetLocalPosition, int detailDensity = 1) { double height = -1; //planetLocalPosition.Normalize(); var rayFromPlanet = new RayD(Vector3d.Zero, planetLocalPosition); var chunk = rootSegments.FirstOrDefault(c => rayFromPlanet.CastRay(c.NoElevationRange).DidHit); if (chunk != null) { //lock (chunk) { int safe = 100; while (chunk.Children.Count > 0 && chunk.Children.Any(c => c.IsGenerationDone) && safe-- > 0) { foreach (var child in chunk.Children) { if (child.IsGenerationDone && rayFromPlanet.CastRay(child.NoElevationRange).DidHit) { chunk = child; } } } } var chunkLocalPosition = (planetLocalPosition - chunk.NoElevationRange.CenterPos); height = chunk.GetHeight(chunkLocalPosition); } if (GetSurfaceHeightDebug) { if (height == -1) { height = RadiusMin; if (chunk == null) { Scene.DebugShere(GetPosition(planetLocalPosition, height), 1000, new Vector4(1, 0, 0, 1)); } else { Scene.DebugShere(GetPosition(planetLocalPosition, height), 1000, new Vector4(1, 1, 0, 1)); } } else { Scene.DebugShere(GetPosition(planetLocalPosition, height), 1000, new Vector4(0, 1, 0, 1)); } } return(height); }
public double GetHeight(Vector3d chunkLocalPosition) { //var barycentricOnChunk = noElevationRange.CalculateBarycentric(planetLocalPosition); //var u = barycentricOnChunk.X; //var v = barycentricOnChunk.Y; var triangles = GetMeshTriangles(); if (triangles != null) { var ray = new RayD(-CenterPosVec3.Normalized(), chunkLocalPosition); foreach (var t in triangles) { var hit = ray.CastRay(t); if (hit.DidHit) { return((ray.GetPoint(hit.HitDistance) + CenterPosVec3).Length); } } } return(-1); }