terraria-source-code/Lighting.cs
2021-10-26 12:45:26 -04:00

423 lines
20 KiB
C#

// Decompiled with JetBrains decompiler
// Type: Terraria.Lighting
// 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 System;
using Terraria.Graphics;
using Terraria.Graphics.Light;
using Terraria.ID;
namespace Terraria
{
public class Lighting
{
private const float DEFAULT_GLOBAL_BRIGHTNESS = 1.2f;
private const float BLIND_GLOBAL_BRIGHTNESS = 1f;
[Obsolete]
public static int OffScreenTiles = 45;
private static LightMode _mode = LightMode.Color;
private static readonly LightingEngine NewEngine = new LightingEngine(Main.ActiveWorld);
private static readonly LegacyLighting LegacyEngine = new LegacyLighting(Main.Camera, Main.ActiveWorld);
private static ILightingEngine _activeEngine;
public static float GlobalBrightness { get; set; }
public static LightMode Mode
{
get => Lighting._mode;
set
{
Lighting._mode = value;
switch (Lighting._mode)
{
case LightMode.White:
Lighting._activeEngine = (ILightingEngine) Lighting.LegacyEngine;
Lighting.LegacyEngine.Mode = 1;
break;
case LightMode.Retro:
Lighting._activeEngine = (ILightingEngine) Lighting.LegacyEngine;
Lighting.LegacyEngine.Mode = 2;
break;
case LightMode.Trippy:
Lighting._activeEngine = (ILightingEngine) Lighting.LegacyEngine;
Lighting.LegacyEngine.Mode = 3;
break;
case LightMode.Color:
Lighting._activeEngine = (ILightingEngine) Lighting.NewEngine;
Lighting.LegacyEngine.Mode = 0;
Lighting.OffScreenTiles = 35;
break;
}
Main.renderCount = 0;
Main.renderNow = false;
}
}
public static bool NotRetro => Lighting.Mode != LightMode.Retro && Lighting.Mode != LightMode.Trippy;
public static bool UsingNewLighting => Lighting.Mode == LightMode.Color;
public static bool UpdateEveryFrame => Main.LightingEveryFrame && !Main.RenderTargetsRequired && !Lighting.NotRetro;
public static void Initialize()
{
Lighting.GlobalBrightness = 1.2f;
Lighting.NewEngine.Rebuild();
Lighting.LegacyEngine.Rebuild();
if (Lighting._activeEngine != null)
return;
Lighting.Mode = LightMode.Color;
}
public static void LightTiles(int firstX, int lastX, int firstY, int lastY)
{
Main.render = true;
Lighting.UpdateGlobalBrightness();
Lighting._activeEngine.ProcessArea(new Rectangle(firstX, firstY, lastX - firstX, lastY - firstY));
}
private static void UpdateGlobalBrightness()
{
Lighting.GlobalBrightness = 1.2f;
if (!Main.player[Main.myPlayer].blind)
return;
Lighting.GlobalBrightness = 1f;
}
public static float Brightness(int x, int y)
{
Vector3 color = Lighting._activeEngine.GetColor(x, y);
return (float) ((double) Lighting.GlobalBrightness * ((double) color.X + (double) color.Y + (double) color.Z) / 3.0);
}
public static Vector3 GetSubLight(Vector2 position)
{
Vector2 vector2_1 = position / 16f - new Vector2(0.5f, 0.5f);
Vector2 vector2_2 = new Vector2(vector2_1.X % 1f, vector2_1.Y % 1f);
int x1 = (int) vector2_1.X;
int y = (int) vector2_1.Y;
Vector3 color1 = Lighting._activeEngine.GetColor(x1, y);
Vector3 color2 = Lighting._activeEngine.GetColor(x1 + 1, y);
Vector3 color3 = Lighting._activeEngine.GetColor(x1, y + 1);
Vector3 color4 = Lighting._activeEngine.GetColor(x1 + 1, y + 1);
Vector3 vector3 = color2;
double x2 = (double) vector2_2.X;
return Vector3.Lerp(Vector3.Lerp(color1, vector3, (float) x2), Vector3.Lerp(color3, color4, vector2_2.X), vector2_2.Y);
}
public static void AddLight(Vector2 position, Vector3 rgb) => Lighting.AddLight((int) ((double) position.X / 16.0), (int) ((double) position.Y / 16.0), rgb.X, rgb.Y, rgb.Z);
public static void AddLight(Vector2 position, float r, float g, float b) => Lighting.AddLight((int) ((double) position.X / 16.0), (int) ((double) position.Y / 16.0), r, g, b);
public static void AddLight(int i, int j, int torchID, float lightAmount)
{
float R;
float G;
float B;
TorchID.TorchColor(torchID, out R, out G, out B);
Lighting._activeEngine.AddLight(i, j, new Vector3(R * lightAmount, G * lightAmount, B * lightAmount));
}
public static void AddLight(Vector2 position, int torchID)
{
float R;
float G;
float B;
TorchID.TorchColor(torchID, out R, out G, out B);
Lighting.AddLight((int) position.X / 16, (int) position.Y / 16, R, G, B);
}
public static void AddLight(int i, int j, float r, float g, float b)
{
if (Main.gamePaused || Main.netMode == 2)
return;
Lighting._activeEngine.AddLight(i, j, new Vector3(r, g, b));
}
public static void NextLightMode()
{
++Lighting.Mode;
if (!Enum.IsDefined(typeof (LightMode), (object) Lighting.Mode))
Lighting.Mode = LightMode.White;
Lighting.Clear();
}
public static void Clear() => Lighting._activeEngine.Clear();
public static Color GetColor(Point tileCoords) => Main.gameMenu ? Color.White : new Color(Lighting._activeEngine.GetColor(tileCoords.X, tileCoords.Y) * Lighting.GlobalBrightness);
public static Color GetColor(Point tileCoords, Color originalColor) => Main.gameMenu ? originalColor : new Color(Lighting._activeEngine.GetColor(tileCoords.X, tileCoords.Y) * originalColor.ToVector3());
public static Color GetColor(int x, int y, Color oldColor) => Main.gameMenu ? oldColor : new Color(Lighting._activeEngine.GetColor(x, y) * oldColor.ToVector3());
public static Color GetColor(int x, int y)
{
if (Main.gameMenu)
return Color.White;
Color color1 = new Color();
Vector3 color2 = Lighting._activeEngine.GetColor(x, y);
float num1 = Lighting.GlobalBrightness * (float) byte.MaxValue;
int num2 = (int) ((double) color2.X * (double) num1);
int num3 = (int) ((double) color2.Y * (double) num1);
int num4 = (int) ((double) color2.Z * (double) num1);
if (num2 > (int) byte.MaxValue)
num2 = (int) byte.MaxValue;
if (num3 > (int) byte.MaxValue)
num3 = (int) byte.MaxValue;
if (num4 > (int) byte.MaxValue)
num4 = (int) byte.MaxValue;
int num5 = num4 << 16;
int num6 = num3 << 8;
color1.PackedValue = (uint) (num2 | num6 | num5 | -16777216);
return color1;
}
public static void GetColor9Slice(int centerX, int centerY, ref Color[] slices)
{
int index = 0;
for (int x = centerX - 1; x <= centerX + 1; ++x)
{
for (int y = centerY - 1; y <= centerY + 1; ++y)
{
Vector3 color = Lighting._activeEngine.GetColor(x, y);
int num1 = (int) ((double) byte.MaxValue * (double) color.X * (double) Lighting.GlobalBrightness);
int num2 = (int) ((double) byte.MaxValue * (double) color.Y * (double) Lighting.GlobalBrightness);
int num3 = (int) ((double) byte.MaxValue * (double) color.Z * (double) Lighting.GlobalBrightness);
if (num1 > (int) byte.MaxValue)
num1 = (int) byte.MaxValue;
if (num2 > (int) byte.MaxValue)
num2 = (int) byte.MaxValue;
if (num3 > (int) byte.MaxValue)
num3 = (int) byte.MaxValue;
int num4 = num3 << 16;
int num5 = num2 << 8;
slices[index].PackedValue = (uint) (num1 | num5 | num4 | -16777216);
index += 3;
}
index -= 8;
}
}
public static void GetColor9Slice(int x, int y, ref Vector3[] slices)
{
slices[0] = Lighting._activeEngine.GetColor(x - 1, y - 1) * Lighting.GlobalBrightness;
slices[3] = Lighting._activeEngine.GetColor(x - 1, y) * Lighting.GlobalBrightness;
slices[6] = Lighting._activeEngine.GetColor(x - 1, y + 1) * Lighting.GlobalBrightness;
slices[1] = Lighting._activeEngine.GetColor(x, y - 1) * Lighting.GlobalBrightness;
slices[4] = Lighting._activeEngine.GetColor(x, y) * Lighting.GlobalBrightness;
slices[7] = Lighting._activeEngine.GetColor(x, y + 1) * Lighting.GlobalBrightness;
slices[2] = Lighting._activeEngine.GetColor(x + 1, y - 1) * Lighting.GlobalBrightness;
slices[5] = Lighting._activeEngine.GetColor(x + 1, y) * Lighting.GlobalBrightness;
slices[8] = Lighting._activeEngine.GetColor(x + 1, y + 1) * Lighting.GlobalBrightness;
}
public static void GetCornerColors(
int centerX,
int centerY,
out VertexColors vertices,
float scale = 1f)
{
vertices = new VertexColors();
int x = centerX;
int y = centerY;
Vector3 color1 = Lighting._activeEngine.GetColor(x, y);
Vector3 color2 = Lighting._activeEngine.GetColor(x, y - 1);
Vector3 color3 = Lighting._activeEngine.GetColor(x, y + 1);
Vector3 color4 = Lighting._activeEngine.GetColor(x - 1, y);
Vector3 color5 = Lighting._activeEngine.GetColor(x + 1, y);
Vector3 color6 = Lighting._activeEngine.GetColor(x - 1, y - 1);
Vector3 color7 = Lighting._activeEngine.GetColor(x + 1, y - 1);
Vector3 color8 = Lighting._activeEngine.GetColor(x - 1, y + 1);
Vector3 color9 = Lighting._activeEngine.GetColor(x + 1, y + 1);
float num1 = (float) ((double) Lighting.GlobalBrightness * (double) scale * 63.75);
int num2 = (int) (((double) color2.X + (double) color6.X + (double) color4.X + (double) color1.X) * (double) num1);
int num3 = (int) (((double) color2.Y + (double) color6.Y + (double) color4.Y + (double) color1.Y) * (double) num1);
int num4 = (int) (((double) color2.Z + (double) color6.Z + (double) color4.Z + (double) color1.Z) * (double) num1);
if (num2 > (int) byte.MaxValue)
num2 = (int) byte.MaxValue;
if (num3 > (int) byte.MaxValue)
num3 = (int) byte.MaxValue;
if (num4 > (int) byte.MaxValue)
num4 = (int) byte.MaxValue;
int num5 = num3 << 8;
int num6 = num4 << 16;
vertices.TopLeftColor.PackedValue = (uint) (num2 | num5 | num6 | -16777216);
int num7 = (int) (((double) color2.X + (double) color7.X + (double) color5.X + (double) color1.X) * (double) num1);
int num8 = (int) (((double) color2.Y + (double) color7.Y + (double) color5.Y + (double) color1.Y) * (double) num1);
int num9 = (int) (((double) color2.Z + (double) color7.Z + (double) color5.Z + (double) color1.Z) * (double) num1);
if (num7 > (int) byte.MaxValue)
num7 = (int) byte.MaxValue;
if (num8 > (int) byte.MaxValue)
num8 = (int) byte.MaxValue;
if (num9 > (int) byte.MaxValue)
num9 = (int) byte.MaxValue;
int num10 = num8 << 8;
int num11 = num9 << 16;
vertices.TopRightColor.PackedValue = (uint) (num7 | num10 | num11 | -16777216);
int num12 = (int) (((double) color3.X + (double) color8.X + (double) color4.X + (double) color1.X) * (double) num1);
int num13 = (int) (((double) color3.Y + (double) color8.Y + (double) color4.Y + (double) color1.Y) * (double) num1);
int num14 = (int) (((double) color3.Z + (double) color8.Z + (double) color4.Z + (double) color1.Z) * (double) num1);
if (num12 > (int) byte.MaxValue)
num12 = (int) byte.MaxValue;
if (num13 > (int) byte.MaxValue)
num13 = (int) byte.MaxValue;
if (num14 > (int) byte.MaxValue)
num14 = (int) byte.MaxValue;
int num15 = num13 << 8;
int num16 = num14 << 16;
vertices.BottomLeftColor.PackedValue = (uint) (num12 | num15 | num16 | -16777216);
int num17 = (int) (((double) color3.X + (double) color9.X + (double) color5.X + (double) color1.X) * (double) num1);
int num18 = (int) (((double) color3.Y + (double) color9.Y + (double) color5.Y + (double) color1.Y) * (double) num1);
int num19 = (int) (((double) color3.Z + (double) color9.Z + (double) color5.Z + (double) color1.Z) * (double) num1);
if (num17 > (int) byte.MaxValue)
num17 = (int) byte.MaxValue;
if (num18 > (int) byte.MaxValue)
num18 = (int) byte.MaxValue;
if (num19 > (int) byte.MaxValue)
num19 = (int) byte.MaxValue;
int num20 = num18 << 8;
int num21 = num19 << 16;
vertices.BottomRightColor.PackedValue = (uint) (num17 | num20 | num21 | -16777216);
}
public static void GetColor4Slice(int centerX, int centerY, ref Color[] slices)
{
int x = centerX;
int y = centerY;
Vector3 color1 = Lighting._activeEngine.GetColor(x, y - 1);
Vector3 color2 = Lighting._activeEngine.GetColor(x, y + 1);
Vector3 color3 = Lighting._activeEngine.GetColor(x - 1, y);
Vector3 color4 = Lighting._activeEngine.GetColor(x + 1, y);
double num1 = (double) color1.X + (double) color1.Y + (double) color1.Z;
float num2 = color2.X + color2.Y + color2.Z;
float num3 = color4.X + color4.Y + color4.Z;
float num4 = color3.X + color3.Y + color3.Z;
if (num1 >= (double) num4)
{
int num5 = (int) ((double) byte.MaxValue * (double) color3.X * (double) Lighting.GlobalBrightness);
int num6 = (int) ((double) byte.MaxValue * (double) color3.Y * (double) Lighting.GlobalBrightness);
int num7 = (int) ((double) byte.MaxValue * (double) color3.Z * (double) Lighting.GlobalBrightness);
if (num5 > (int) byte.MaxValue)
num5 = (int) byte.MaxValue;
if (num6 > (int) byte.MaxValue)
num6 = (int) byte.MaxValue;
if (num7 > (int) byte.MaxValue)
num7 = (int) byte.MaxValue;
slices[0] = new Color((int) (byte) num5, (int) (byte) num6, (int) (byte) num7, (int) byte.MaxValue);
}
else
{
int num8 = (int) ((double) byte.MaxValue * (double) color1.X * (double) Lighting.GlobalBrightness);
int num9 = (int) ((double) byte.MaxValue * (double) color1.Y * (double) Lighting.GlobalBrightness);
int num10 = (int) ((double) byte.MaxValue * (double) color1.Z * (double) Lighting.GlobalBrightness);
if (num8 > (int) byte.MaxValue)
num8 = (int) byte.MaxValue;
if (num9 > (int) byte.MaxValue)
num9 = (int) byte.MaxValue;
if (num10 > (int) byte.MaxValue)
num10 = (int) byte.MaxValue;
slices[0] = new Color((int) (byte) num8, (int) (byte) num9, (int) (byte) num10, (int) byte.MaxValue);
}
if (num1 >= (double) num3)
{
int num11 = (int) ((double) byte.MaxValue * (double) color4.X * (double) Lighting.GlobalBrightness);
int num12 = (int) ((double) byte.MaxValue * (double) color4.Y * (double) Lighting.GlobalBrightness);
int num13 = (int) ((double) byte.MaxValue * (double) color4.Z * (double) Lighting.GlobalBrightness);
if (num11 > (int) byte.MaxValue)
num11 = (int) byte.MaxValue;
if (num12 > (int) byte.MaxValue)
num12 = (int) byte.MaxValue;
if (num13 > (int) byte.MaxValue)
num13 = (int) byte.MaxValue;
slices[1] = new Color((int) (byte) num11, (int) (byte) num12, (int) (byte) num13, (int) byte.MaxValue);
}
else
{
int num14 = (int) ((double) byte.MaxValue * (double) color1.X * (double) Lighting.GlobalBrightness);
int num15 = (int) ((double) byte.MaxValue * (double) color1.Y * (double) Lighting.GlobalBrightness);
int num16 = (int) ((double) byte.MaxValue * (double) color1.Z * (double) Lighting.GlobalBrightness);
if (num14 > (int) byte.MaxValue)
num14 = (int) byte.MaxValue;
if (num15 > (int) byte.MaxValue)
num15 = (int) byte.MaxValue;
if (num16 > (int) byte.MaxValue)
num16 = (int) byte.MaxValue;
slices[1] = new Color((int) (byte) num14, (int) (byte) num15, (int) (byte) num16, (int) byte.MaxValue);
}
if ((double) num2 >= (double) num4)
{
int num17 = (int) ((double) byte.MaxValue * (double) color3.X * (double) Lighting.GlobalBrightness);
int num18 = (int) ((double) byte.MaxValue * (double) color3.Y * (double) Lighting.GlobalBrightness);
int num19 = (int) ((double) byte.MaxValue * (double) color3.Z * (double) Lighting.GlobalBrightness);
if (num17 > (int) byte.MaxValue)
num17 = (int) byte.MaxValue;
if (num18 > (int) byte.MaxValue)
num18 = (int) byte.MaxValue;
if (num19 > (int) byte.MaxValue)
num19 = (int) byte.MaxValue;
slices[2] = new Color((int) (byte) num17, (int) (byte) num18, (int) (byte) num19, (int) byte.MaxValue);
}
else
{
int num20 = (int) ((double) byte.MaxValue * (double) color2.X * (double) Lighting.GlobalBrightness);
int num21 = (int) ((double) byte.MaxValue * (double) color2.Y * (double) Lighting.GlobalBrightness);
int num22 = (int) ((double) byte.MaxValue * (double) color2.Z * (double) Lighting.GlobalBrightness);
if (num20 > (int) byte.MaxValue)
num20 = (int) byte.MaxValue;
if (num21 > (int) byte.MaxValue)
num21 = (int) byte.MaxValue;
if (num22 > (int) byte.MaxValue)
num22 = (int) byte.MaxValue;
slices[2] = new Color((int) (byte) num20, (int) (byte) num21, (int) (byte) num22, (int) byte.MaxValue);
}
if ((double) num2 >= (double) num3)
{
int num23 = (int) ((double) byte.MaxValue * (double) color4.X * (double) Lighting.GlobalBrightness);
int num24 = (int) ((double) byte.MaxValue * (double) color4.Y * (double) Lighting.GlobalBrightness);
int num25 = (int) ((double) byte.MaxValue * (double) color4.Z * (double) Lighting.GlobalBrightness);
if (num23 > (int) byte.MaxValue)
num23 = (int) byte.MaxValue;
if (num24 > (int) byte.MaxValue)
num24 = (int) byte.MaxValue;
if (num25 > (int) byte.MaxValue)
num25 = (int) byte.MaxValue;
slices[3] = new Color((int) (byte) num23, (int) (byte) num24, (int) (byte) num25, (int) byte.MaxValue);
}
else
{
int num26 = (int) ((double) byte.MaxValue * (double) color2.X * (double) Lighting.GlobalBrightness);
int num27 = (int) ((double) byte.MaxValue * (double) color2.Y * (double) Lighting.GlobalBrightness);
int num28 = (int) ((double) byte.MaxValue * (double) color2.Z * (double) Lighting.GlobalBrightness);
if (num26 > (int) byte.MaxValue)
num26 = (int) byte.MaxValue;
if (num27 > (int) byte.MaxValue)
num27 = (int) byte.MaxValue;
if (num28 > (int) byte.MaxValue)
num28 = (int) byte.MaxValue;
slices[3] = new Color((int) (byte) num26, (int) (byte) num27, (int) (byte) num28, (int) byte.MaxValue);
}
}
public static void GetColor4Slice(int x, int y, ref Vector3[] slices)
{
Vector3 color1 = Lighting._activeEngine.GetColor(x, y - 1);
Vector3 color2 = Lighting._activeEngine.GetColor(x, y + 1);
Vector3 color3 = Lighting._activeEngine.GetColor(x - 1, y);
Vector3 color4 = Lighting._activeEngine.GetColor(x + 1, y);
double num1 = (double) color1.X + (double) color1.Y + (double) color1.Z;
float num2 = color2.X + color2.Y + color2.Z;
float num3 = color4.X + color4.Y + color4.Z;
float num4 = color3.X + color3.Y + color3.Z;
slices[0] = num1 < (double) num4 ? color1 * Lighting.GlobalBrightness : color3 * Lighting.GlobalBrightness;
slices[1] = num1 < (double) num3 ? color1 * Lighting.GlobalBrightness : color4 * Lighting.GlobalBrightness;
slices[2] = (double) num2 < (double) num4 ? color2 * Lighting.GlobalBrightness : color3 * Lighting.GlobalBrightness;
if ((double) num2 >= (double) num3)
slices[3] = color4 * Lighting.GlobalBrightness;
else
slices[3] = color2 * Lighting.GlobalBrightness;
}
}
}