Example #1
0
        public Chunk(Vector2Int index, GeneratorBehaviour generator)
        {
            _generator = generator;
            _bounds    = new Bounds(new Vector3(index.x * _generator.GridSize.x, 0, index.y * _generator.GridSize.z) + _generator.GridSize / 2, _generator.GridSize);

            Target    = new GameObject("Chunk " + index);
            _renderer = Target.AddComponent <MeshRenderer>();
            _renderer.sharedMaterial = new Material(Shader.Find("Custom/SurfaceShader"));
            _filter = Target.AddComponent <MeshFilter>();
            Target.transform.parent   = _generator.transform;
            Target.transform.position = _bounds.min;

            Target.SetActive(false);


            _lodMeshes = new LODMesh[_generator.LodLevels.Length];
            for (int i = 0; i < _generator.LodLevels.Length; i++)
            {
                _lodMeshes[i] = new LODMesh(_generator.LodLevels[i].Lod, UpdateTerrainChunk, _generator);
            }
        }
Example #2
0
        public void UpdateTerrainChunk()
        {
            if (!_mapDataReceived)
            {
                return;
            }
            float viewerDstFromNearestEdge = Mathf.Sqrt(_bounds.SqrDistance(_generator.ViewerPosition));
            bool  visible = viewerDstFromNearestEdge <= _generator.MaxViewDistance;

            if (visible)
            {
                int lodIndex = 0;

                for (int i = 0; i < _generator.LodLevels.Length - 1; i++)
                {
                    if (!(viewerDstFromNearestEdge > _generator.LodLevels[i].DistanceThreshold))
                    {
                        break;
                    }
                    lodIndex = i + 1;
                }

                if (lodIndex != _previousLodIndex)
                {
                    LODMesh lodMesh = _lodMeshes[lodIndex];
                    if (lodMesh.HasMesh)
                    {
                        _previousLodIndex = lodIndex;
                        _filter.mesh      = lodMesh.Mesh;
                    }
                    else if (!lodMesh.HasRequestedMesh)
                    {
                        lodMesh.RequestMesh(_mapData);
                    }
                }
            }

            Target.SetActive(visible);
        }