A game about forced loneliness, made by TACStudios
at master 226 lines 6.2 kB view raw
1using System; 2 3namespace UnityEngine.Timeline 4{ 5 struct DiscreteTime : IComparable 6 { 7 const double k_Tick = 1e-12; 8 public static readonly DiscreteTime kMaxTime = new DiscreteTime(Int64.MaxValue); 9 10 readonly Int64 m_DiscreteTime; 11 12 public static double tickValue { get { return k_Tick; } } 13 14 public DiscreteTime(DiscreteTime time) 15 { 16 m_DiscreteTime = time.m_DiscreteTime; 17 } 18 19 DiscreteTime(Int64 time) 20 { 21 m_DiscreteTime = time; 22 } 23 24 public DiscreteTime(double time) 25 { 26 m_DiscreteTime = DoubleToDiscreteTime(time); 27 } 28 29 public DiscreteTime(float time) 30 { 31 m_DiscreteTime = FloatToDiscreteTime(time); 32 } 33 34 public DiscreteTime(int time) 35 { 36 m_DiscreteTime = IntToDiscreteTime(time); 37 } 38 39 public DiscreteTime(int frame, double fps) 40 { 41 m_DiscreteTime = DoubleToDiscreteTime(frame * fps); 42 } 43 44 public DiscreteTime OneTickBefore() 45 { 46 return new DiscreteTime(m_DiscreteTime - 1); 47 } 48 49 public DiscreteTime OneTickAfter() 50 { 51 return new DiscreteTime(m_DiscreteTime + 1); 52 } 53 54 public Int64 GetTick() 55 { 56 return m_DiscreteTime; 57 } 58 59 public static DiscreteTime FromTicks(Int64 ticks) 60 { 61 return new DiscreteTime(ticks); 62 } 63 64 public int CompareTo(object obj) 65 { 66 if (obj is DiscreteTime) 67 return m_DiscreteTime.CompareTo(((DiscreteTime)obj).m_DiscreteTime); 68 return 1; 69 } 70 71 public bool Equals(DiscreteTime other) 72 { 73 return m_DiscreteTime == other.m_DiscreteTime; 74 } 75 76 public override bool Equals(object obj) 77 { 78 if (obj is DiscreteTime) 79 return Equals((DiscreteTime)obj); 80 return false; 81 } 82 83 static Int64 DoubleToDiscreteTime(double time) 84 { 85 double number = (time / k_Tick) + 0.5; 86 if (number < Int64.MaxValue && number > Int64.MinValue) 87 return (Int64)number; 88 throw new ArgumentOutOfRangeException("Time is over the discrete range."); 89 } 90 91 static Int64 FloatToDiscreteTime(float time) 92 { 93 float number = (time / (float)k_Tick) + 0.5f; 94 if (number < Int64.MaxValue && number > Int64.MinValue) 95 return (Int64)number; 96 throw new ArgumentOutOfRangeException("Time is over the discrete range."); 97 } 98 99 static Int64 IntToDiscreteTime(int time) 100 { 101 return DoubleToDiscreteTime(time); 102 } 103 104 static double ToDouble(Int64 time) 105 { 106 return time * k_Tick; 107 } 108 109 static float ToFloat(Int64 time) 110 { 111 return (float)ToDouble(time); 112 } 113 114 public static explicit operator double(DiscreteTime b) 115 { 116 return ToDouble(b.m_DiscreteTime); 117 } 118 119 public static explicit operator float(DiscreteTime b) 120 { 121 return ToFloat(b.m_DiscreteTime); 122 } 123 124 public static explicit operator Int64(DiscreteTime b) 125 { 126 return b.m_DiscreteTime; 127 } 128 129 public static explicit operator DiscreteTime(double time) 130 { 131 return new DiscreteTime(time); 132 } 133 134 public static explicit operator DiscreteTime(float time) 135 { 136 return new DiscreteTime(time); 137 } 138 139 public static implicit operator DiscreteTime(Int32 time) 140 { 141 return new DiscreteTime(time); 142 } 143 144 public static explicit operator DiscreteTime(Int64 time) 145 { 146 return new DiscreteTime(time); 147 } 148 149 public static bool operator ==(DiscreteTime lhs, DiscreteTime rhs) 150 { 151 return lhs.m_DiscreteTime == rhs.m_DiscreteTime; 152 } 153 154 public static bool operator !=(DiscreteTime lhs, DiscreteTime rhs) 155 { 156 return !(lhs == rhs); 157 } 158 159 public static bool operator >(DiscreteTime lhs, DiscreteTime rhs) 160 { 161 return lhs.m_DiscreteTime > rhs.m_DiscreteTime; 162 } 163 164 public static bool operator <(DiscreteTime lhs, DiscreteTime rhs) 165 { 166 return lhs.m_DiscreteTime < rhs.m_DiscreteTime; 167 } 168 169 public static bool operator <=(DiscreteTime lhs, DiscreteTime rhs) 170 { 171 return lhs.m_DiscreteTime <= rhs.m_DiscreteTime; 172 } 173 174 public static bool operator >=(DiscreteTime lhs, DiscreteTime rhs) 175 { 176 return lhs.m_DiscreteTime >= rhs.m_DiscreteTime; 177 } 178 179 public static DiscreteTime operator +(DiscreteTime lhs, DiscreteTime rhs) 180 { 181 return new DiscreteTime(lhs.m_DiscreteTime + rhs.m_DiscreteTime); 182 } 183 184 public static DiscreteTime operator -(DiscreteTime lhs, DiscreteTime rhs) 185 { 186 return new DiscreteTime(lhs.m_DiscreteTime - rhs.m_DiscreteTime); 187 } 188 189 public override string ToString() 190 { 191 return m_DiscreteTime.ToString(); 192 } 193 194 public override int GetHashCode() 195 { 196 return m_DiscreteTime.GetHashCode(); 197 } 198 199 public static DiscreteTime Min(DiscreteTime lhs, DiscreteTime rhs) 200 { 201 return new DiscreteTime(Math.Min(lhs.m_DiscreteTime, rhs.m_DiscreteTime)); 202 } 203 204 public static DiscreteTime Max(DiscreteTime lhs, DiscreteTime rhs) 205 { 206 return new DiscreteTime(Math.Max(lhs.m_DiscreteTime, rhs.m_DiscreteTime)); 207 } 208 209 public static double SnapToNearestTick(double time) 210 { 211 Int64 discreteTime = DoubleToDiscreteTime(time); 212 return ToDouble(discreteTime); 213 } 214 215 public static float SnapToNearestTick(float time) 216 { 217 Int64 discreteTime = FloatToDiscreteTime(time); 218 return ToFloat(discreteTime); 219 } 220 221 public static Int64 GetNearestTick(double time) 222 { 223 return DoubleToDiscreteTime(time); 224 } 225 } 226}