Exemple #1
0
        public TerrainChunk(Vector2 coord, int size, LevelDetailStatus[] levelDetails, Transform parent, Material material)
        {
            this.levelDetails = levelDetails;

            position = coord * size;
            bounds   = new Bounds(position, Vector2.one * size);
            Vector3 positionV3 = new Vector3(position.x, 0, position.y);

            meshObject            = new GameObject("Terrain Chunk");
            meshRenderer          = meshObject.AddComponent <MeshRenderer>();
            meshFilter            = meshObject.AddComponent <MeshFilter>();
            meshRenderer.material = material;

            meshObject.transform.position = positionV3 * scale;
            //meshObject.transform.localScale = Vector3.one * size / 10f;
            meshObject.transform.parent     = parent;
            meshObject.transform.localScale = Vector3.one * scale;
            SetVisible(true);

            levelDetailMeshes = new LevelDetailMesh[levelDetails.Length];
            for (int i = 0; i < levelDetails.Length; i++)
            {
                levelDetailMeshes[i] = new LevelDetailMesh(levelDetails[i].levelDetail, UpdateTerrainChunk);
            }

            worldGenerator.EnteringInput(position, OnWorldInfoReceived);
        }
Exemple #2
0
        public void UpdateTerrainChunk()
        {
            if (WorldInfoRecieved)
            {
                float viewerDstFromNearestEdge = Mathf.Sqrt(bounds.SqrDistance(pointOfViewPosition));
                bool  visible = viewerDstFromNearestEdge <= maxViewDistance;

                if (visible)
                {
                    int LevelIndex = 0;
                    for (int i = 0; i < levelDetails.Length - 1; i++)
                    {
                        if (viewerDstFromNearestEdge > levelDetails[i].visibleTreshold)
                        {
                            LevelIndex = i + 1;
                        }
                        else
                        {
                            break;
                        }
                    }

                    if (LevelIndex != previousIndex)
                    {
                        LevelDetailMesh levelDetailMesh = levelDetailMeshes[LevelIndex];
                        if (levelDetailMesh.getMesh)
                        {
                            meshFilter.mesh = levelDetailMesh.mesh;
                        }
                        else if (!levelDetailMesh.selectedPart)
                        {
                            levelDetailMesh.Meshing(worldStats);
                        }
                    }

                    terrainChunksVisibleLastUpdate.Add(this);
                }
                SetVisible(visible);
            }
        }