202 {
204 JsonUndergroundAreaBreadcrumb startPoint = points[0];
205 JsonUndergroundAreaBreadcrumb endPoint = points[points.Count() - 1];
207
208 bool forceAcco;
209 float acco;
211 float accoMin = endPoint.EyeAccommodation;
212 JsonUndergroundAreaBreadcrumb closestPoint;
213 JsonUndergroundAreaBreadcrumb secondaryPoint;
214 float distanceToClosest;
215 float distanceToSecondary;
216 float distanceBetweenPoints;
217
218 foreach (JsonUndergroundAreaBreadcrumb point : points)
219 {
221 if (!closestPoint || dist < distanceToClosest)
222 {
223 if (closestPoint)
224 {
225 secondaryPoint = closestPoint;
226 distanceToSecondary = distanceToClosest;
227 }
228 closestPoint = point;
229 distanceToClosest = dist;
230 }
231 else if (!secondaryPoint || dist < secondaryPoint)
232 {
233 secondaryPoint = point;
234 distanceToSecondary = dist;
235 }
236
237 #ifdef DIAG_DEVELOPER
240 #endif
241 }
242
243 distanceBetweenPoints =
vector.
DistanceSq(closestPoint.GetPosition(), secondaryPoint.GetPosition());
244
245 if (closestPoint == startPoint && secondaryPoint == points[1] && distanceToSecondary > distanceBetweenPoints)
246 acco = accoMax;
247 else if (closestPoint == endPoint && secondaryPoint == points[points.Count() - 2] && distanceToSecondary > distanceBetweenPoints)
248 acco = accoMin;
249 else
250 {
251 if (closestPoint == endPoint)
252 secondaryPoint = points[points.Count() - 2];
253 else if (closestPoint == startPoint)
254 secondaryPoint = points[1];
255 else if (distanceBetweenPoints < distanceToClosest || distanceBetweenPoints < distanceToSecondary)
256 {
257 JsonUndergroundAreaBreadcrumb nexPoint = points[points.Find(closestPoint) + 1];
259 secondaryPoint = nexPoint;
260 else
261 {
262 acco = closestPoint.EyeAccommodation;
263 forceAcco = true;
264 }
265 }
266
267 if (!forceAcco)
268 {
269 distanceToSecondary =
vector.
DistanceSq(playerPos, secondaryPoint.GetPosition());
270
271 acco = distanceToSecondary / (distanceToClosest + distanceToSecondary);
272 acco =
Math.
Lerp(secondaryPoint.EyeAccommodation, closestPoint.EyeAccommodation, acco);
273
274 if (points.Find(closestPoint) > points.Find(secondaryPoint))
276 else
278
279 }
280 }
281
283
285 {
287 {
290 }
291 else
292 {
295 }
296 }
297
298 #ifdef DIAG_DEVELOPER
300 {
301 vector headPosition = MiscGameplayFunctions.GetPlayerHeadPosition(
m_Player);
303 if (acco != accoMin && acco != accoMax)
305
308 DbgUI.
Text(
String(
"Second closest id: " + points.Find(secondaryPoint)));
310 }
311 #endif
312 }
ref AnimationTimer m_AnimTimerLightBlend
UndergroundTrigger m_TransitionalTrigger
const float ACCO_MODIFIER
enum EUndergroundPresence LIGHT_BLEND_SPEED_IN
float m_LightingLerpTarget
const float LIGHT_BLEND_SPEED_OUT
AnimationTimer class. This timer is for animating float value. usage:
static Shape DrawSphere(vector pos, float size=1, int color=0x1fff7f7f, ShapeFlags flags=ShapeFlags.TRANSP|ShapeFlags.NOOUTLINE)
static Shape DrawLine(vector from, vector to, int color=0xFFFFFFFF, int flags=0)
Result for an object found in CGame.IsBoxCollidingGeometryProxy.
static proto native float DistanceSq(vector v1, vector v2)
Returns the square distance between tips of two 3D vectors.
static proto native void End()
static proto native void Begin(string windowTitle, float x=0, float y=0)
static proto native void Text(string label)
string String(string s)
Helper for passing string expression to functions with void parameter. Example: Print(String("Hello "...
static proto float Lerp(float a, float b, float time)
Linearly interpolates between 'a' and 'b' given 'time'.