public void CutGrassTree(Terrain t, FacilityGrid grid, float radius)
{
if (t == null)
{
t = Terrain.activeTerrain;
}
int TerrainDetailMapSize = t.terrainData.detailResolution;
if (t.terrainData.size.x != t.terrainData.size.z)
{
return;
}
Vector3 position = grid.GetCenterPos();
float PrPxSize = TerrainDetailMapSize / t.terrainData.size.x;
Vector3 TexturePoint3D = position - t.transform.position;
TexturePoint3D = TexturePoint3D * PrPxSize;
radius = radius * PrPxSize;
float[] xymaxmin = new float[4];
Vector3 angleDeg = new Vector3(0f, 35f, 0f);
xymaxmin[0] = TexturePoint3D.z + radius;
xymaxmin[1] = TexturePoint3D.z - radius;
xymaxmin[2] = TexturePoint3D.x + radius;
xymaxmin[3] = TexturePoint3D.x - radius;
Vector3 rt = ToolKit.GetRotatePosition(new Vector3(xymaxmin[0], 0, xymaxmin[2]), position, angleDeg);
Vector3 lt = ToolKit.GetRotatePosition(new Vector3(xymaxmin[1], 0, xymaxmin[2]), position, angleDeg);
Vector3 rb = ToolKit.GetRotatePosition(new Vector3(xymaxmin[0], 0, xymaxmin[3]), position, angleDeg);
Vector3 lb = ToolKit.GetRotatePosition(new Vector3(xymaxmin[1], 0, xymaxmin[3]), position, angleDeg);
xymaxmin[0] = ToolKit.GetMinMaxValue(new[] {rt.x, lt.x, rb.x, lb.x}, true);
xymaxmin[1] = ToolKit.GetMinMaxValue(new[] {rt.x, lt.x, rb.x, lb.x}, false);
xymaxmin[2] = ToolKit.GetMinMaxValue(new[] {rt.z, lt.z, rb.z, lb.z}, true);
xymaxmin[3] = ToolKit.GetMinMaxValue(new[] {rt.z, lt.z, rb.z, lb.z}, false);
int[,] map = t.terrainData.GetDetailLayer(0, 0, t.terrainData.detailWidth, t.terrainData.detailHeight, 0);
for (int y = 0; y < t.terrainData.detailHeight; y++)
{
for (int x = 0; x < t.terrainData.detailWidth; x++)
{
Vector3 p = new Vector3(x, 0, y);
p = ToolKit.GetRotatePosition(p, position, new Vector3(0, 35f, 0));
if (xymaxmin[0] > p.x && xymaxmin[1] < p.x && xymaxmin[2] > p.z && xymaxmin[3] < p.z)
{
map[x, y] = 0;
}
}
}
t.terrainData.SetDetailLayer(0, 0, 0, map);
TreeInstance[] treeInstances = t.terrainData.treeInstances;
List<int> removedIndex = new List<int>(5);
List<TreeInstance> list = new List<TreeInstance>(5);
for (int i = 0; i < treeInstances.Length; i++)
{
TreeInstance currentTree = treeInstances[i];
Vector3 currentTreeWorldPosition = Vector3.Scale(currentTree.position, t.terrainData.size) + t.transform.position;
if (!grid.IsInGrid(currentTreeWorldPosition))
{
list.Add(currentTree);
}
}
t.terrainData.treeInstances = list.ToArray();
t.Flush();
}