104 lines
2.8 KiB
C#
104 lines
2.8 KiB
C#
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using UnityEngine;
|
|
|
|
namespace Gaia
|
|
{
|
|
public class TreeManager
|
|
{
|
|
private List<TreePrototype> m_terrainTrees = new List<TreePrototype>();
|
|
|
|
private Quadtree<int> m_terrainTreeLocations = new Quadtree<int>(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<int>(boundaries);
|
|
m_terrainTrees = new List<TreePrototype>(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;
|
|
}
|
|
}
|
|
}
|