namespace Sandbox.Volumes; public abstract class VolumeComponent : Component, VolumeSystem.IVolume { [InlineEditor, Property, MakeDirty] public SceneVolume SceneVolume { get; set; } = new SceneVolume(); /// /// True if SceneVolume.Type == SceneVolume.VolumeTypes.Infinite /// public bool IsInfinite => SceneVolume.Type == SceneVolume.VolumeTypes.Infinite; protected override void DrawGizmos() { base.DrawGizmos(); if ( !Gizmo.IsSelected ) return; var vol = SceneVolume; vol.DrawGizmos( true ); SceneVolume = vol; } bool VolumeSystem.IVolume.Test( Vector3 worldPosition ) { return SceneVolume.Test( WorldTransform, worldPosition ); } bool VolumeSystem.IVolume.Test( BBox worldBBox ) { return SceneVolume.Test( WorldTransform, worldBBox ); } bool VolumeSystem.IVolume.Test( Sphere worldSphere ) { return SceneVolume.Test( WorldTransform, worldSphere ); } SceneVolume VolumeSystem.IVolume.GetVolume() { return SceneVolume; } /// /// Calculates the shortest distance from the specified world position to the nearest edge of the scene volume. /// public float GetEdgeDistance( Vector3 worldPosition ) { return SceneVolume.GetEdgeDistance( WorldTransform, worldPosition ); } }