public void UpdateMesh(IMeshContext options, IReadOnlyDictionary <Vector2i, ITerrainMesh2i> terrainMeshes, IEnumerable <Vector2i> toKeepGroups) { if (terrainMeshes != null) { using (options.ProfilerFactory("Setting Mesh", this)) { var toDeleteGroups = _meshFilters.Keys.Except(terrainMeshes.Keys).Except(toKeepGroups).ToList(); int meshIndex = 0; foreach (var terrainMesh in terrainMeshes) { MeshFilter meshFilter; if (!_meshFilters.TryGetValue(terrainMesh.Key, out meshFilter)) { if (toDeleteGroups.Count > 0) { int toDeleteIndex = toDeleteGroups.Count - 1; var toDeleteKey = toDeleteGroups[toDeleteIndex]; meshFilter = _meshFilters[toDeleteKey]; _meshFilters.Remove(toDeleteKey); _meshFilters[terrainMesh.Key] = meshFilter; toDeleteGroups.RemoveAt(toDeleteIndex); } else { meshFilter = CreateMeshObject(options); _meshFilters[terrainMesh.Key] = meshFilter; } } ITerrainMesh2i triangleMesh = terrainMesh.Value; UpdateMesh(triangleMesh, meshFilter.sharedMesh); var collider = meshFilter.gameObject.GetComponent <MeshCollider>(); collider.sharedMesh = null; collider.sharedMesh = meshFilter.sharedMesh; meshIndex++; } foreach (var toDeleteGroup in toDeleteGroups) { _meshFilters[toDeleteGroup].gameObject.Destroy(); _meshFilters.Remove(toDeleteGroup); } } } }
private void UpdateMesh(ITerrainMesh2i triangleMesh, Mesh mesh) { if (triangleMesh is FixedTerrainMesh2) { UpdateMesh(triangleMesh as FixedTerrainMesh2, mesh); } else if (triangleMesh is IPooledTerrainMesh) { UpdateMesh((triangleMesh as IPooledTerrainMesh).Mesh, mesh); } else if (triangleMesh != null) { Debug.LogError($"Unsuported ITriangleMesh implementation '{triangleMesh.GetType().Name}'"); } }
public void InitializeGroup(Vector2i group) { var bounds = new Bounds(new Vector3 ( bounds_center.x + (group.x * CellInGroupCount.x), bounds_center.y + (group.y * CellInGroupCount.y), bounds_center.z ), bounds_size); this.groupPosition = CellInGroupCount * group; this.pooledMesh = PooledTerrainMeshContainer <FixedTerrainMesh2> .CreateDirty(CellInGroupCount); this.mesh = this.pooledMesh.Mesh; mesh.Clear(bounds); }