public void UpdateTerrainChunk() { if (!_heightMapReceived) { return; } var viewerDistanceFromNearestEdge = Mathf.Sqrt(_bounds.SqrDistance(viewerPosition)); var wasVisible = IsVisible(); var visible = viewerDistanceFromNearestEdge <= _maxViewDistance; if (visible) { var lodIndex = 0; for (var i = 0; i < _detailLevels.Length - 1; i++) { if (viewerDistanceFromNearestEdge > _detailLevels[i].visibleDistanceThreshold) { lodIndex = i + 1; } else { break; } } if (lodIndex != _prevLODIndex) { var lodMesh = _lodMeshes[lodIndex]; if (lodMesh.hasMesh) { _prevLODIndex = lodIndex; _meshFilter.mesh = lodMesh.mesh; if (!_droidsRequested) { CreateInitialDroids(lodMesh.meshVertices); } if (!_meshDatSentForTower) { BuildingAndTowerSpawner.instance .AddTerrainData(lodMesh.meshVertices, _sampleCenter, _meshObject.transform, _bounds); _meshDatSentForTower = true; } } else if (!lodMesh.hasRequestedMesh) { lodMesh.RequestMesh(_heightMap, _meshSettings); } if (lodIndex == 0 && lodMesh.hasMesh) { LOD0ValidStateAvailable(lodMesh); } else if (lodIndex != 0) { _chunkTrees.ClearTrees(); } } } if (wasVisible != visible) { SetVisible(visible); OnVisibilityChanged?.Invoke(this, visible); } }
public void UpdateTerrainChunk() { if (!_heightMapReceived) { if (!_heightMapRequested) { Load(); } return; } float viewerDistanceFromNearestEdge = Mathf.Sqrt(_bounds.SqrDistance(viewerPosition)); bool wasVisible = IsVisible(); bool visible = viewerDistanceFromNearestEdge <= _maxViewDistance; if (visible) { int lodIndex = 0; for (int i = 0; i < _detailLevels.Length - 1; i++) { if (viewerDistanceFromNearestEdge > _detailLevels[i].visibleDistanceThreshold) { lodIndex = i + 1; } else { break; } } if (lodIndex != _prevLODIndex) { LODMesh lodMesh = _lodMeshes[lodIndex]; if (lodMesh.hasMesh) { _prevLODIndex = lodIndex; _meshFilter.mesh = lodMesh.mesh; } else if (!lodMesh.hasRequestedMesh) { lodMesh.RequestMesh(_heightMap, _meshSettings); } if (lodIndex == 0 && lodMesh.hasMesh) { if (!_chunkTrees.hasRequestedTreePoints) { _chunkTrees.RequestTreePoints( lodMesh.meshVertices, _meshSettings.chunkSizeIndex ); } else if (!_chunkTrees.hasPlacedTrees && _chunkTrees.hasReceivedTreePoints) { _chunkTrees.PlaceTreesOnPoints(); } } else if (lodIndex != 0) { _chunkTrees.ClearTrees(); } } } if (wasVisible != visible) { SetVisible(visible); onVisibilityChanged?.Invoke(this, visible); } }