using System.Collections.Generic; using System.Linq; using UnityEngine; namespace Gaia { public class TreeManager { private List m_terrainTrees = new List(); private Quadtree m_terrainTreeLocations = new Quadtree(new Rect(0f, 0f, 10f, 10f)); public void LoadTreesFromTerrain() { m_terrainTrees = null; m_terrainTreeLocations = null; float f = float.NaN; float num = float.NaN; float num2 = float.NaN; float num3 = float.NaN; float num4 = float.NaN; Terrain terrain = null; Terrain[] activeTerrains = Terrain.activeTerrains; foreach (Terrain terrain2 in activeTerrains) { if (float.IsNaN(f)) { terrain = terrain2; f = terrain2.transform.position.y; num = terrain2.transform.position.x; num3 = terrain2.transform.position.z; num2 = num + terrain2.terrainData.size.x; num4 = num3 + terrain2.terrainData.size.z; continue; } if (terrain2.transform.position.x < num) { num = terrain2.transform.position.x; } if (terrain2.transform.position.z < num3) { num3 = terrain2.transform.position.z; } if (terrain2.transform.position.x + terrain2.terrainData.size.x > num2) { num2 = terrain2.transform.position.x + terrain2.terrainData.size.x; } if (terrain2.transform.position.z + terrain2.terrainData.size.z > num4) { num4 = terrain2.transform.position.z + terrain2.terrainData.size.z; } } if (!(terrain != null)) { return; } Rect boundaries = new Rect(num, num3, num2 - num, num4 - num3); m_terrainTreeLocations = new Quadtree(boundaries); m_terrainTrees = new List(terrain.terrainData.treePrototypes); activeTerrains = Terrain.activeTerrains; foreach (Terrain obj in activeTerrains) { float x = obj.transform.position.x; float z = obj.transform.position.z; float x2 = obj.terrainData.size.x; float z2 = obj.terrainData.size.z; TreeInstance[] treeInstances = obj.terrainData.treeInstances; for (int j = 0; j < treeInstances.Length; j++) { TreeInstance treeInstance = treeInstances[j]; m_terrainTreeLocations.Insert(x + treeInstance.position.x * x2, z + treeInstance.position.z * z2, treeInstances[j].prototypeIndex); } } } public void AddTree(Vector3 position, int prototypeIdx) { if (m_terrainTreeLocations != null) { m_terrainTreeLocations.Insert(position.x, position.z, prototypeIdx); } } public int Count(Vector3 position, float range) { if (m_terrainTreeLocations == null) { return 0; } Rect range2 = new Rect(position.x - range, position.z - range, range * 2f, range * 2f); return m_terrainTreeLocations.Find(range2).Count(); } public int Count() { if (m_terrainTreeLocations == null) { return 0; } return m_terrainTreeLocations.Count; } } }