160 lines
5.9 KiB
C#
160 lines
5.9 KiB
C#
// Decompiled with JetBrains decompiler
|
|
// Type: Terraria.GameContent.RGB.EyeballShader
|
|
// Assembly: Terraria, Version=1.4.0.5, Culture=neutral, PublicKeyToken=null
|
|
// MVID: 67F9E73E-0A81-4937-A22C-5515CD405A83
|
|
// Assembly location: C:\Users\mikeyisbaeyt\Downloads\depotdownloader-2.4.5\depots\105601\6707058\Terraria.exe
|
|
|
|
using Microsoft.Xna.Framework;
|
|
using ReLogic.Peripherals.RGB;
|
|
using System;
|
|
using Terraria.Utilities;
|
|
|
|
namespace Terraria.GameContent.RGB
|
|
{
|
|
public class EyeballShader : ChromaShader
|
|
{
|
|
private static readonly EyeballShader.Ring[] Rings = new EyeballShader.Ring[5]
|
|
{
|
|
new EyeballShader.Ring(Color.Black.ToVector4(), 0.0f),
|
|
new EyeballShader.Ring(Color.Black.ToVector4(), 0.4f),
|
|
new EyeballShader.Ring(new Color(17, 220, 237).ToVector4(), 0.5f),
|
|
new EyeballShader.Ring(new Color(17, 120, 237).ToVector4(), 0.6f),
|
|
new EyeballShader.Ring(Vector4.One, 0.65f)
|
|
};
|
|
private readonly Vector4 _eyelidColor = new Color(108, 110, 75).ToVector4();
|
|
private float _eyelidProgress;
|
|
private Vector2 _pupilOffset = Vector2.Zero;
|
|
private Vector2 _targetOffset = Vector2.Zero;
|
|
private readonly UnifiedRandom _random = new UnifiedRandom();
|
|
private float _timeUntilPupilMove;
|
|
private float _eyelidStateTime;
|
|
private readonly bool _isSpawning;
|
|
private EyeballShader.EyelidState _eyelidState;
|
|
|
|
public EyeballShader(bool isSpawning) => this._isSpawning = isSpawning;
|
|
|
|
public virtual void Update(float elapsedTime)
|
|
{
|
|
this.UpdateEyelid(elapsedTime);
|
|
int num1 = (double) this._timeUntilPupilMove <= 0.0 ? 1 : 0;
|
|
this._pupilOffset = (this._targetOffset + this._pupilOffset) * 0.5f;
|
|
this._timeUntilPupilMove -= elapsedTime;
|
|
if (num1 == 0)
|
|
return;
|
|
float num2 = (float) this._random.NextDouble() * 6.283185f;
|
|
float num3;
|
|
if (this._isSpawning)
|
|
{
|
|
this._timeUntilPupilMove = (float) (this._random.NextDouble() * 0.400000005960464 + 0.300000011920929);
|
|
num3 = (float) this._random.NextDouble() * 0.7f;
|
|
}
|
|
else
|
|
{
|
|
this._timeUntilPupilMove = (float) (this._random.NextDouble() * 0.400000005960464 + 0.600000023841858);
|
|
num3 = (float) this._random.NextDouble() * 0.3f;
|
|
}
|
|
this._targetOffset = new Vector2((float) Math.Cos((double) num2), (float) Math.Sin((double) num2)) * num3;
|
|
}
|
|
|
|
private void UpdateEyelid(float elapsedTime)
|
|
{
|
|
float num1 = 0.5f;
|
|
float num2 = 6f;
|
|
if (this._isSpawning)
|
|
{
|
|
if (NPC.MoonLordCountdown >= 3590)
|
|
{
|
|
this._eyelidStateTime = 0.0f;
|
|
this._eyelidState = EyeballShader.EyelidState.Closed;
|
|
}
|
|
num1 = (float) ((double) NPC.MoonLordCountdown / 3600.0 * 10.0 + 0.5);
|
|
num2 = 2f;
|
|
}
|
|
this._eyelidStateTime += elapsedTime;
|
|
switch (this._eyelidState)
|
|
{
|
|
case EyeballShader.EyelidState.Closed:
|
|
this._eyelidProgress = 0.0f;
|
|
if ((double) this._eyelidStateTime <= (double) num1)
|
|
break;
|
|
this._eyelidStateTime = 0.0f;
|
|
this._eyelidState = EyeballShader.EyelidState.Opening;
|
|
break;
|
|
case EyeballShader.EyelidState.Opening:
|
|
this._eyelidProgress = this._eyelidStateTime / 0.4f;
|
|
if ((double) this._eyelidStateTime <= 0.400000005960464)
|
|
break;
|
|
this._eyelidStateTime = 0.0f;
|
|
this._eyelidState = EyeballShader.EyelidState.Open;
|
|
break;
|
|
case EyeballShader.EyelidState.Open:
|
|
this._eyelidProgress = 1f;
|
|
if ((double) this._eyelidStateTime <= (double) num2)
|
|
break;
|
|
this._eyelidStateTime = 0.0f;
|
|
this._eyelidState = EyeballShader.EyelidState.Closing;
|
|
break;
|
|
case EyeballShader.EyelidState.Closing:
|
|
this._eyelidProgress = (float) (1.0 - (double) this._eyelidStateTime / 0.400000005960464);
|
|
if ((double) this._eyelidStateTime <= 0.400000005960464)
|
|
break;
|
|
this._eyelidStateTime = 0.0f;
|
|
this._eyelidState = EyeballShader.EyelidState.Closed;
|
|
break;
|
|
}
|
|
}
|
|
|
|
[RgbProcessor]
|
|
private void ProcessHighDetail(
|
|
RgbDevice device,
|
|
Fragment fragment,
|
|
EffectDetailLevel quality,
|
|
float time)
|
|
{
|
|
Vector2 vector2_1 = new Vector2(1.5f, 0.5f);
|
|
Vector2 vector2_2 = vector2_1 + this._pupilOffset;
|
|
for (int index1 = 0; index1 < fragment.Count; ++index1)
|
|
{
|
|
Vector2 canvasPositionOfIndex = fragment.GetCanvasPositionOfIndex(index1);
|
|
Vector2 vector2_3 = canvasPositionOfIndex - vector2_1;
|
|
Vector4 vector4 = Vector4.One;
|
|
float num1 = (vector2_2 - canvasPositionOfIndex).Length();
|
|
for (int index2 = 1; index2 < EyeballShader.Rings.Length; ++index2)
|
|
{
|
|
EyeballShader.Ring ring1 = EyeballShader.Rings[index2];
|
|
EyeballShader.Ring ring2 = EyeballShader.Rings[index2 - 1];
|
|
if ((double) num1 < (double) ring1.Distance)
|
|
{
|
|
vector4 = Vector4.Lerp(ring2.Color, ring1.Color, (float) (((double) num1 - (double) ring2.Distance) / ((double) ring1.Distance - (double) ring2.Distance)));
|
|
break;
|
|
}
|
|
}
|
|
float num2 = (float) Math.Sqrt(1.0 - 0.400000005960464 * (double) vector2_3.Y * (double) vector2_3.Y) * 5f;
|
|
float num3 = Math.Abs(vector2_3.X) - num2 * (float) (1.10000002384186 * (double) this._eyelidProgress - 0.100000001490116);
|
|
if ((double) num3 > 0.0)
|
|
vector4 = Vector4.Lerp(vector4, this._eyelidColor, Math.Min(1f, num3 * 10f));
|
|
fragment.SetColor(index1, vector4);
|
|
}
|
|
}
|
|
|
|
private struct Ring
|
|
{
|
|
public readonly Vector4 Color;
|
|
public readonly float Distance;
|
|
|
|
public Ring(Vector4 color, float distance)
|
|
{
|
|
this.Color = color;
|
|
this.Distance = distance;
|
|
}
|
|
}
|
|
|
|
private enum EyelidState
|
|
{
|
|
Closed,
|
|
Opening,
|
|
Open,
|
|
Closing,
|
|
}
|
|
}
|
|
}
|