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);
}
}
}
}