public void BuildVertices()
        {
            var mesh = GetMesh();

            mesh.Clear(false);

            Bounds.Clear();

            var step = Terrain.NormalStep;

            if (Terrain.Normals == SgtTerrain.NormalType.QuadStep)
            {
                var verts = (2 << Terrain.Subdivisions) + 1;
                var scale = 1 << Depth;

                step = 1.0f / (verts * scale);
            }

            SgtTerrainCompute.BeginFace(Terrain.ForceCPU);
            SgtTerrainCompute.SetFaceCorners(Side, CornerBL, CornerBR, CornerTL);
            SgtTerrainCompute.SetMain(Terrain.Radius, step, Terrain.NormalStrength, Terrain.HeightMap, Terrain.HeightScale);
            SgtTerrainCompute.SetDetail(Terrain.MaskMap, Terrain.DetailTiling, Terrain.DetailMapA, Terrain.DetailScaleA, Terrain.DetailMapB, Terrain.DetailScaleB);
            SgtTerrainCompute.DispatchFace(mesh, Terrain.Subdivisions, ref Bounds, Terrain.CenterMesh);

            Terrain.PositionChanged(Terrain.transform, this);

            //mesh.RecalculateBounds();
        }
        public SgtTerrainCompute.Output SampleLocalOutput(SgtVector3D localPoint)
        {
            SgtTerrainCompute.BeginPoint(ForceCPU);
            SgtTerrainCompute.SetMain(Radius, NormalStep, NormalStrength, HeightMap, HeightScale);
            SgtTerrainCompute.SetDetail(MaskMap, DetailTiling, DetailMapA, DetailScaleA, DetailMapA, DetailScaleB);

            return(SgtTerrainCompute.DispatchPoint((Vector3)localPoint));
        }
        protected override void OnDisable()
        {
            base.OnDisable();

            SgtHelper.OnCalculateDistance -= CalculateDistance;

            SgtFloatingCamera.OnSnap -= CameraSnapped;

            if (NegativeX != null)
            {
                NegativeX.gameObject.SetActive(false);
            }
            if (NegativeY != null)
            {
                NegativeY.gameObject.SetActive(false);
            }
            if (NegativeZ != null)
            {
                NegativeZ.gameObject.SetActive(false);
            }
            if (PositiveX != null)
            {
                PositiveX.gameObject.SetActive(false);
            }
            if (PositiveY != null)
            {
                PositiveY.gameObject.SetActive(false);
            }
            if (PositiveZ != null)
            {
                PositiveZ.gameObject.SetActive(false);
            }

            StopAllCoroutines();

            SgtTerrainCompute.Destroy();
        }