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