Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches
Curve.cs
Go to the documentation of this file.
1using System;
3
5
8public class Curve
9{
11
13
15
17 {
18 get
19 {
20 return preLoop;
21 }
22 set
23 {
24 preLoop = value;
25 }
26 }
27
29 {
30 get
31 {
32 return postLoop;
33 }
34 set
35 {
37 }
38 }
39
41
42 public bool IsConstant => keys.Count <= 1;
43
44 public Curve Clone()
45 {
46 Curve curve = new Curve();
47 curve.preLoop = preLoop;
48 curve.postLoop = postLoop;
49 curve.keys = keys.Clone();
50 return curve;
51 }
52
53 public void ComputeTangent(int keyIndex, CurveTangent tangentType)
54 {
55 ComputeTangent(keyIndex, tangentType, tangentType);
56 }
57
58 public void ComputeTangent(int keyIndex, CurveTangent tangentInType, CurveTangent tangentOutType)
59 {
60 if (keys.Count <= keyIndex || keyIndex < 0)
61 {
62 throw new ArgumentOutOfRangeException("keyIndex");
63 }
64 CurveKey curveKey = Keys[keyIndex];
65 float num;
66 float position;
67 float num2 = (num = (position = curveKey.Position));
68 float num3;
69 float value;
70 float num4 = (num3 = (value = curveKey.Value));
71 if (keyIndex > 0)
72 {
73 num2 = Keys[keyIndex - 1].Position;
74 num4 = Keys[keyIndex - 1].Value;
75 }
76 if (keyIndex + 1 < keys.Count)
77 {
78 position = Keys[keyIndex + 1].Position;
79 value = Keys[keyIndex + 1].Value;
80 }
81 switch (tangentInType)
82 {
83 case CurveTangent.Smooth:
84 {
85 float num5 = position - num2;
86 float num6 = value - num4;
87 if (Math.Abs(num6) < 1.1920929E-07f)
88 {
89 curveKey.TangentIn = 0f;
90 }
91 else
92 {
93 curveKey.TangentIn = num6 * Math.Abs(num2 - num) / num5;
94 }
95 break;
96 }
97 case CurveTangent.Linear:
98 curveKey.TangentIn = num3 - num4;
99 break;
100 default:
101 curveKey.TangentIn = 0f;
102 break;
103 }
104 switch (tangentOutType)
105 {
106 case CurveTangent.Smooth:
107 {
108 float num7 = position - num2;
109 float num8 = value - num4;
110 if (Math.Abs(num8) < 1.1920929E-07f)
111 {
112 curveKey.TangentOut = 0f;
113 }
114 else
115 {
116 curveKey.TangentOut = num8 * Math.Abs(position - num) / num7;
117 }
118 break;
119 }
120 case CurveTangent.Linear:
121 curveKey.TangentOut = value - num3;
122 break;
123 default:
124 curveKey.TangentOut = 0f;
125 break;
126 }
127 }
128
129 public void ComputeTangents(CurveTangent tangentType)
130 {
131 ComputeTangents(tangentType, tangentType);
132 }
133
134 public void ComputeTangents(CurveTangent tangentInType, CurveTangent tangentOutType)
135 {
136 for (int i = 0; i < Keys.Count; i++)
137 {
138 ComputeTangent(i, tangentInType, tangentOutType);
139 }
140 }
141
142 public float Evaluate(float position)
143 {
144 if (keys.Count == 0)
145 {
146 return 0f;
147 }
148 if (keys.Count == 1)
149 {
150 return keys[0].internalValue;
151 }
152 CurveKey curveKey = keys[0];
153 CurveKey curveKey2 = keys[keys.Count - 1];
154 float num = position;
155 float num2 = 0f;
156 if (num < curveKey.position)
157 {
158 if (preLoop == CurveLoopType.Constant)
159 {
160 return curveKey.internalValue;
161 }
162 if (preLoop == CurveLoopType.Linear)
163 {
164 return curveKey.internalValue - curveKey.tangentIn * (curveKey.position - num);
165 }
167 {
169 }
170 float num3 = CalcCycle(num);
171 float num4 = num - (curveKey.position + num3 * keys.TimeRange);
172 if (preLoop == CurveLoopType.Cycle)
173 {
174 num = curveKey.position + num4;
175 }
176 else if (preLoop == CurveLoopType.CycleOffset)
177 {
178 num = curveKey.position + num4;
179 num2 = (curveKey2.internalValue - curveKey.internalValue) * num3;
180 }
181 else
182 {
183 num = ((((uint)(int)num3 & (true ? 1u : 0u)) != 0) ? (curveKey2.position - num4) : (curveKey.position + num4));
184 }
185 }
186 else if (curveKey2.position < num)
187 {
188 if (postLoop == CurveLoopType.Constant)
189 {
190 return curveKey2.internalValue;
191 }
192 if (postLoop == CurveLoopType.Linear)
193 {
194 return curveKey2.internalValue - curveKey2.tangentOut * (curveKey2.position - num);
195 }
197 {
199 }
200 float num5 = CalcCycle(num);
201 float num6 = num - (curveKey.position + num5 * keys.TimeRange);
202 if (postLoop == CurveLoopType.Cycle)
203 {
204 num = curveKey.position + num6;
205 }
206 else if (postLoop == CurveLoopType.CycleOffset)
207 {
208 num = curveKey.position + num6;
209 num2 = (curveKey2.internalValue - curveKey.internalValue) * num5;
210 }
211 else
212 {
213 num = ((((uint)(int)num5 & (true ? 1u : 0u)) != 0) ? (curveKey2.position - num6) : (curveKey.position + num6));
214 }
215 }
216 CurveKey k = null;
217 CurveKey k2 = null;
218 num = FindSegment(num, ref k, ref k2);
219 return num2 + Hermite(k, k2, num);
220 }
221
222 private float CalcCycle(float t)
223 {
224 float num = (t - keys[0].position) * keys.InvTimeRange;
225 if (num < 0f)
226 {
227 num -= 1f;
228 }
229 int num2 = (int)num;
230 return num2;
231 }
232
233 private float FindSegment(float t, ref CurveKey k0, ref CurveKey k1)
234 {
235 float result = t;
236 k0 = keys[0];
237 for (int i = 1; i < keys.Count; i++)
238 {
239 k1 = keys[i];
240 if (k1.position >= t)
241 {
242 double num = k0.position;
243 double num2 = k1.position;
244 double num3 = t;
245 double num4 = num2 - num;
246 result = 0f;
247 if (num4 > 1E-10)
248 {
249 result = (float)((num3 - num) / num4);
250 }
251 break;
252 }
253 k0 = k1;
254 }
255 return result;
256 }
257
258 private static float Hermite(CurveKey k0, CurveKey k1, float t)
259 {
260 if (k0.Continuity == CurveContinuity.Step)
261 {
262 if (!(t < 1f))
263 {
264 return k1.internalValue;
265 }
266 return k0.internalValue;
267 }
268 float num = t * t;
269 float num2 = num * t;
270 float internalValue = k0.internalValue;
271 float internalValue2 = k1.internalValue;
272 float tangentOut = k0.tangentOut;
273 float tangentIn = k1.tangentIn;
274 return internalValue * (2f * num2 - 3f * num + 1f) + internalValue2 * (-2f * num2 + 3f * num) + tangentOut * (num2 - 2f * num + t) + tangentIn * (num2 - num);
275 }
276}
CurveKeyCollection keys
Definition Curve.cs:14
void ComputeTangent(int keyIndex, CurveTangent tangentInType, CurveTangent tangentOutType)
Definition Curve.cs:58
float CalcCycle(float t)
Definition Curve.cs:222
void ComputeTangents(CurveTangent tangentType)
Definition Curve.cs:129
CurveKeyCollection Keys
Definition Curve.cs:40
CurveLoopType PreLoop
Definition Curve.cs:17
CurveLoopType postLoop
Definition Curve.cs:12
static float Hermite(CurveKey k0, CurveKey k1, float t)
Definition Curve.cs:258
float Evaluate(float position)
Definition Curve.cs:142
CurveLoopType preLoop
Definition Curve.cs:10
void ComputeTangent(int keyIndex, CurveTangent tangentType)
Definition Curve.cs:53
void ComputeTangents(CurveTangent tangentInType, CurveTangent tangentOutType)
Definition Curve.cs:134
CurveLoopType PostLoop
Definition Curve.cs:29
float FindSegment(float t, ref CurveKey k0, ref CurveKey k1)
Definition Curve.cs:233
static double Abs(double value)