namespace Sandbox.Clutter; /// /// Clutter scattering component supporting both infinite and volumes. /// [Icon( "forest" )] [EditorHandle( Icon = "forest" )] public sealed partial class ClutterComponent : Component, Component.ExecuteInEditor { /// /// Clutter generation mode. /// public enum ClutterMode { [Icon( "inventory_2" ), Description( "Scatter clutter within a defined volume" )] Volume, [Icon( "all_inclusive" ), Description( "Stream clutter infinitely around the camera" )] Infinite } /// /// The clutter containing objects to scatter and scatter settings. /// [Property] public ClutterDefinition Clutter { get; set; } /// /// Seed for deterministic generation. Change to get different variations. /// [Property] public int Seed { get; set; } /// /// Clutter generation mode - Volume or Infinite streaming. /// [Property] public ClutterMode Mode { get => field; set { if ( field == value ) return; Clear(); field = value; } } protected override void OnEnabled() { if ( Mode == ClutterMode.Volume ) { RebuildVolumeLayer(); } } protected override void OnDisabled() { Clear(); } protected override void OnUpdate() { if ( Mode == ClutterMode.Volume ) { UpdateVolumeProgress(); } } protected override void DrawGizmos() { if ( Mode == ClutterMode.Volume ) { DrawVolumeGizmos(); } } }