Пример #1
0
        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);
                    }
                }
            }
        }
Пример #2
0
 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}'");
     }
 }
Пример #3
0
        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);
        }