Esempio n. 1
0
        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);
        }
Esempio n. 2
0
        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);
        }