198 lines
5.9 KiB
C#
198 lines
5.9 KiB
C#
// Decompiled with JetBrains decompiler
|
|
// Type: Terraria.Graphics.Light.LightMap
|
|
// 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.Threading;
|
|
using Terraria.Utilities;
|
|
|
|
namespace Terraria.Graphics.Light
|
|
{
|
|
public class LightMap
|
|
{
|
|
private Vector3[] _colors;
|
|
private LightMaskMode[] _mask;
|
|
private FastRandom _random = FastRandom.CreateWithRandomSeed();
|
|
private const int DEFAULT_WIDTH = 203;
|
|
private const int DEFAULT_HEIGHT = 203;
|
|
|
|
public int NonVisiblePadding { get; set; }
|
|
|
|
public int Width { get; private set; }
|
|
|
|
public int Height { get; private set; }
|
|
|
|
public float LightDecayThroughAir { get; set; }
|
|
|
|
public float LightDecayThroughSolid { get; set; }
|
|
|
|
public Vector3 LightDecayThroughWater { get; set; }
|
|
|
|
public Vector3 LightDecayThroughHoney { get; set; }
|
|
|
|
public Vector3 this[int x, int y]
|
|
{
|
|
get => this._colors[this.IndexOf(x, y)];
|
|
set => this._colors[this.IndexOf(x, y)] = value;
|
|
}
|
|
|
|
public LightMap()
|
|
{
|
|
this.LightDecayThroughAir = 0.91f;
|
|
this.LightDecayThroughSolid = 0.56f;
|
|
this.LightDecayThroughWater = new Vector3(0.88f, 0.96f, 1.015f) * 0.91f;
|
|
this.LightDecayThroughHoney = new Vector3(0.75f, 0.7f, 0.6f) * 0.91f;
|
|
this.Width = 203;
|
|
this.Height = 203;
|
|
this._colors = new Vector3[41209];
|
|
this._mask = new LightMaskMode[41209];
|
|
}
|
|
|
|
public void GetLight(int x, int y, out Vector3 color) => color = this._colors[this.IndexOf(x, y)];
|
|
|
|
public LightMaskMode GetMask(int x, int y) => this._mask[this.IndexOf(x, y)];
|
|
|
|
public void Clear()
|
|
{
|
|
for (int index = 0; index < this._colors.Length; ++index)
|
|
{
|
|
this._colors[index].X = 0.0f;
|
|
this._colors[index].Y = 0.0f;
|
|
this._colors[index].Z = 0.0f;
|
|
this._mask[index] = LightMaskMode.None;
|
|
}
|
|
}
|
|
|
|
public void SetMaskAt(int x, int y, LightMaskMode mode) => this._mask[this.IndexOf(x, y)] = mode;
|
|
|
|
public void Blur()
|
|
{
|
|
this.BlurPass();
|
|
this.BlurPass();
|
|
this._random.NextSeed();
|
|
}
|
|
|
|
private void BlurPass()
|
|
{
|
|
// ISSUE: method pointer
|
|
FastParallel.For(0, this.Width, new ParallelForAction((object) this, __methodptr(\u003CBlurPass\u003Eb__42_0)), (object) null);
|
|
// ISSUE: method pointer
|
|
FastParallel.For(0, this.Height, new ParallelForAction((object) this, __methodptr(\u003CBlurPass\u003Eb__42_1)), (object) null);
|
|
}
|
|
|
|
private void BlurLine(int startIndex, int endIndex, int stride)
|
|
{
|
|
Vector3 zero = Vector3.Zero;
|
|
bool flag1 = false;
|
|
bool flag2 = false;
|
|
bool flag3 = false;
|
|
for (int index = startIndex; index != endIndex + stride; index += stride)
|
|
{
|
|
if ((double) zero.X < (double) this._colors[index].X)
|
|
{
|
|
zero.X = this._colors[index].X;
|
|
flag1 = false;
|
|
}
|
|
else if (!flag1)
|
|
{
|
|
if ((double) zero.X < 0.0185000002384186)
|
|
flag1 = true;
|
|
else
|
|
this._colors[index].X = zero.X;
|
|
}
|
|
if ((double) zero.Y < (double) this._colors[index].Y)
|
|
{
|
|
zero.Y = this._colors[index].Y;
|
|
flag2 = false;
|
|
}
|
|
else if (!flag2)
|
|
{
|
|
if ((double) zero.Y < 0.0185000002384186)
|
|
flag2 = true;
|
|
else
|
|
this._colors[index].Y = zero.Y;
|
|
}
|
|
if ((double) zero.Z < (double) this._colors[index].Z)
|
|
{
|
|
zero.Z = this._colors[index].Z;
|
|
flag3 = false;
|
|
}
|
|
else if (!flag3)
|
|
{
|
|
if ((double) zero.Z < 0.0185000002384186)
|
|
flag3 = true;
|
|
else
|
|
this._colors[index].Z = zero.Z;
|
|
}
|
|
if (!(flag1 & flag3 & flag2))
|
|
{
|
|
switch (this._mask[index])
|
|
{
|
|
case LightMaskMode.None:
|
|
if (!flag1)
|
|
zero.X *= this.LightDecayThroughAir;
|
|
if (!flag2)
|
|
zero.Y *= this.LightDecayThroughAir;
|
|
if (!flag3)
|
|
{
|
|
zero.Z *= this.LightDecayThroughAir;
|
|
continue;
|
|
}
|
|
continue;
|
|
case LightMaskMode.Solid:
|
|
if (!flag1)
|
|
zero.X *= this.LightDecayThroughSolid;
|
|
if (!flag2)
|
|
zero.Y *= this.LightDecayThroughSolid;
|
|
if (!flag3)
|
|
{
|
|
zero.Z *= this.LightDecayThroughSolid;
|
|
continue;
|
|
}
|
|
continue;
|
|
case LightMaskMode.Water:
|
|
float num = (float) this._random.WithModifier((ulong) index).Next(98, 100) / 100f;
|
|
if (!flag1)
|
|
zero.X *= this.LightDecayThroughWater.X * num;
|
|
if (!flag2)
|
|
zero.Y *= this.LightDecayThroughWater.Y * num;
|
|
if (!flag3)
|
|
{
|
|
zero.Z *= this.LightDecayThroughWater.Z * num;
|
|
continue;
|
|
}
|
|
continue;
|
|
case LightMaskMode.Honey:
|
|
if (!flag1)
|
|
zero.X *= this.LightDecayThroughHoney.X;
|
|
if (!flag2)
|
|
zero.Y *= this.LightDecayThroughHoney.Y;
|
|
if (!flag3)
|
|
{
|
|
zero.Z *= this.LightDecayThroughHoney.Z;
|
|
continue;
|
|
}
|
|
continue;
|
|
default:
|
|
continue;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
private int IndexOf(int x, int y) => x * this.Height + y;
|
|
|
|
public void SetSize(int width, int height)
|
|
{
|
|
if (width * height > this._colors.Length)
|
|
{
|
|
this._colors = new Vector3[width * height];
|
|
this._mask = new LightMaskMode[width * height];
|
|
}
|
|
this.Width = width;
|
|
this.Height = height;
|
|
}
|
|
}
|
|
}
|