Terraria 1.4.0.5 Source Code

This commit is contained in:
MikeyIsBaeYT 2021-10-26 12:45:26 -04:00
commit 05205f009e
1059 changed files with 563450 additions and 0 deletions

View file

@ -0,0 +1,607 @@
// Decompiled with JetBrains decompiler
// Type: Terraria.GameContent.Liquid.LiquidRenderer
// 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 Microsoft.Xna.Framework.Graphics;
using ReLogic.Content;
using System;
using Terraria.Graphics;
using Terraria.ID;
using Terraria.Utilities;
namespace Terraria.GameContent.Liquid
{
public class LiquidRenderer
{
private const int ANIMATION_FRAME_COUNT = 16;
private const int CACHE_PADDING = 2;
private const int CACHE_PADDING_2 = 4;
private static readonly int[] WATERFALL_LENGTH = new int[3]
{
10,
3,
2
};
private static readonly float[] DEFAULT_OPACITY = new float[3]
{
0.6f,
0.95f,
0.95f
};
private static readonly byte[] WAVE_MASK_STRENGTH = new byte[5]
{
(byte) 0,
(byte) 0,
(byte) 0,
byte.MaxValue,
(byte) 0
};
private static readonly byte[] VISCOSITY_MASK = new byte[5]
{
(byte) 0,
(byte) 200,
(byte) 240,
(byte) 0,
(byte) 0
};
public const float MIN_LIQUID_SIZE = 0.25f;
public static LiquidRenderer Instance;
private readonly Asset<Texture2D>[] _liquidTextures = new Asset<Texture2D>[13];
private LiquidRenderer.LiquidCache[] _cache = new LiquidRenderer.LiquidCache[1];
private LiquidRenderer.LiquidDrawCache[] _drawCache = new LiquidRenderer.LiquidDrawCache[1];
private int _animationFrame;
private Rectangle _drawArea = new Rectangle(0, 0, 1, 1);
private readonly UnifiedRandom _random = new UnifiedRandom();
private Color[] _waveMask = new Color[1];
private float _frameState;
public event Action<Color[], Rectangle> WaveFilters;
private static Tile[,] Tiles => Main.tile;
public static void LoadContent()
{
LiquidRenderer.Instance = new LiquidRenderer();
LiquidRenderer.Instance.PrepareAssets();
}
private void PrepareAssets()
{
for (int index = 0; index < this._liquidTextures.Length; ++index)
this._liquidTextures[index] = Main.Assets.Request<Texture2D>("Images/Misc/water_" + (object) index, (AssetRequestMode) 1);
}
private unsafe void InternalPrepareDraw(Rectangle drawArea)
{
Rectangle rectangle = new Rectangle(drawArea.X - 2, drawArea.Y - 2, drawArea.Width + 4, drawArea.Height + 4);
this._drawArea = drawArea;
if (this._cache.Length < rectangle.Width * rectangle.Height + 1)
this._cache = new LiquidRenderer.LiquidCache[rectangle.Width * rectangle.Height + 1];
if (this._drawCache.Length < drawArea.Width * drawArea.Height + 1)
this._drawCache = new LiquidRenderer.LiquidDrawCache[drawArea.Width * drawArea.Height + 1];
if (this._waveMask.Length < drawArea.Width * drawArea.Height)
this._waveMask = new Color[drawArea.Width * drawArea.Height];
fixed (LiquidRenderer.LiquidCache* liquidCachePtr1 = &this._cache[1])
{
int num1 = rectangle.Height * 2 + 2;
LiquidRenderer.LiquidCache* liquidCachePtr2 = liquidCachePtr1;
for (int x = rectangle.X; x < rectangle.X + rectangle.Width; ++x)
{
for (int y = rectangle.Y; y < rectangle.Y + rectangle.Height; ++y)
{
Tile tile = LiquidRenderer.Tiles[x, y] ?? new Tile();
liquidCachePtr2->LiquidLevel = (float) tile.liquid / (float) byte.MaxValue;
liquidCachePtr2->IsHalfBrick = tile.halfBrick() && liquidCachePtr2[-1].HasLiquid && !TileID.Sets.Platforms[(int) tile.type];
liquidCachePtr2->IsSolid = WorldGen.SolidOrSlopedTile(tile);
liquidCachePtr2->HasLiquid = tile.liquid > (byte) 0;
liquidCachePtr2->VisibleLiquidLevel = 0.0f;
liquidCachePtr2->HasWall = tile.wall > (ushort) 0;
liquidCachePtr2->Type = tile.liquidType();
if (liquidCachePtr2->IsHalfBrick && !liquidCachePtr2->HasLiquid)
liquidCachePtr2->Type = liquidCachePtr2[-1].Type;
++liquidCachePtr2;
}
}
LiquidRenderer.LiquidCache* liquidCachePtr3 = liquidCachePtr1 + num1;
for (int index1 = 2; index1 < rectangle.Width - 2; ++index1)
{
for (int index2 = 2; index2 < rectangle.Height - 2; ++index2)
{
float val1 = 0.0f;
float num2;
if (liquidCachePtr3->IsHalfBrick && liquidCachePtr3[-1].HasLiquid)
num2 = 1f;
else if (!liquidCachePtr3->HasLiquid)
{
LiquidRenderer.LiquidCache liquidCache1 = liquidCachePtr3[-1];
LiquidRenderer.LiquidCache liquidCache2 = liquidCachePtr3[1];
LiquidRenderer.LiquidCache liquidCache3 = liquidCachePtr3[-rectangle.Height];
LiquidRenderer.LiquidCache liquidCache4 = liquidCachePtr3[rectangle.Height];
if (liquidCache1.HasLiquid && liquidCache2.HasLiquid && (int) liquidCache1.Type == (int) liquidCache2.Type && !liquidCache1.IsSolid && !liquidCache2.IsSolid)
{
val1 = liquidCache1.LiquidLevel + liquidCache2.LiquidLevel;
liquidCachePtr3->Type = liquidCache1.Type;
}
if (liquidCache3.HasLiquid && liquidCache4.HasLiquid && (int) liquidCache3.Type == (int) liquidCache4.Type && !liquidCache3.IsSolid && !liquidCache4.IsSolid)
{
val1 = Math.Max(val1, liquidCache3.LiquidLevel + liquidCache4.LiquidLevel);
liquidCachePtr3->Type = liquidCache3.Type;
}
num2 = val1 * 0.5f;
}
else
num2 = liquidCachePtr3->LiquidLevel;
liquidCachePtr3->VisibleLiquidLevel = num2;
liquidCachePtr3->HasVisibleLiquid = (double) num2 != 0.0;
++liquidCachePtr3;
}
liquidCachePtr3 += 4;
}
LiquidRenderer.LiquidCache* liquidCachePtr4 = liquidCachePtr1;
for (int index3 = 0; index3 < rectangle.Width; ++index3)
{
for (int index4 = 0; index4 < rectangle.Height - 10; ++index4)
{
if (liquidCachePtr4->HasVisibleLiquid && (!liquidCachePtr4->IsSolid || liquidCachePtr4->IsHalfBrick))
{
liquidCachePtr4->Opacity = 1f;
liquidCachePtr4->VisibleType = liquidCachePtr4->Type;
float num3 = 1f / (float) (LiquidRenderer.WATERFALL_LENGTH[(int) liquidCachePtr4->Type] + 1);
float num4 = 1f;
for (int index5 = 1; index5 <= LiquidRenderer.WATERFALL_LENGTH[(int) liquidCachePtr4->Type]; ++index5)
{
num4 -= num3;
if (!liquidCachePtr4[index5].IsSolid)
{
liquidCachePtr4[index5].VisibleLiquidLevel = Math.Max(liquidCachePtr4[index5].VisibleLiquidLevel, liquidCachePtr4->VisibleLiquidLevel * num4);
liquidCachePtr4[index5].Opacity = num4;
liquidCachePtr4[index5].VisibleType = liquidCachePtr4->Type;
}
else
break;
}
}
if (liquidCachePtr4->IsSolid && !liquidCachePtr4->IsHalfBrick)
{
liquidCachePtr4->VisibleLiquidLevel = 1f;
liquidCachePtr4->HasVisibleLiquid = false;
}
else
liquidCachePtr4->HasVisibleLiquid = (double) liquidCachePtr4->VisibleLiquidLevel != 0.0;
++liquidCachePtr4;
}
liquidCachePtr4 += 10;
}
LiquidRenderer.LiquidCache* liquidCachePtr5 = liquidCachePtr1 + num1;
for (int index6 = 2; index6 < rectangle.Width - 2; ++index6)
{
for (int index7 = 2; index7 < rectangle.Height - 2; ++index7)
{
if (!liquidCachePtr5->HasVisibleLiquid)
{
liquidCachePtr5->HasLeftEdge = false;
liquidCachePtr5->HasTopEdge = false;
liquidCachePtr5->HasRightEdge = false;
liquidCachePtr5->HasBottomEdge = false;
}
else
{
LiquidRenderer.LiquidCache liquidCache5 = liquidCachePtr5[-1];
LiquidRenderer.LiquidCache liquidCache6 = liquidCachePtr5[1];
LiquidRenderer.LiquidCache liquidCache7 = liquidCachePtr5[-rectangle.Height];
LiquidRenderer.LiquidCache liquidCache8 = liquidCachePtr5[rectangle.Height];
float num5 = 0.0f;
float num6 = 1f;
float num7 = 0.0f;
float num8 = 1f;
float visibleLiquidLevel = liquidCachePtr5->VisibleLiquidLevel;
if (!liquidCache5.HasVisibleLiquid)
num7 += liquidCache6.VisibleLiquidLevel * (1f - visibleLiquidLevel);
if (!liquidCache6.HasVisibleLiquid && !liquidCache6.IsSolid && !liquidCache6.IsHalfBrick)
num8 -= liquidCache5.VisibleLiquidLevel * (1f - visibleLiquidLevel);
if (!liquidCache7.HasVisibleLiquid && !liquidCache7.IsSolid && !liquidCache7.IsHalfBrick)
num5 += liquidCache8.VisibleLiquidLevel * (1f - visibleLiquidLevel);
if (!liquidCache8.HasVisibleLiquid && !liquidCache8.IsSolid && !liquidCache8.IsHalfBrick)
num6 -= liquidCache7.VisibleLiquidLevel * (1f - visibleLiquidLevel);
liquidCachePtr5->LeftWall = num5;
liquidCachePtr5->RightWall = num6;
liquidCachePtr5->BottomWall = num8;
liquidCachePtr5->TopWall = num7;
Point zero = Point.Zero;
liquidCachePtr5->HasTopEdge = !liquidCache5.HasVisibleLiquid && !liquidCache5.IsSolid || (double) num7 != 0.0;
liquidCachePtr5->HasBottomEdge = !liquidCache6.HasVisibleLiquid && !liquidCache6.IsSolid || (double) num8 != 1.0;
liquidCachePtr5->HasLeftEdge = !liquidCache7.HasVisibleLiquid && !liquidCache7.IsSolid || (double) num5 != 0.0;
liquidCachePtr5->HasRightEdge = !liquidCache8.HasVisibleLiquid && !liquidCache8.IsSolid || (double) num6 != 1.0;
if (!liquidCachePtr5->HasLeftEdge)
{
if (liquidCachePtr5->HasRightEdge)
zero.X += 32;
else
zero.X += 16;
}
if (liquidCachePtr5->HasLeftEdge && liquidCachePtr5->HasRightEdge)
{
zero.X = 16;
zero.Y += 32;
if (liquidCachePtr5->HasTopEdge)
zero.Y = 16;
}
else if (!liquidCachePtr5->HasTopEdge)
{
if (!liquidCachePtr5->HasLeftEdge && !liquidCachePtr5->HasRightEdge)
zero.Y += 48;
else
zero.Y += 16;
}
if (zero.Y == 16 && liquidCachePtr5->HasLeftEdge ^ liquidCachePtr5->HasRightEdge && (index7 + rectangle.Y) % 2 == 0)
zero.Y += 16;
liquidCachePtr5->FrameOffset = zero;
}
++liquidCachePtr5;
}
liquidCachePtr5 += 4;
}
LiquidRenderer.LiquidCache* liquidCachePtr6 = liquidCachePtr1 + num1;
for (int index8 = 2; index8 < rectangle.Width - 2; ++index8)
{
for (int index9 = 2; index9 < rectangle.Height - 2; ++index9)
{
if (liquidCachePtr6->HasVisibleLiquid)
{
LiquidRenderer.LiquidCache liquidCache9 = liquidCachePtr6[-1];
LiquidRenderer.LiquidCache liquidCache10 = liquidCachePtr6[1];
LiquidRenderer.LiquidCache liquidCache11 = liquidCachePtr6[-rectangle.Height];
LiquidRenderer.LiquidCache liquidCache12 = liquidCachePtr6[rectangle.Height];
liquidCachePtr6->VisibleLeftWall = liquidCachePtr6->LeftWall;
liquidCachePtr6->VisibleRightWall = liquidCachePtr6->RightWall;
liquidCachePtr6->VisibleTopWall = liquidCachePtr6->TopWall;
liquidCachePtr6->VisibleBottomWall = liquidCachePtr6->BottomWall;
if (liquidCache9.HasVisibleLiquid && liquidCache10.HasVisibleLiquid)
{
if (liquidCachePtr6->HasLeftEdge)
liquidCachePtr6->VisibleLeftWall = (float) (((double) liquidCachePtr6->LeftWall * 2.0 + (double) liquidCache9.LeftWall + (double) liquidCache10.LeftWall) * 0.25);
if (liquidCachePtr6->HasRightEdge)
liquidCachePtr6->VisibleRightWall = (float) (((double) liquidCachePtr6->RightWall * 2.0 + (double) liquidCache9.RightWall + (double) liquidCache10.RightWall) * 0.25);
}
if (liquidCache11.HasVisibleLiquid && liquidCache12.HasVisibleLiquid)
{
if (liquidCachePtr6->HasTopEdge)
liquidCachePtr6->VisibleTopWall = (float) (((double) liquidCachePtr6->TopWall * 2.0 + (double) liquidCache11.TopWall + (double) liquidCache12.TopWall) * 0.25);
if (liquidCachePtr6->HasBottomEdge)
liquidCachePtr6->VisibleBottomWall = (float) (((double) liquidCachePtr6->BottomWall * 2.0 + (double) liquidCache11.BottomWall + (double) liquidCache12.BottomWall) * 0.25);
}
}
++liquidCachePtr6;
}
liquidCachePtr6 += 4;
}
LiquidRenderer.LiquidCache* liquidCachePtr7 = liquidCachePtr1 + num1;
for (int index10 = 2; index10 < rectangle.Width - 2; ++index10)
{
for (int index11 = 2; index11 < rectangle.Height - 2; ++index11)
{
if (liquidCachePtr7->HasLiquid)
{
LiquidRenderer.LiquidCache liquidCache13 = liquidCachePtr7[-1];
LiquidRenderer.LiquidCache liquidCache14 = liquidCachePtr7[1];
LiquidRenderer.LiquidCache liquidCache15 = liquidCachePtr7[-rectangle.Height];
LiquidRenderer.LiquidCache liquidCache16 = liquidCachePtr7[rectangle.Height];
if (liquidCachePtr7->HasTopEdge && !liquidCachePtr7->HasBottomEdge && liquidCachePtr7->HasLeftEdge ^ liquidCachePtr7->HasRightEdge)
{
if (liquidCachePtr7->HasRightEdge)
{
liquidCachePtr7->VisibleRightWall = liquidCache14.VisibleRightWall;
liquidCachePtr7->VisibleTopWall = liquidCache15.VisibleTopWall;
}
else
{
liquidCachePtr7->VisibleLeftWall = liquidCache14.VisibleLeftWall;
liquidCachePtr7->VisibleTopWall = liquidCache16.VisibleTopWall;
}
}
else if (liquidCache14.FrameOffset.X == 16 && liquidCache14.FrameOffset.Y == 32)
{
if ((double) liquidCachePtr7->VisibleLeftWall > 0.5)
{
liquidCachePtr7->VisibleLeftWall = 0.0f;
liquidCachePtr7->FrameOffset = new Point(0, 0);
}
else if ((double) liquidCachePtr7->VisibleRightWall < 0.5)
{
liquidCachePtr7->VisibleRightWall = 1f;
liquidCachePtr7->FrameOffset = new Point(32, 0);
}
}
}
++liquidCachePtr7;
}
liquidCachePtr7 += 4;
}
LiquidRenderer.LiquidCache* liquidCachePtr8 = liquidCachePtr1 + num1;
for (int index12 = 2; index12 < rectangle.Width - 2; ++index12)
{
for (int index13 = 2; index13 < rectangle.Height - 2; ++index13)
{
if (liquidCachePtr8->HasLiquid)
{
LiquidRenderer.LiquidCache liquidCache17 = liquidCachePtr8[-1];
LiquidRenderer.LiquidCache liquidCache18 = liquidCachePtr8[1];
LiquidRenderer.LiquidCache liquidCache19 = liquidCachePtr8[-rectangle.Height];
LiquidRenderer.LiquidCache liquidCache20 = liquidCachePtr8[rectangle.Height];
if (!liquidCachePtr8->HasBottomEdge && !liquidCachePtr8->HasLeftEdge && !liquidCachePtr8->HasTopEdge && !liquidCachePtr8->HasRightEdge)
{
if (liquidCache19.HasTopEdge && liquidCache17.HasLeftEdge)
{
liquidCachePtr8->FrameOffset.X = Math.Max(4, (int) (16.0 - (double) liquidCache17.VisibleLeftWall * 16.0)) - 4;
liquidCachePtr8->FrameOffset.Y = 48 + Math.Max(4, (int) (16.0 - (double) liquidCache19.VisibleTopWall * 16.0)) - 4;
liquidCachePtr8->VisibleLeftWall = 0.0f;
liquidCachePtr8->VisibleTopWall = 0.0f;
liquidCachePtr8->VisibleRightWall = 1f;
liquidCachePtr8->VisibleBottomWall = 1f;
}
else if (liquidCache20.HasTopEdge && liquidCache17.HasRightEdge)
{
liquidCachePtr8->FrameOffset.X = 32 - Math.Min(16, (int) ((double) liquidCache17.VisibleRightWall * 16.0) - 4);
liquidCachePtr8->FrameOffset.Y = 48 + Math.Max(4, (int) (16.0 - (double) liquidCache20.VisibleTopWall * 16.0)) - 4;
liquidCachePtr8->VisibleLeftWall = 0.0f;
liquidCachePtr8->VisibleTopWall = 0.0f;
liquidCachePtr8->VisibleRightWall = 1f;
liquidCachePtr8->VisibleBottomWall = 1f;
}
}
}
++liquidCachePtr8;
}
liquidCachePtr8 += 4;
}
LiquidRenderer.LiquidCache* liquidCachePtr9 = liquidCachePtr1 + num1;
fixed (LiquidRenderer.LiquidDrawCache* liquidDrawCachePtr1 = &this._drawCache[0])
fixed (Color* colorPtr1 = &this._waveMask[0])
{
LiquidRenderer.LiquidDrawCache* liquidDrawCachePtr2 = liquidDrawCachePtr1;
Color* colorPtr2 = colorPtr1;
for (int index14 = 2; index14 < rectangle.Width - 2; ++index14)
{
for (int index15 = 2; index15 < rectangle.Height - 2; ++index15)
{
if (liquidCachePtr9->HasVisibleLiquid)
{
float num9 = Math.Min(0.75f, liquidCachePtr9->VisibleLeftWall);
float num10 = Math.Max(0.25f, liquidCachePtr9->VisibleRightWall);
float num11 = Math.Min(0.75f, liquidCachePtr9->VisibleTopWall);
float num12 = Math.Max(0.25f, liquidCachePtr9->VisibleBottomWall);
if (liquidCachePtr9->IsHalfBrick && liquidCachePtr9->IsSolid && (double) num12 > 0.5)
num12 = 0.5f;
liquidDrawCachePtr2->IsVisible = liquidCachePtr9->HasWall || !liquidCachePtr9->IsHalfBrick || !liquidCachePtr9->HasLiquid || (double) liquidCachePtr9->LiquidLevel >= 1.0;
liquidDrawCachePtr2->SourceRectangle = new Rectangle((int) (16.0 - (double) num10 * 16.0) + liquidCachePtr9->FrameOffset.X, (int) (16.0 - (double) num12 * 16.0) + liquidCachePtr9->FrameOffset.Y, (int) Math.Ceiling(((double) num10 - (double) num9) * 16.0), (int) Math.Ceiling(((double) num12 - (double) num11) * 16.0));
liquidDrawCachePtr2->IsSurfaceLiquid = liquidCachePtr9->FrameOffset.X == 16 && liquidCachePtr9->FrameOffset.Y == 0 && (double) (index15 + rectangle.Y) > Main.worldSurface - 40.0;
liquidDrawCachePtr2->Opacity = liquidCachePtr9->Opacity;
liquidDrawCachePtr2->LiquidOffset = new Vector2((float) Math.Floor((double) num9 * 16.0), (float) Math.Floor((double) num11 * 16.0));
liquidDrawCachePtr2->Type = liquidCachePtr9->VisibleType;
liquidDrawCachePtr2->HasWall = liquidCachePtr9->HasWall;
byte num13 = LiquidRenderer.WAVE_MASK_STRENGTH[(int) liquidCachePtr9->VisibleType];
byte num14 = (byte) ((uint) num13 >> 1);
colorPtr2->R = num14;
colorPtr2->G = num14;
colorPtr2->B = LiquidRenderer.VISCOSITY_MASK[(int) liquidCachePtr9->VisibleType];
colorPtr2->A = num13;
LiquidRenderer.LiquidCache* liquidCachePtr10 = liquidCachePtr9 - 1;
if (index15 != 2 && !liquidCachePtr10->HasVisibleLiquid && !liquidCachePtr10->IsSolid && !liquidCachePtr10->IsHalfBrick)
*(colorPtr2 - 1) = *colorPtr2;
}
else
{
liquidDrawCachePtr2->IsVisible = false;
int index16 = liquidCachePtr9->IsSolid || liquidCachePtr9->IsHalfBrick ? 3 : 4;
byte num15 = LiquidRenderer.WAVE_MASK_STRENGTH[index16];
byte num16 = (byte) ((uint) num15 >> 1);
colorPtr2->R = num16;
colorPtr2->G = num16;
colorPtr2->B = LiquidRenderer.VISCOSITY_MASK[index16];
colorPtr2->A = num15;
}
++liquidCachePtr9;
++liquidDrawCachePtr2;
++colorPtr2;
}
liquidCachePtr9 += 4;
}
}
LiquidRenderer.LiquidCache* liquidCachePtr11 = liquidCachePtr1;
for (int x = rectangle.X; x < rectangle.X + rectangle.Width; ++x)
{
for (int y = rectangle.Y; y < rectangle.Y + rectangle.Height; ++y)
{
if (liquidCachePtr11->VisibleType == (byte) 1 && liquidCachePtr11->HasVisibleLiquid && Dust.lavaBubbles < 200)
{
if (this._random.Next(700) == 0)
Dust.NewDust(new Vector2((float) (x * 16), (float) (y * 16)), 16, 16, 35, newColor: Color.White);
if (this._random.Next(350) == 0)
{
int index = Dust.NewDust(new Vector2((float) (x * 16), (float) (y * 16)), 16, 8, 35, Alpha: 50, newColor: Color.White, Scale: 1.5f);
Main.dust[index].velocity *= 0.8f;
Main.dust[index].velocity.X *= 2f;
Main.dust[index].velocity.Y -= (float) this._random.Next(1, 7) * 0.1f;
if (this._random.Next(10) == 0)
Main.dust[index].velocity.Y *= (float) this._random.Next(2, 5);
Main.dust[index].noGravity = true;
}
}
++liquidCachePtr11;
}
}
}
if (this.WaveFilters == null)
return;
this.WaveFilters(this._waveMask, this.GetCachedDrawArea());
}
private unsafe void InternalDraw(
SpriteBatch spriteBatch,
Vector2 drawOffset,
int waterStyle,
float globalAlpha,
bool isBackgroundDraw)
{
Rectangle drawArea = this._drawArea;
Main.tileBatch.Begin();
fixed (LiquidRenderer.LiquidDrawCache* liquidDrawCachePtr1 = &this._drawCache[0])
{
LiquidRenderer.LiquidDrawCache* liquidDrawCachePtr2 = liquidDrawCachePtr1;
for (int x = drawArea.X; x < drawArea.X + drawArea.Width; ++x)
{
for (int y = drawArea.Y; y < drawArea.Y + drawArea.Height; ++y)
{
if (liquidDrawCachePtr2->IsVisible)
{
Rectangle sourceRectangle = liquidDrawCachePtr2->SourceRectangle;
if (liquidDrawCachePtr2->IsSurfaceLiquid)
sourceRectangle.Y = 1280;
else
sourceRectangle.Y += this._animationFrame * 80;
Vector2 liquidOffset = liquidDrawCachePtr2->LiquidOffset;
float val2 = liquidDrawCachePtr2->Opacity * (isBackgroundDraw ? 1f : LiquidRenderer.DEFAULT_OPACITY[(int) liquidDrawCachePtr2->Type]);
int index = (int) liquidDrawCachePtr2->Type;
switch (index)
{
case 0:
index = waterStyle;
val2 *= globalAlpha;
break;
case 2:
index = 11;
break;
}
float num = Math.Min(1f, val2);
VertexColors vertices;
Lighting.GetCornerColors(x, y, out vertices);
vertices.BottomLeftColor *= num;
vertices.BottomRightColor *= num;
vertices.TopLeftColor *= num;
vertices.TopRightColor *= num;
Main.DrawTileInWater(drawOffset, x, y);
Main.tileBatch.Draw(this._liquidTextures[index].Value, new Vector2((float) (x << 4), (float) (y << 4)) + drawOffset + liquidOffset, new Rectangle?(sourceRectangle), vertices, Vector2.Zero, 1f, SpriteEffects.None);
}
++liquidDrawCachePtr2;
}
}
}
Main.tileBatch.End();
}
public bool HasFullWater(int x, int y)
{
x -= this._drawArea.X;
y -= this._drawArea.Y;
int index = x * this._drawArea.Height + y;
if (index < 0 || index >= this._drawCache.Length)
return true;
return this._drawCache[index].IsVisible && !this._drawCache[index].IsSurfaceLiquid;
}
public float GetVisibleLiquid(int x, int y)
{
x -= this._drawArea.X;
y -= this._drawArea.Y;
if (x < 0 || x >= this._drawArea.Width || y < 0 || y >= this._drawArea.Height)
return 0.0f;
int index = (x + 2) * (this._drawArea.Height + 4) + y + 2;
return !this._cache[index].HasVisibleLiquid ? 0.0f : this._cache[index].VisibleLiquidLevel;
}
public void Update(GameTime gameTime)
{
if (Main.gamePaused || !Main.hasFocus)
return;
float num = Main.windSpeedCurrent * 25f;
this._frameState += ((double) num >= 0.0 ? num + 6f : num - 6f) * (float) gameTime.ElapsedGameTime.TotalSeconds;
if ((double) this._frameState < 0.0)
this._frameState += 16f;
this._frameState %= 16f;
this._animationFrame = (int) this._frameState;
}
public void PrepareDraw(Rectangle drawArea) => this.InternalPrepareDraw(drawArea);
public void SetWaveMaskData(ref Texture2D texture)
{
try
{
if (texture == null || texture.Width < this._drawArea.Height || texture.Height < this._drawArea.Width)
{
Console.WriteLine("WaveMaskData texture recreated. {0}x{1}", (object) this._drawArea.Height, (object) this._drawArea.Width);
if (texture != null)
{
try
{
texture.Dispose();
}
catch
{
}
}
texture = new Texture2D(Main.instance.GraphicsDevice, this._drawArea.Height, this._drawArea.Width, false, SurfaceFormat.Color);
}
texture.SetData<Color>(0, new Rectangle?(new Rectangle(0, 0, this._drawArea.Height, this._drawArea.Width)), this._waveMask, 0, this._drawArea.Width * this._drawArea.Height);
}
catch
{
texture = new Texture2D(Main.instance.GraphicsDevice, this._drawArea.Height, this._drawArea.Width, false, SurfaceFormat.Color);
texture.SetData<Color>(0, new Rectangle?(new Rectangle(0, 0, this._drawArea.Height, this._drawArea.Width)), this._waveMask, 0, this._drawArea.Width * this._drawArea.Height);
}
}
public Rectangle GetCachedDrawArea() => this._drawArea;
public void Draw(
SpriteBatch spriteBatch,
Vector2 drawOffset,
int waterStyle,
float alpha,
bool isBackgroundDraw)
{
this.InternalDraw(spriteBatch, drawOffset, waterStyle, alpha, isBackgroundDraw);
}
private struct LiquidCache
{
public float LiquidLevel;
public float VisibleLiquidLevel;
public float Opacity;
public bool IsSolid;
public bool IsHalfBrick;
public bool HasLiquid;
public bool HasVisibleLiquid;
public bool HasWall;
public Point FrameOffset;
public bool HasLeftEdge;
public bool HasRightEdge;
public bool HasTopEdge;
public bool HasBottomEdge;
public float LeftWall;
public float RightWall;
public float BottomWall;
public float TopWall;
public float VisibleLeftWall;
public float VisibleRightWall;
public float VisibleBottomWall;
public float VisibleTopWall;
public byte Type;
public byte VisibleType;
}
private struct LiquidDrawCache
{
public Rectangle SourceRectangle;
public Vector2 LiquidOffset;
public bool IsVisible;
public float Opacity;
public byte Type;
public bool IsSurfaceLiquid;
public bool HasWall;
}
}
}