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); }
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); } }