using System.Collections; using System.Collections.Generic; using Godot; using Rokojori.Extensions; namespace Rokojori { [System.Serializable] public class RangeDouble { public double min; public double max; // public RangeDouble( double min, double max ) // { // this.min = min; // this.max = max; // } public static RangeDouble Create( double min, double max ) { var rd = new RangeDouble(); rd.min = min; rd.max = max; return rd; } public void EnsureCorrectness() { if ( max < min ) { var b = max; max = min; min = b; } } public bool ContainsValue( double value ) { return min <= value && value <= max; } public bool Overlaps( RangeDouble other ) { if ( other.max < min ) { return false; } if ( other.min > max ) { return false; } if ( other.ContainsValue( min ) || other.ContainsValue( max ) ) { return true; } if ( ContainsValue( min ) || ContainsValue( max ) ) { return true; } return false; } public bool IsSmaller( RangeDouble other ) { if ( Overlaps( other ) ) { return false; } return max < other.min; } public bool IsBigger( RangeDouble other ) { if ( Overlaps( other ) ) { return false; } return min > other.max; } public double center { get { return 0.5f * ( max + min ); } } public double range { get { return max - min; } } public double length { get { return max - min; } } public double DistanceTo( RangeDouble other ) { var center = this.center; var otherCenter = other.center; var RangeDouble = this.range; var otherRangeDouble = other.range; var distance = Mathf.Abs( center - otherCenter ); return Mathf.Max( 0, distance - 0.5f * ( RangeDouble + otherRangeDouble ) ); } public RangeDouble Copy() { return Create( min, max ); } public double SampleAt( double normalized ) { return min + ( max - min ) * normalized; } public static RangeDouble Of_01 { get { return Create( 0, 1 ); } } public static RangeDouble Of_Zero { get { return Create( 0, 0 ); } } public static RangeDouble Of_One { get { return Create( 1, 1 ); } } public static bool ContainsRange( double min, double max, double value ) { return min <= value && value <= max; } public static bool ContainsExclusive( double min, double max, double value ) { return min < value && value < max; } public static bool ContainsExclusiveMax( double min, double max, double value ) { return min <= value && value < max; } public static bool ContainsExclusiveMin( double min, double max, double value ) { return min < value && value <= max; } } }