iso2/env/Foliage.cs
public class Foliage : Component {
	[Property] public Vector2 Bounds {get; set;}
	[Property] public int Density {get; set;} = 60;
	public List<Model> Models {get; set;} = new() {
		Model.Load("models/foliage/dead_shrubs_1.vmdl"),
		Model.Load("models/foliage/dead_shrubs_2.vmdl"),
		Model.Load("models/foliage/dead_shrubs_3.vmdl"),
		Model.Load("models/foliage/dead_shrubs_4.vmdl"),
		Model.Load("models/foliage/dead_shrubs_5.vmdl"),
		Model.Load("models/foliage/dead_shrubs_6.vmdl"),
		Model.Load("models/foliage/dead_shrubs_7.vmdl"),
		Model.Load("models/foliage/dead_shrubs_8.vmdl"),
	};

	[Button] public void Generate() {
		foreach (var child in GameObject.Children)
			child.Destroy();
		var bounds = new Rect(-Bounds * 0.5f, Bounds);
		for (var x = bounds.Left.FloorToInt(); x < bounds.Right.FloorToInt() + 1; x += Density) {
			for (var y = bounds.Top.FloorToInt(); y < bounds.Bottom.FloorToInt() + 1; y += Density) {
				var ob = Scene.CreateObject();
				ob.Name = "generated_foliage";
				ob.SetParent(GameObject, false);
				ob.LocalPosition = new Vector3(x, y, WorldPosition.z) + Vector3.Random.WithZ(0f) * Density * 0.5f + Vector3.Up * 0.1f;
				ob.LocalRotation = Rotation.FromYaw(Random.Shared.Float(-180,180));
				ob.LocalScale = Random.Shared.Float(1.5f, 2.5f);
				ob.Components.Create<ModelRenderer>().Model = Random.Shared.FromList(Models);
			}
		}
	}
}