From 0ba69a34726f341eb8de44dec51e882cc1afad8d Mon Sep 17 00:00:00 2001 From: Regalis Date: Thu, 22 Sep 2016 18:14:16 +0300 Subject: [PATCH] Using nonpremultiplied alpha when drawing damaged wall sections (-> no artifacts around windows anymore), particle collision optimization --- Subsurface/Source/Map/Structure.cs | 6 +++-- Subsurface/Source/Particles/Particle.cs | 31 ++++++------------------- Subsurface/Source/Screens/GameScreen.cs | 2 +- 3 files changed, 12 insertions(+), 27 deletions(-) diff --git a/Subsurface/Source/Map/Structure.cs b/Subsurface/Source/Map/Structure.cs index 5eddba372..8ea943bbe 100644 --- a/Subsurface/Source/Map/Structure.cs +++ b/Subsurface/Source/Map/Structure.cs @@ -437,7 +437,7 @@ namespace Barotrauma { if (damageEffect != null) { - float newCutoff = Math.Min((s.damage / prefab.MaxHealth), 0.65f); + float newCutoff = Math.Min((s.damage / prefab.MaxHealth), 0.65f); if (Math.Abs(newCutoff - prevCutoff) > 0.01f) { @@ -539,7 +539,9 @@ namespace Barotrauma var section = sections[sectionIndex]; - int particleAmount = (int)(Math.Min(Health - section.damage, damage) * Rand.Range(0.1f, 1.0f)); + int particleAmount = (int)(Math.Min(Health - section.damage, damage) * Rand.Range(0.01f, 1.0f)); + + particleAmount = Math.Min(particleAmount, 200); for (int i = 0; i < particleAmount; i++) { Vector2 particlePos = new Vector2( diff --git a/Subsurface/Source/Particles/Particle.cs b/Subsurface/Source/Particles/Particle.cs index 4d9f87429..de75cadb6 100644 --- a/Subsurface/Source/Particles/Particle.cs +++ b/Subsurface/Source/Particles/Particle.cs @@ -38,9 +38,7 @@ namespace Barotrauma.Particles private Vector2 drawPosition; private float drawRotation; - - //private float checkCollisionTimer; - + private Hull currentHull; private List hullGaps; @@ -75,7 +73,6 @@ namespace Barotrauma.Particles public void Init(ParticlePrefab prefab, Vector2 position, Vector2 speed, float rotation, Hull hullGuess = null) { - this.prefab = prefab; spriteIndex = Rand.Int(prefab.Sprites.Count); @@ -116,8 +113,6 @@ namespace Barotrauma.Particles if (prefab.DeleteOnCollision || prefab.CollidesWithWalls) { hullGaps = currentHull == null ? new List() : currentHull.ConnectedGaps; - //hullLimits = new List(); - //hullLimits = FindLimits(position); } if (prefab.RotateToDirection) @@ -128,18 +123,6 @@ namespace Barotrauma.Particles } } - //private List FindLimits(Vector2 position) - //{ - // List hullList = new List(); - - // currentHull = Hull.FindHull(position); - // if (currentHull == null) return hullList; - - // hullList.Add(currentHull); - - // return FindAdjacentHulls(hullList, currentHull, Math.Abs(velocity.X) > Math.Abs(velocity.Y)); - //} - public bool Update(float deltaTime) { prevPosition = position; @@ -190,12 +173,13 @@ namespace Barotrauma.Particles if (currentHull == null) { - var collidedHull = Hull.FindHullOld(edgePos); + Hull collidedHull = Hull.FindHull(position); if (collidedHull != null) { if (prefab.DeleteOnCollision) return false; OnWallCollisionOutside(collidedHull); - } + } + } else if (!Submarine.RectContains(currentHull.WorldRect, edgePos)) { @@ -216,11 +200,11 @@ namespace Barotrauma.Particles } gapFound = true; + break; } if (!gapFound) { - OnWallCollisionInside(currentHull, edgePos); } else @@ -229,9 +213,8 @@ namespace Barotrauma.Particles hullGaps = currentHull == null ? new List() : currentHull.ConnectedGaps; if (OnChangeHull != null) OnChangeHull(edgePos, currentHull); - } - } - + } + } } lifeTime -= deltaTime; diff --git a/Subsurface/Source/Screens/GameScreen.cs b/Subsurface/Source/Screens/GameScreen.cs index 6fae5ad43..0b040b855 100644 --- a/Subsurface/Source/Screens/GameScreen.cs +++ b/Subsurface/Source/Screens/GameScreen.cs @@ -340,7 +340,7 @@ namespace Barotrauma spriteBatch.End(); spriteBatch.Begin(SpriteSortMode.Immediate, - BlendState.AlphaBlend, SamplerState.LinearWrap, + BlendState.NonPremultiplied, SamplerState.LinearWrap, null, null, damageEffect, cam.Transform);