private void UpdateFromCollector() { _stats.removed = 0; _stats.added = 0; Stopwatch sw = new Stopwatch(); sw.Start(); for (int i = _objectsUsed.Count - 1; i >= 0; --i) { GameObject used = _objectsUsed[i]; if (!_collector.HasNode(used.name)) { _objectsUsed.RemoveAt(i); used.SetActive(false); _objectPool.Enqueue(used); } } foreach (var nodeKey in _collector.GetNewNodes()) { var node = _collector.GetNode(nodeKey); Mesh mesh = _collector.GetMesh(node.Mesh); if (mesh != null) { GameObject child = AllocateObject(nodeKey); child.transform.localPosition = new Vector3((float)node.posX, (float)node.posZ, (float)node.posY); child.transform.localScale = new Vector3((float)node.scaleX, (float)node.scaleZ, (float)node.scaleY); child.transform.localEulerAngles = new Vector3((float)node.rotX, (float)node.rotZ, (float)node.rotY); MeshFilter meshFilter = child.GetComponent <MeshFilter>(); meshFilter.sharedMesh = mesh; MeshRenderer meshRenderer = child.GetComponent <MeshRenderer>(); Material material = _collector.GetMaterial(node.Material); if (material != null) { meshRenderer.material = material; } else { meshRenderer.material.shader = Shader.Find("Standard"); } _objectsUsed.Add(child); } _stats.added++; } sw.Stop(); _stats.updateTime = (float)sw.Elapsed.TotalMilliseconds; _stats.collectorStats = _collector.LastStats; }
/** \param removeOld: Remove terrains that are not in the collector. */ private void AddTerrains(Collector collector, bool removeOld = false) { // Get new nodes HashSet <Vector2Int> toRemove = new HashSet <Vector2Int>(_terrains.Keys); foreach (var nodeName in collector.GetNewNodes()) { var node = collector.GetNode(nodeName); string terrainName = node.Mesh; IntPtr terrainHandle = collector.GetTerrainHandle(terrainName); if (terrainHandle != IntPtr.Zero) { // get bbox BBox bbox = Terrains.terrainGetBBox(terrainHandle); double size = bbox.xmax - bbox.xmin; var coords = new Vector2Int((int)(bbox.xmin / size), (int)(bbox.ymin / size)); if (!_terrains.ContainsKey(coords)) { GameObject terrainGO = new GameObject("Terrain " + coords); #if UNITY_EDITOR Undo.RegisterCreatedObjectUndo(terrainGO, "Added terrain"); #endif terrainGO.transform.SetParent(transform); var worldTerrain = terrainGO.AddComponent <WorldTerrain>(); worldTerrain.terrainSystem = this; worldTerrain.coords = coords; var terrain = terrainGO.AddComponent <Terrain>(); terrain.materialTemplate = materialTemplate; terrain.terrainData = new TerrainData(); terrainGO.AddComponent <TerrainCollider>().terrainData = terrain.terrainData; Terrains.ReadTerrainData(terrain.terrainData, terrainHandle); Terrains.ReadTerrainTextures(terrain, terrainHandle, collector, _cacheLocation); Terrains.UpdateTerrainBBox(terrain, bbox); _terrainGOs.Add(coords, terrainGO); _terrains.Add(coords, terrain); } else { toRemove.Remove(coords); } } } if (removeOld) { foreach (var key in toRemove) { DeleteTerrain(key); } } UpdateNeighbours(); }