Example #1
0
        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;
        }
Example #2
0
        /** \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();
        }