Build 1.1.4.0
This commit is contained in:
@@ -114,7 +114,11 @@ namespace Barotrauma
|
||||
|
||||
graphics.Clear(BackgroundColor);
|
||||
|
||||
renderer?.DrawBackground(spriteBatch, cam, LevelObjectManager, backgroundCreatureManager);
|
||||
if (renderer != null)
|
||||
{
|
||||
GameMain.LightManager.AmbientLight = GameMain.LightManager.AmbientLight.Add(renderer.FlashColor);
|
||||
renderer?.DrawBackground(spriteBatch, cam, LevelObjectManager, backgroundCreatureManager);
|
||||
}
|
||||
}
|
||||
|
||||
public void DrawFront(SpriteBatch spriteBatch, Camera cam)
|
||||
|
||||
@@ -22,7 +22,7 @@ namespace Barotrauma
|
||||
|
||||
public float CurrentRotation;
|
||||
|
||||
private List<SpriteDeformation> spriteDeformations = new List<SpriteDeformation>();
|
||||
private readonly List<SpriteDeformation> spriteDeformations = new List<SpriteDeformation>();
|
||||
|
||||
public Vector2 CurrentScale
|
||||
{
|
||||
@@ -86,6 +86,8 @@ namespace Barotrauma
|
||||
private set;
|
||||
}
|
||||
|
||||
public bool CanBeVisible { get; private set; }
|
||||
|
||||
partial void InitProjSpecific()
|
||||
{
|
||||
Sprite?.EnsureLazyLoaded();
|
||||
@@ -156,6 +158,11 @@ namespace Barotrauma
|
||||
{
|
||||
SonarRadius = Triggers.Select(t => t.ColliderRadius * 1.5f).Max();
|
||||
}
|
||||
|
||||
CanBeVisible =
|
||||
Sprite != null ||
|
||||
Prefab.DeformableSprite != null ||
|
||||
Prefab.OverrideProperties.Any(p => p != null && (p.Sprites.Any() || p.DeformableSprite != null));
|
||||
}
|
||||
|
||||
public void Update(float deltaTime)
|
||||
|
||||
+64
-43
@@ -56,63 +56,84 @@ namespace Barotrauma
|
||||
|
||||
float minSizeToDraw = MathHelper.Lerp(10.0f, 5.0f, Math.Min(zoom * 20.0f, 1.0f));
|
||||
|
||||
//start from the grid cell at the center of the view
|
||||
//(if objects needs to be culled, better to cull at the edges of the view)
|
||||
int midIndexX = (currentIndices.X + currentIndices.Width) / 2;
|
||||
int midIndexY = (currentIndices.Y + currentIndices.Height) / 2;
|
||||
CheckIndex(midIndexX, midIndexY);
|
||||
|
||||
for (int x = currentIndices.X; x <= currentIndices.Width; x++)
|
||||
{
|
||||
for (int y = currentIndices.Y; y <= currentIndices.Height; y++)
|
||||
{
|
||||
if (objectGrid[x, y] == null) { continue; }
|
||||
foreach (LevelObject obj in objectGrid[x, y])
|
||||
if (x != midIndexX || y != midIndexY) { CheckIndex(x, y); }
|
||||
}
|
||||
}
|
||||
|
||||
void CheckIndex(int x, int y)
|
||||
{
|
||||
if (objectGrid[x, y] == null) { return; }
|
||||
foreach (LevelObject obj in objectGrid[x, y])
|
||||
{
|
||||
if (!obj.CanBeVisible) { continue; }
|
||||
if (obj.Prefab.HideWhenBroken && obj.Health <= 0.0f) { continue; }
|
||||
|
||||
if (zoom < 0.05f)
|
||||
{
|
||||
if (obj.Prefab.HideWhenBroken && obj.Health <= 0.0f) { continue; }
|
||||
|
||||
if (zoom < 0.05f)
|
||||
//hide if the sprite is very small when zoomed this far out
|
||||
if ((obj.Sprite != null && Math.Min(obj.Sprite.size.X * zoom, obj.Sprite.size.Y * zoom) < 5.0f) ||
|
||||
(obj.ActivePrefab?.DeformableSprite != null && Math.Min(obj.ActivePrefab.DeformableSprite.Sprite.size.X * zoom, obj.ActivePrefab.DeformableSprite.Sprite.size.Y * zoom) < minSizeToDraw))
|
||||
{
|
||||
//hide if the sprite is very small when zoomed this far out
|
||||
if ((obj.Sprite != null && Math.Min(obj.Sprite.size.X * zoom, obj.Sprite.size.Y * zoom) < 5.0f) ||
|
||||
(obj.ActivePrefab?.DeformableSprite != null && Math.Min(obj.ActivePrefab.DeformableSprite.Sprite.size.X * zoom, obj.ActivePrefab.DeformableSprite.Sprite.size.Y * zoom) < minSizeToDraw))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
float zCutoff = MathHelper.Lerp(5000.0f, 500.0f, (0.05f - zoom) * 20.0f);
|
||||
if (obj.Position.Z > zCutoff)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
var objectList =
|
||||
obj.Position.Z >= 0 ?
|
||||
visibleObjectsBack :
|
||||
(obj.Position.Z < -1 ? visibleObjectsFront : visibleObjectsMid);
|
||||
int drawOrderIndex = 0;
|
||||
for (int i = 0; i < objectList.Count; i++)
|
||||
float zCutoff = MathHelper.Lerp(5000.0f, 500.0f, (0.05f - zoom) * 20.0f);
|
||||
if (obj.Position.Z > zCutoff)
|
||||
{
|
||||
if (objectList[i] == obj)
|
||||
{
|
||||
drawOrderIndex = -1;
|
||||
break;
|
||||
}
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
if (objectList[i].Position.Z < obj.Position.Z)
|
||||
{
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
drawOrderIndex = i + 1;
|
||||
}
|
||||
var objectList =
|
||||
obj.Position.Z >= 0 ?
|
||||
visibleObjectsBack :
|
||||
(obj.Position.Z < -1 ? visibleObjectsFront : visibleObjectsMid);
|
||||
if (objectList.Count >= MaxVisibleObjects) { continue; }
|
||||
|
||||
int drawOrderIndex = 0;
|
||||
for (int i = 0; i < objectList.Count; i++)
|
||||
{
|
||||
if (objectList[i] == obj)
|
||||
{
|
||||
drawOrderIndex = -1;
|
||||
break;
|
||||
}
|
||||
|
||||
if (drawOrderIndex >= 0)
|
||||
if (objectList[i].Position.Z > obj.Position.Z)
|
||||
{
|
||||
objectList.Insert(drawOrderIndex, obj);
|
||||
if (objectList.Count >= MaxVisibleObjects) { break; }
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
drawOrderIndex = i + 1;
|
||||
if (drawOrderIndex >= MaxVisibleObjects) { break; }
|
||||
}
|
||||
}
|
||||
|
||||
if (drawOrderIndex >= 0 && drawOrderIndex < MaxVisibleObjects)
|
||||
{
|
||||
objectList.Insert(drawOrderIndex, obj);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//object grid is sorted in an ascending order
|
||||
//(so we prefer the objects in the foreground instead of ones in the background if some need to be culled)
|
||||
//rendering needs to be done in a descending order though to get the background objects to be drawn first -> reverse the lists
|
||||
visibleObjectsBack.Reverse();
|
||||
visibleObjectsMid.Reverse();
|
||||
visibleObjectsFront.Reverse();
|
||||
|
||||
currentGridIndices = currentIndices;
|
||||
}
|
||||
|
||||
@@ -144,14 +165,14 @@ namespace Barotrauma
|
||||
{
|
||||
Rectangle indices = Rectangle.Empty;
|
||||
indices.X = (int)Math.Floor(cam.WorldView.X / (float)GridSize);
|
||||
if (indices.X >= objectGrid.GetLength(0)) return;
|
||||
if (indices.X >= objectGrid.GetLength(0)) { return; }
|
||||
indices.Y = (int)Math.Floor((cam.WorldView.Y - cam.WorldView.Height - Level.Loaded.BottomPos) / (float)GridSize);
|
||||
if (indices.Y >= objectGrid.GetLength(1)) return;
|
||||
if (indices.Y >= objectGrid.GetLength(1)) { return; }
|
||||
|
||||
indices.Width = (int)Math.Floor(cam.WorldView.Right / (float)GridSize) + 1;
|
||||
if (indices.Width < 0) return;
|
||||
if (indices.Width < 0) { return; }
|
||||
indices.Height = (int)Math.Floor((cam.WorldView.Y - Level.Loaded.BottomPos) / (float)GridSize) + 1;
|
||||
if (indices.Height < 0) return;
|
||||
if (indices.Height < 0) { return; }
|
||||
|
||||
indices.X = Math.Max(indices.X, 0);
|
||||
indices.Y = Math.Max(indices.Y, 0);
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
using FarseerPhysics;
|
||||
using Barotrauma.Extensions;
|
||||
using Microsoft.Xna.Framework;
|
||||
using Microsoft.Xna.Framework.Graphics;
|
||||
using System;
|
||||
@@ -71,9 +71,12 @@ namespace Barotrauma
|
||||
{
|
||||
private static BasicEffect wallEdgeEffect, wallCenterEffect;
|
||||
|
||||
private Vector2 dustOffset;
|
||||
private Vector2 defaultDustVelocity;
|
||||
private Vector2 dustVelocity;
|
||||
private Vector2 waterParticleOffset;
|
||||
private Vector2 waterParticleVelocity;
|
||||
|
||||
private float flashCooldown;
|
||||
private float flashTimer;
|
||||
public Color FlashColor { get; private set; }
|
||||
|
||||
private readonly RasterizerState cullNone;
|
||||
|
||||
@@ -81,10 +84,26 @@ namespace Barotrauma
|
||||
|
||||
private readonly List<LevelWallVertexBuffer> vertexBuffers = new List<LevelWallVertexBuffer>();
|
||||
|
||||
private float chromaticAberrationStrength;
|
||||
public float ChromaticAberrationStrength
|
||||
{
|
||||
get { return chromaticAberrationStrength; }
|
||||
set { chromaticAberrationStrength = MathHelper.Clamp(value, 0.0f, 100.0f); }
|
||||
}
|
||||
public float CollapseEffectStrength
|
||||
{
|
||||
get;
|
||||
set;
|
||||
}
|
||||
public Vector2 CollapseEffectOrigin
|
||||
{
|
||||
get;
|
||||
set;
|
||||
}
|
||||
|
||||
|
||||
public LevelRenderer(Level level)
|
||||
{
|
||||
defaultDustVelocity = Vector2.UnitY * 10.0f;
|
||||
|
||||
cullNone = new RasterizerState() { CullMode = CullMode.None };
|
||||
|
||||
if (wallEdgeEffect == null)
|
||||
@@ -120,12 +139,50 @@ namespace Barotrauma
|
||||
level.GenerationParams.WallSprite.ReloadTexture();
|
||||
wallCenterEffect.Texture = level.GenerationParams.WallSprite.Texture;
|
||||
}
|
||||
|
||||
public void Flash()
|
||||
{
|
||||
flashTimer = 1.0f;
|
||||
}
|
||||
|
||||
public void Update(float deltaTime, Camera cam)
|
||||
{
|
||||
if (CollapseEffectStrength > 0.0f)
|
||||
{
|
||||
CollapseEffectStrength = Math.Max(0.0f, CollapseEffectStrength - deltaTime);
|
||||
}
|
||||
if (ChromaticAberrationStrength > 0.0f)
|
||||
{
|
||||
ChromaticAberrationStrength = Math.Max(0.0f, ChromaticAberrationStrength - deltaTime * 10.0f);
|
||||
}
|
||||
|
||||
if (level.GenerationParams.FlashInterval.Y > 0)
|
||||
{
|
||||
flashCooldown -= deltaTime;
|
||||
if (flashCooldown <= 0.0f)
|
||||
{
|
||||
flashTimer = 1.0f;
|
||||
if (level.GenerationParams.FlashSound != null)
|
||||
{
|
||||
level.GenerationParams.FlashSound.Play(1.0f, "default");
|
||||
}
|
||||
flashCooldown = Rand.Range(level.GenerationParams.FlashInterval.X, level.GenerationParams.FlashInterval.Y, Rand.RandSync.Unsynced);
|
||||
}
|
||||
if (flashTimer > 0.0f)
|
||||
{
|
||||
float brightness = flashTimer * 1.1f - PerlinNoise.GetPerlin((float)Timing.TotalTime, (float)Timing.TotalTime * 0.66f) * 0.1f;
|
||||
FlashColor = level.GenerationParams.FlashColor.Multiply(MathHelper.Clamp(brightness, 0.0f, 1.0f));
|
||||
flashTimer -= deltaTime * 0.5f;
|
||||
}
|
||||
else
|
||||
{
|
||||
FlashColor = Color.TransparentBlack;
|
||||
}
|
||||
}
|
||||
|
||||
//calculate the sum of the forces of nearby level triggers
|
||||
//and use it to move the dust texture and water distortion effect
|
||||
Vector2 currentDustVel = defaultDustVelocity;
|
||||
//and use it to move the water texture and water distortion effect
|
||||
Vector2 currentWaterParticleVel = level.GenerationParams.WaterParticleVelocity;
|
||||
foreach (LevelObject levelObject in level.LevelObjectManager.GetVisibleObjects())
|
||||
{
|
||||
if (levelObject.Triggers == null) { continue; }
|
||||
@@ -139,21 +196,21 @@ namespace Barotrauma
|
||||
objectMaxFlow = vel;
|
||||
}
|
||||
}
|
||||
currentDustVel += objectMaxFlow;
|
||||
currentWaterParticleVel += objectMaxFlow;
|
||||
}
|
||||
|
||||
waterParticleVelocity = Vector2.Lerp(waterParticleVelocity, currentWaterParticleVel, deltaTime);
|
||||
|
||||
dustVelocity = Vector2.Lerp(dustVelocity, currentDustVel, deltaTime);
|
||||
|
||||
WaterRenderer.Instance?.ScrollWater(dustVelocity, deltaTime);
|
||||
WaterRenderer.Instance?.ScrollWater(waterParticleVelocity, deltaTime);
|
||||
|
||||
if (level.GenerationParams.WaterParticles != null)
|
||||
{
|
||||
Vector2 waterTextureSize = level.GenerationParams.WaterParticles.size * level.GenerationParams.WaterParticleScale;
|
||||
dustOffset += new Vector2(dustVelocity.X, -dustVelocity.Y) * level.GenerationParams.WaterParticleScale * deltaTime;
|
||||
while (dustOffset.X <= -waterTextureSize.X) dustOffset.X += waterTextureSize.X;
|
||||
while (dustOffset.X >= waterTextureSize.X) dustOffset.X -= waterTextureSize.X;
|
||||
while (dustOffset.Y <= -waterTextureSize.Y) dustOffset.Y += waterTextureSize.Y;
|
||||
while (dustOffset.Y >= waterTextureSize.Y) dustOffset.Y -= waterTextureSize.Y;
|
||||
waterParticleOffset += new Vector2(waterParticleVelocity.X, -waterParticleVelocity.Y) * level.GenerationParams.WaterParticleScale * deltaTime;
|
||||
while (waterParticleOffset.X <= -waterTextureSize.X) { waterParticleOffset.X += waterTextureSize.X; }
|
||||
while (waterParticleOffset.X >= waterTextureSize.X){ waterParticleOffset.X -= waterTextureSize.X; }
|
||||
while (waterParticleOffset.Y <= -waterTextureSize.Y) { waterParticleOffset.Y += waterTextureSize.Y; }
|
||||
while (waterParticleOffset.Y >= waterTextureSize.Y) { waterParticleOffset.Y -= waterTextureSize.Y; }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -234,7 +291,7 @@ namespace Barotrauma
|
||||
|
||||
Rectangle srcRect = new Rectangle(0, 0, 2048, 2048);
|
||||
Vector2 origin = new Vector2(cam.WorldView.X, -cam.WorldView.Y);
|
||||
Vector2 offset = -origin + dustOffset;
|
||||
Vector2 offset = -origin + waterParticleOffset;
|
||||
while (offset.X <= -srcRect.Width * textureScale) offset.X += srcRect.Width * textureScale;
|
||||
while (offset.X > 0.0f) offset.X -= srcRect.Width * textureScale;
|
||||
while (offset.Y <= -srcRect.Height * textureScale) offset.Y += srcRect.Height * textureScale;
|
||||
@@ -261,7 +318,7 @@ namespace Barotrauma
|
||||
level.GenerationParams.WaterParticles.DrawTiled(
|
||||
spriteBatch, origin + offsetS,
|
||||
new Vector2(cam.WorldView.Width - offsetS.X, cam.WorldView.Height - offsetS.Y),
|
||||
color: Color.White * alpha, textureScale: new Vector2(texScale));
|
||||
color: level.GenerationParams.WaterParticleColor * alpha, textureScale: new Vector2(texScale));
|
||||
}
|
||||
}
|
||||
spriteBatch.End();
|
||||
|
||||
Reference in New Issue
Block a user