Example #1
0
        public void UpdateTerrainChunk()
        {
            if (!mapDataReceived)
            {
                return;
            }
            var viewerDstFromNearestEdge = Mathf.Sqrt(bounds.SqrDistance(_viewerPosition));
            var visible = viewerDstFromNearestEdge <= _maxViewDst;

            if (visible)
            {
                var lodIndex = 0;
                for (var i = 0; i < detailLevels.Length - 1; i++)
                {
                    if (viewerDstFromNearestEdge > detailLevels[i].visibleDstThreshold)
                    {
                        lodIndex = i + 1;
                    }
                    else
                    {
                        break;
                    }
                }
                if (lodIndex != previousLODIndex)
                {
                    var lodMesh = lodMeshes[lodIndex];
                    if (lodMesh.HasMesh)
                    {
                        previousLODIndex = lodIndex;
                        meshFilter.mesh  = lodMesh.Mesh;
                    }
                    else if (!lodMesh.HasRequestedMesh)
                    {
                        lodMesh.RequestMesh(mapData);
                    }
                }

                if (lodIndex == 0)
                {
                    if (collisionLODMesh.HasMesh)
                    {
                        meshCollider.sharedMesh = collisionLODMesh.Mesh;
                    }
                    else if (!collisionLODMesh.HasRequestedMesh)
                    {
                        collisionLODMesh.RequestMesh(mapData);
                    }
                }

                TerrainChunksVisibleLastUpdate.Add(this);
            }

            SetVisible(visible);
        }
        public void UpdateTerrainChunk()
        {
            if (mapDataRecieved)
            {
                float viewerDistanceFromEdge = Mathf.Sqrt(bounds.SqrDistance(viewerPosition));
                bool  visible = viewerDistanceFromEdge <= maxViewDist;

                if (visible)
                {
                    int index = 0;
                    for (int i = 0; i < detailLevels.Length - 1; i++)
                    {
                        if (viewerDistanceFromEdge > detailLevels[i].visibleDistanceThreshhold)
                        {
                            index = i + 1;
                        }
                        else
                        {
                            break;
                        }
                    }

                    if (index != prevLODIndex)
                    {
                        LodMesh lodMesh = meshLods[index];
                        if (lodMesh.hasMesh)
                        {
                            prevLODIndex    = index;
                            meshFilter.mesh = lodMesh.mesh;
                        }
                        else if (!lodMesh.hasRequestMesh)
                        {
                            lodMesh.RequestMesh(mapData);
                        }
                    }
                    visibleChunks.Add(this);
                }
                SetVisible(visible);
            }
        }