From 2ff8643c02a1842025bc4c284bf3365c06a9453c Mon Sep 17 00:00:00 2001 From: Regalis11 Date: Mon, 21 Dec 2015 11:01:35 +0200 Subject: [PATCH] Optimization: FindHull spatial hashing, itemcomponent sounds in a dictionary, got rid of Item.Updated, rendering fixes, disposing shadow vertex buffers --- .vs/Subsurface_Solution/v14/.suo | Bin 727040 -> 748544 bytes .../Collision/Shapes/ChainShape.cs | 7 +- Subsurface/Barotrauma.csproj | 1 + .../Source/Items/Components/ItemComponent.cs | 20 ++- .../Items/Components/Power/PowerTransfer.cs | 63 +++++----- Subsurface/Source/Items/Inventory.cs | 2 +- Subsurface/Source/Items/Item.cs | 12 +- Subsurface/Source/Map/EntityGrid.cs | 115 ++++++++++++++++++ Subsurface/Source/Map/Hull.cs | 39 +++++- Subsurface/Source/Map/Levels/Level.cs | 7 +- Subsurface/Source/Map/Levels/LevelRenderer.cs | 65 ++++++---- Subsurface/Source/Map/Levels/WrappingWall.cs | 26 +++- Subsurface/Source/Map/Lights/ConvexHull.cs | 82 +++++++------ Subsurface/Source/Map/Lights/LightSource.cs | 7 +- Subsurface/Source/Map/MapEntity.cs | 7 +- Subsurface/Source/Screens/GameScreen.cs | 37 +++++- 16 files changed, 354 insertions(+), 136 deletions(-) create mode 100644 Subsurface/Source/Map/EntityGrid.cs diff --git a/.vs/Subsurface_Solution/v14/.suo b/.vs/Subsurface_Solution/v14/.suo index 7133c7cba51cb55b7dc220870378eaad9a35f425..1f2cb3603db87abefe501f52f1c284fc286b193f 100644 GIT binary patch delta 18892 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 diff --git a/Farseer Physics Engine 3.5/Collision/Shapes/ChainShape.cs b/Farseer Physics Engine 3.5/Collision/Shapes/ChainShape.cs index cd41b43ff..46750381b 100644 --- a/Farseer Physics Engine 3.5/Collision/Shapes/ChainShape.cs +++ b/Farseer Physics Engine 3.5/Collision/Shapes/ChainShape.cs @@ -78,12 +78,7 @@ namespace FarseerPhysics.Collision.Shapes Vector2 v2 = vertices[i]; // If the code crashes here, it means your vertices are too close together. - - if (Vector2.DistanceSquared(v1, v2) < Settings.LinearSlop * Settings.LinearSlop) - { - int asldmfk = 1; - } - + Debug.Assert(Vector2.DistanceSquared(v1, v2) > Settings.LinearSlop * Settings.LinearSlop); } diff --git a/Subsurface/Barotrauma.csproj b/Subsurface/Barotrauma.csproj index 20f9cf499..6e0167f44 100644 --- a/Subsurface/Barotrauma.csproj +++ b/Subsurface/Barotrauma.csproj @@ -114,6 +114,7 @@ + diff --git a/Subsurface/Source/Items/Components/ItemComponent.cs b/Subsurface/Source/Items/Components/ItemComponent.cs index 90658eb4a..4d16074e7 100644 --- a/Subsurface/Source/Items/Components/ItemComponent.cs +++ b/Subsurface/Source/Items/Components/ItemComponent.cs @@ -61,7 +61,7 @@ namespace Barotrauma.Items.Components public List requiredSkills; - private List sounds; + private Dictionary> sounds; private GUIFrame guiFrame; @@ -175,7 +175,7 @@ namespace Barotrauma.Items.Components requiredSkills = new List(); - sounds = new List(); + sounds = new Dictionary>(); statusEffects = new List(); @@ -283,7 +283,15 @@ namespace Barotrauma.Items.Components ItemSound itemSound = new ItemSound(sound, type, range, loop); itemSound.VolumeProperty = ToolBox.GetAttributeString(subElement, "volume", ""); itemSound.VolumeMultiplier = ToolBox.GetAttributeFloat(subElement, "volumemultiplier", 1.0f); - sounds.Add(itemSound); + + List soundList = null; + if (!sounds.TryGetValue(itemSound.Type, out soundList)) + { + soundList = new List(); + sounds.Add(itemSound.Type, soundList); + } + + soundList.Add(itemSound); break; default: ItemComponent ic = ItemComponent.Load(subElement, item, item.ConfigFile, false); @@ -306,9 +314,9 @@ namespace Barotrauma.Items.Components loopingSoundIndex = loopingSound.Sound.Loop(loopingSoundIndex, GetSoundVolume(loopingSound), position, loopingSound.Range); return; } - - List matchingSounds = sounds.FindAll(x => x.Type == type); - if (matchingSounds.Count == 0) return; + + List matchingSounds = null; + if (!sounds.TryGetValue(type, out matchingSounds)) return; ItemSound itemSound = null; if (!Sounds.SoundManager.IsPlaying(loopingSoundIndex)) diff --git a/Subsurface/Source/Items/Components/Power/PowerTransfer.cs b/Subsurface/Source/Items/Components/Power/PowerTransfer.cs index c011bb4c6..6e9db3461 100644 --- a/Subsurface/Source/Items/Components/Power/PowerTransfer.cs +++ b/Subsurface/Source/Items/Components/Power/PowerTransfer.cs @@ -12,6 +12,10 @@ namespace Barotrauma.Items.Components static float fullPower; static float fullLoad; + //private bool updated; + + private int updateTimer; + const float FireProbability = 0.15f; //affects how fast changes in power/load are carried over the grid @@ -40,9 +44,14 @@ namespace Barotrauma.Items.Components fullLoad = 0.0f; connectedList.Clear(); - if (updated) return; + if (updateTimer > 0) + { + updateTimer--; + return; + } CheckJunctions(deltaTime); + updateTimer = 0; foreach (Powered p in connectedList) { @@ -54,51 +63,43 @@ namespace Barotrauma.Items.Components pt.Item.SendSignal("", "power", fullPower / Math.Max(fullLoad, 1.0f)); //damage the item if voltage is too high - if (-pt.currPowerConsumption > Math.Max(pt.powerLoad * 2.0f, 200.0f)) + if (-pt.currPowerConsumption < Math.Max(pt.powerLoad * 2.0f, 200.0f)) continue; + + float prevCondition = pt.item.Condition; + pt.item.Condition -= deltaTime * 10.0f; + + if (pt.item.Condition <= 0.0f && prevCondition > 0.0f) { + sparkSounds[Rand.Int(sparkSounds.Length)].Play(1.0f, 600.0f, pt.item.WorldPosition); - float prevCondition = pt.item.Condition; - pt.item.Condition -= deltaTime * 10.0f; - - if (pt.item.Condition<=0.0f && prevCondition > 0.0f) + Vector2 baseVel = Rand.Vector(300.0f); + for (int i = 0; i < 10; i++) { - sparkSounds[Rand.Int(sparkSounds.Length)].Play(1.0f, 600.0f, pt.item.WorldPosition); + var particle = GameMain.ParticleManager.CreateParticle("spark", pt.item.WorldPosition, + baseVel + Rand.Vector(100.0f), 0.0f, item.CurrentHull); - Vector2 baseVel = Rand.Vector(300.0f); - for (int i = 0; i < 10; i++) - { - var particle = GameMain.ParticleManager.CreateParticle("spark", pt.item.WorldPosition, - baseVel + Rand.Vector(100.0f), 0.0f, item.CurrentHull); + if (particle != null) particle.Size *= Rand.Range(0.5f, 1.0f); + } - if (particle != null) particle.Size *= Rand.Range(0.5f, 1.0f); - } - - if (FireProbability > 0.0f && Rand.Int((int)(1.0f / FireProbability)) == 1) - { - new FireSource(pt.item.WorldPosition); - } + if (FireProbability > 0.0f && Rand.Int((int)(1.0f / FireProbability)) == 1) + { + new FireSource(pt.item.WorldPosition); } } - + } - - } public override bool Pick(Character picker) { - if (picker == null) return false; - - //picker.SelectedConstruction = (picker.SelectedConstruction == item) ? null : item; - - return true; + return picker != null; } //a recursive function that goes through all the junctions and adds up //all the generated/consumed power of the constructions connected to the grid private void CheckJunctions(float deltaTime) { - updated = true; + updateTimer = 1; connectedList.Add(this); ApplyStatusEffects(ActionType.OnActive, deltaTime, null); @@ -119,11 +120,12 @@ namespace Barotrauma.Items.Components //if (it.Updated) continue; Powered powered = it.GetComponent(); - if (powered == null || powered.Updated) continue; + if (powered == null) continue; PowerTransfer powerTransfer = powered as PowerTransfer; if (powerTransfer != null) { + if (powerTransfer.updateTimer>0) continue; powerTransfer.CheckJunctions(deltaTime); } else @@ -143,9 +145,8 @@ namespace Barotrauma.Items.Components } } } - } - + public override void DrawHUD(SpriteBatch spriteBatch, Character character) { int x = GuiFrame.Rect.X; diff --git a/Subsurface/Source/Items/Inventory.cs b/Subsurface/Source/Items/Inventory.cs index d492816ec..40e1a6f8a 100644 --- a/Subsurface/Source/Items/Inventory.cs +++ b/Subsurface/Source/Items/Inventory.cs @@ -284,7 +284,7 @@ namespace Barotrauma #if DEBUG System.Diagnostics.Debug.Assert(slotIndex >= 0 && slotIndex < Items.Length); #else - if (slotIndex<0 || slotIndex>=items.Length) return; + if (slotIndex<0 || slotIndex>=Items.Length) return; #endif Rectangle containerRect = new Rectangle(rect.X - 5, rect.Y - (40 + 10) * itemCapacity - 5, diff --git a/Subsurface/Source/Items/Item.cs b/Subsurface/Source/Items/Item.cs index 571049dd7..3dc2cb2c3 100644 --- a/Subsurface/Source/Items/Item.cs +++ b/Subsurface/Source/Items/Item.cs @@ -111,7 +111,7 @@ namespace Barotrauma get { return condition; } set { - if (float.IsNaN(value)) return; + if (!MathUtils.IsValid(value)) return; float prev = condition; condition = MathHelper.Clamp(value, 0.0f, 100.0f); @@ -166,15 +166,7 @@ namespace Barotrauma return IsInWater(); } } - - public bool Updated - { - set - { - foreach (ItemComponent ic in components) ic.Updated = value; - } - } - + public ItemPrefab Prefab { get { return prefab; } diff --git a/Subsurface/Source/Map/EntityGrid.cs b/Subsurface/Source/Map/EntityGrid.cs new file mode 100644 index 000000000..0f433902a --- /dev/null +++ b/Subsurface/Source/Map/EntityGrid.cs @@ -0,0 +1,115 @@ +using Microsoft.Xna.Framework; +using System; +using System.Collections.Generic; + +namespace Barotrauma +{ + class EntityGrid + { + private List[,] entities; + + private Rectangle limits; + + private float cellSize; + + public EntityGrid(Rectangle limits, float cellSize) + { + this.limits = limits; + this.cellSize = cellSize; + + entities = new List[(int)Math.Ceiling(limits.Width / cellSize),(int)Math.Ceiling(limits.Height / cellSize)]; + for (int x = 0; x(); + } + } + } + + public void InsertEntity(MapEntity entity) + { + Rectangle rect = entity.Rect; + //if (Submarine.Loaded != null) rect.Offset(-Submarine.HiddenSubPosition); + Rectangle indices = GetIndices(rect); + if (indices.X<0 || indices.Width>=entities.GetLength(0) || + indices.Y<0 || indices.Height>=entities.GetLength(1)) + { + DebugConsole.ThrowError("Error in EntityGrid.InsertEntity: "+entity+" is outside the grid"); + return; + } + + for (int x=indices.X; x<=indices.Width; x++) + { + for (int y = indices.Y; y<=indices.Height; y++) + { + entities[x, y].Add(entity); + } + } + } + + public void RemoveEntity(MapEntity entity) + { + Rectangle indices = GetIndices(entity.Rect); + if (indices.X < 0 || indices.Width >= entities.GetLength(0) || + indices.Y < 0 || indices.Height >= entities.GetLength(1)) + { + DebugConsole.ThrowError("Error in EntityGrid.RemoveEntity: " + entity + " is outside the grid"); + return; + } + + for (int x = indices.X; x <= indices.Width; x++) + { + for (int y = indices.Y; y <= indices.Height; y++) + { + entities[x, y].Remove(entity); + } + } + } + + public void Clear() + { + for (int x = 0; x < entities.GetLength(0); x++) + { + for (int y = 0; y < entities.GetLength(1); y++) + { + entities[x, y].Clear(); + } + } + } + + public List GetEntities(Vector2 position) + { + if (Submarine.Loaded != null) position -= Submarine.HiddenSubPosition; + + if (position.X < limits.X || position.Y > limits.Y || + position.X > limits.Right || position.Y < limits.Y - limits.Height) + { + return new List(); + } + + Point indices = GetIndices(position); + + return entities[indices.X, indices.Y]; + } + + public Rectangle GetIndices(Rectangle rect) + { + Rectangle indices = Rectangle.Empty; + indices.X = (int)Math.Floor((rect.X - limits.X) / cellSize); + indices.Y = (int)Math.Floor((limits.Y - rect.Y)/cellSize); + + indices.Width = (int)Math.Floor((rect.Right - limits.X) / cellSize); + indices.Height = (int)Math.Floor((limits.Y - (rect.Y-rect.Height)) / cellSize); + + return indices; + } + + public Point GetIndices(Vector2 position) + { + return new Point( + (int)Math.Floor((position.X - limits.X) / cellSize), + (int)Math.Floor((limits.Y - position.Y) / cellSize)); + } + } +} diff --git a/Subsurface/Source/Map/Hull.cs b/Subsurface/Source/Map/Hull.cs index ef7ce7eb7..af0969fc0 100644 --- a/Subsurface/Source/Map/Hull.cs +++ b/Subsurface/Source/Map/Hull.cs @@ -14,6 +14,7 @@ namespace Barotrauma class Hull : MapEntity { public static List hullList = new List(); + private static EntityGrid entityGrid; public static bool EditWater, EditFire; @@ -165,9 +166,21 @@ namespace Barotrauma Volume = 0.0f; + InsertToList(); } + public override void OnMapLoaded() + { + + if (entityGrid == null) + { + entityGrid = new EntityGrid(Submarine.Borders, 200.0f); + } + + entityGrid.InsertEntity(this); + } + public override bool Contains(Vector2 position) { return (Submarine.RectContains(WorldRect, position) && @@ -210,6 +223,8 @@ namespace Barotrauma //renderer.Dispose(); + entityGrid.RemoveEntity(this); + hullList.Remove(this); } @@ -481,10 +496,30 @@ namespace Barotrauma //returns the water block which contains the point (or null if it isn't inside any) public static Hull FindHull(Vector2 position, Hull guess = null, bool useWorldCoordinates = true) { - return FindHull(position, hullList, guess, useWorldCoordinates); + if (entityGrid == null) return null; + + if (guess != null) + { + if (Submarine.RectContains(useWorldCoordinates ? guess.WorldRect : guess.rect, position)) return guess; + } + + var entities = entityGrid.GetEntities(useWorldCoordinates ? position-Submarine.Loaded.Position : position); + + foreach (Hull hull in entities) + { + if (Submarine.RectContains(useWorldCoordinates ? hull.WorldRect : hull.rect, position)) return hull; + } + + return null; } - public static Hull FindHull(Vector2 position, List hulls, Hull guess = null, bool useWorldCoordinates = true) + //returns the water block which contains the point (or null if it isn't inside any) + public static Hull FindHullOld(Vector2 position, Hull guess = null, bool useWorldCoordinates = true) + { + return FindHullOld(position, hullList, guess, useWorldCoordinates); + } + + public static Hull FindHullOld(Vector2 position, List hulls, Hull guess = null, bool useWorldCoordinates = true) { if (guess != null && hulls.Contains(guess)) { diff --git a/Subsurface/Source/Map/Levels/Level.cs b/Subsurface/Source/Map/Levels/Level.cs index dface1f80..632c7257f 100644 --- a/Subsurface/Source/Map/Levels/Level.cs +++ b/Subsurface/Source/Map/Levels/Level.cs @@ -314,8 +314,8 @@ namespace Barotrauma wrappingWalls[side, i] = new WrappingWall(pathCells, cells, borders.Height * 0.5f, (side == 0 ? -1 : 1) * (i == 0 ? 1 : 2)); - wrappingWalls[side, i].BodyVertices = GeneratePolygons(wrappingWalls[side, i].Cells, new List(), false); - wrappingWalls[side, i].WallVertices = GenerateWallShapes(wrappingWalls[side, i].Cells); + wrappingWalls[side, i].SetBodyVertices(GeneratePolygons(wrappingWalls[side, i].Cells, new List(), false)); + wrappingWalls[side, i].SetWallVertices(GenerateWallShapes(wrappingWalls[side, i].Cells)); //wrappingWalls[side, i].Cells[0].edges[1].isSolid = false; //wrappingWalls[side, i].Cells[0].edges[3].isSolid = false; @@ -1091,10 +1091,11 @@ namespace Barotrauma private void Unload() { + renderer.Dispose(); renderer = null; cells = null; - + bodies.Clear(); bodies = null; diff --git a/Subsurface/Source/Map/Levels/LevelRenderer.cs b/Subsurface/Source/Map/Levels/LevelRenderer.cs index c50a12918..d58ecafa9 100644 --- a/Subsurface/Source/Map/Levels/LevelRenderer.cs +++ b/Subsurface/Source/Map/Levels/LevelRenderer.cs @@ -8,7 +8,7 @@ using System.Text; namespace Barotrauma { - class LevelRenderer + class LevelRenderer : IDisposable { private static BasicEffect basicEffect; @@ -182,16 +182,18 @@ namespace Barotrauma graphicsDevice.DrawPrimitives(PrimitiveType.TriangleList, 0, (int)Math.Floor(bodyVertices.VertexCount / 3.0f)); - //for (int side = 0; side < 2; side++) - //{ - // for (int i = 0; i < 2; i++) - // { - // graphicsDevice.DrawUserPrimitives( - // PrimitiveType.TriangleList, level.WrappingWalls[side, i].BodyVertices, 0, - // (int)Math.Floor(level.WrappingWalls[side, i].BodyVertices.Length / 3.0f)); + for (int side = 0; side < 2; side++) + { + for (int i = 0; i < 2; i++) + { + graphicsDevice.SetVertexBuffer(level.WrappingWalls[side, i].BodyVertices); - // } - //} + graphicsDevice.DrawPrimitives( + PrimitiveType.TriangleList, 0, + (int)Math.Floor(level.WrappingWalls[side, i].BodyVertices.VertexCount / 3.0f)); + + } + } graphicsDevice.SetVertexBuffer(wallVertices); @@ -201,25 +203,42 @@ namespace Barotrauma basicEffect.CurrentTechnique.Passes[0].Apply(); graphicsDevice.DrawPrimitives(PrimitiveType.TriangleList, 0, (int)Math.Floor(wallVertices.VertexCount / 3.0f)); - //for (int side = 0; side < 2; side++) - //{ - // for (int i = 0; i < 2; i++) - // { - // basicEffect.VertexColorEnabled = false; - // basicEffect.TextureEnabled = true; - // basicEffect.CurrentTechnique = basicEffect.Techniques["BasicEffect_Texture"]; - // basicEffect.CurrentTechnique.Passes[0].Apply(); - // graphicsDevice.DrawUserPrimitives( - // PrimitiveType.TriangleList, level.WrappingWalls[side, i].WallVertices, 0, - // (int)Math.Floor(level.WrappingWalls[side, i].WallVertices.Length / 3.0f)); + basicEffect.VertexColorEnabled = false; + basicEffect.TextureEnabled = true; + basicEffect.CurrentTechnique = basicEffect.Techniques["BasicEffect_Texture"]; + basicEffect.CurrentTechnique.Passes[0].Apply(); - // } - //} + for (int side = 0; side < 2; side++) + { + for (int i = 0; i < 2; i++) + { + + graphicsDevice.SetVertexBuffer(level.WrappingWalls[side, i].WallVertices); + + graphicsDevice.DrawPrimitives( + PrimitiveType.TriangleList, 0, + (int)Math.Floor(level.WrappingWalls[side, i].WallVertices.VertexCount / 3.0f)); + + } + } sw.Stop(); Debug.WriteLine("level render: "+sw.ElapsedTicks); } + public void Dispose() + { + Dispose(true); + + GC.SuppressFinalize(this); + } + + protected virtual void Dispose(bool disposing) + { + wallVertices.Dispose(); + bodyVertices.Dispose(); + } + } } diff --git a/Subsurface/Source/Map/Levels/WrappingWall.cs b/Subsurface/Source/Map/Levels/WrappingWall.cs index 5a8db2df9..e4e2fa020 100644 --- a/Subsurface/Source/Map/Levels/WrappingWall.cs +++ b/Subsurface/Source/Map/Levels/WrappingWall.cs @@ -15,9 +15,7 @@ namespace Barotrauma public const float WallWidth = 20000.0f; - public VertexPositionTexture[] WallVertices; - - public VertexPositionColor[] BodyVertices; + private VertexBuffer wallVertices, bodyVertices; private Vector2 midPos; private int slot; @@ -26,6 +24,16 @@ namespace Barotrauma private List cells; + public VertexBuffer WallVertices + { + get { return wallVertices; } + } + + public VertexBuffer BodyVertices + { + get { return bodyVertices; } + } + public Vector2 Offset { get { return offset; } @@ -116,6 +124,18 @@ namespace Barotrauma } } + public void SetWallVertices(VertexPositionTexture[] vertices) + { + wallVertices = new VertexBuffer(GameMain.CurrGraphicsDevice, VertexPositionTexture.VertexDeclaration, vertices.Length, BufferUsage.WriteOnly); + wallVertices.SetData(vertices); + } + + public void SetBodyVertices(VertexPositionColor[] vertices) + { + bodyVertices = new VertexBuffer(GameMain.CurrGraphicsDevice, VertexPositionColor.VertexDeclaration, vertices.Length, BufferUsage.WriteOnly); + bodyVertices.SetData(vertices); + } + public static void UpdateWallShift(Vector2 pos, WrappingWall[,] walls) { diff --git a/Subsurface/Source/Map/Lights/ConvexHull.cs b/Subsurface/Source/Map/Lights/ConvexHull.cs index 79c02e66d..f009f7f9d 100644 --- a/Subsurface/Source/Map/Lights/ConvexHull.cs +++ b/Subsurface/Source/Map/Lights/ConvexHull.cs @@ -1,16 +1,19 @@ using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Graphics; +using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; namespace Barotrauma.Lights { - class CachedShadow + class CachedShadow : IDisposable { - public VertexPositionColor[] ShadowVertices; - public VertexPositionTexture[] PenumbraVertices; + //public VertexPositionColor[] ShadowVertices; + //public VertexPositionTexture[] PenumbraVertices; + + public VertexBuffer ShadowBuffer; public Vector2 LightPos; @@ -18,14 +21,29 @@ namespace Barotrauma.Lights public CachedShadow(VertexPositionColor[] shadowVertices, VertexPositionTexture[] penumbraVertices, Vector2 lightPos, int shadowVertexCount, int penumbraVertexCount) { - ShadowVertices = shadowVertices; - PenumbraVertices = penumbraVertices; + //var ShadowVertices = new VertexPositionColor [shadowVertices.Count()]; + //shadowVertices.CopyTo(ShadowVertices, 0); + + ShadowBuffer = new VertexBuffer(GameMain.CurrGraphicsDevice, VertexPositionColor.VertexDeclaration, 6*2, BufferUsage.None); + ShadowBuffer.SetData(shadowVertices, 0, shadowVertices.Length); ShadowVertexCount = shadowVertexCount; PenumbraVertexCount = penumbraVertexCount; LightPos = lightPos; } + + public void Dispose() + { + Dispose(true); + + GC.SuppressFinalize(this); + } + + protected virtual void Dispose(bool disposing) + { + ShadowBuffer.Dispose(); + } } class ConvexHull @@ -43,9 +61,7 @@ namespace Barotrauma.Lights private VertexPositionColor[] shadowVertices; private VertexPositionTexture[] penumbraVertices; - - private VertexBuffer shadowBuffer, penumbraBuffer; - + int shadowVertexCount; private Entity parentEntity; @@ -85,9 +101,6 @@ namespace Barotrauma.Lights shadowVertices = new VertexPositionColor[6 * 2]; penumbraVertices = new VertexPositionTexture[6]; - - shadowBuffer = new VertexBuffer(GameMain.CurrGraphicsDevice, VertexPositionColor.VertexDeclaration, 6*2, BufferUsage.WriteOnly); - vertices = points; primitiveCount = vertices.Length; @@ -100,7 +113,7 @@ namespace Barotrauma.Lights list.Add(this); } - + private void CalculateDimensions() { Vector2 center = Vector2.Zero; @@ -225,10 +238,6 @@ namespace Barotrauma.Lights { CalculatePenumbraVertices(startingIndex, endingIndex, lightSourcePos, los); } - else - { - shadowBuffer.SetData(shadowVertices); - } } private void CalculatePenumbraVertices(int startingIndex, int endingIndex, Vector2 lightSourcePos, bool los) @@ -283,21 +292,9 @@ namespace Barotrauma.Lights (light.Position == cachedShadow.LightPos || Vector2.DistanceSquared(light.Position, cachedShadow.LightPos) < 1.0f)) { //{ - shadowVertices = cachedShadow.ShadowVertices; - penumbraVertices = cachedShadow.PenumbraVertices; - + graphicsDevice.SetVertexBuffer(cachedShadow.ShadowBuffer); shadowVertexCount = cachedShadow.ShadowVertexCount; - - //} - //else - - //CalculateShadowVertices(light.Position, los); - //cachedShadow.LightPos = light.Position; - //cachedShadow.ShadowVertices = shadowVertices; - //cachedShadow.PenumbraVertices = penumbraVertices; - - } else { @@ -309,7 +306,11 @@ namespace Barotrauma.Lights CalculateShadowVertices(lightPos, los); - if (cachedShadows.ContainsKey(light)) cachedShadows.Remove(light); + if (cachedShadow != null) + { + cachedShadow.Dispose(); + cachedShadows.Remove(light); + } cachedShadow = new CachedShadow(shadowVertices, penumbraVertices, light.Position, shadowVertexCount, 0); cachedShadows.Add(light, cachedShadow); } @@ -339,20 +340,17 @@ namespace Barotrauma.Lights } if (shadowVertexCount>0) - { + { + shadowEffect.World = Matrix.CreateTranslation(offset) * transform; - - - shadowEffect.World = Matrix.CreateTranslation(offset) * transform; - shadowEffect.CurrentTechnique.Passes[0].Apply(); - - if (los || true) + if (los) { + shadowEffect.CurrentTechnique.Passes[0].Apply(); graphicsDevice.DrawUserPrimitives(PrimitiveType.TriangleStrip, shadowVertices, 0, shadowVertexCount * 2 - 2); } else - { - graphicsDevice.SetVertexBuffer(shadowBuffer); + { + shadowEffect.CurrentTechnique.Passes[0].Apply(); graphicsDevice.DrawPrimitives(PrimitiveType.TriangleStrip, 0, shadowVertexCount); } @@ -373,6 +371,12 @@ namespace Barotrauma.Lights public void Remove() { + foreach (KeyValuePair cachedShadow in cachedShadows) + { + cachedShadow.Value.Dispose(); + } + cachedShadows.Clear(); + list.Remove(this); } diff --git a/Subsurface/Source/Map/Lights/LightSource.cs b/Subsurface/Source/Map/Lights/LightSource.cs index b3818648f..5bf53393c 100644 --- a/Subsurface/Source/Map/Lights/LightSource.cs +++ b/Subsurface/Source/Map/Lights/LightSource.cs @@ -63,10 +63,11 @@ namespace Barotrauma.Lights get { return range; } set { - float newRange = MathHelper.Clamp(value, 0.0f, 2048.0f); - if (range == newRange) return; - range = newRange; + float prevRange = range; + range = MathHelper.Clamp(value, 0.0f, 2048.0f); + if (Math.Abs(prevRange - range)<5.0f) return; + UpdateHullsInRange(); } } diff --git a/Subsurface/Source/Map/MapEntity.cs b/Subsurface/Source/Map/MapEntity.cs index eada87ff6..a8ef403dd 100644 --- a/Subsurface/Source/Map/MapEntity.cs +++ b/Subsurface/Source/Map/MapEntity.cs @@ -16,7 +16,7 @@ namespace Barotrauma //which entities have been selected for editing protected static List selectedList = new List(); - + protected static GUIComponent editingHUD; protected static Vector2 selectionPos = Vector2.Zero; @@ -206,11 +206,6 @@ namespace Barotrauma /// public static void UpdateAll(Camera cam, float deltaTime) { - foreach (Item item in Item.ItemList) - { - item.Updated = false; - } - foreach (Hull hull in Hull.hullList) { hull.Update(cam, deltaTime); diff --git a/Subsurface/Source/Screens/GameScreen.cs b/Subsurface/Source/Screens/GameScreen.cs index c1b7e4855..1c1bb5bb2 100644 --- a/Subsurface/Source/Screens/GameScreen.cs +++ b/Subsurface/Source/Screens/GameScreen.cs @@ -51,9 +51,7 @@ namespace Barotrauma Sounds.SoundManager.LowPassHFGain = 1.0f; } - - int rendc; - + /// /// Allows the game to run logic such as updating the world, /// checking for collisions, gathering input, and playing audio. @@ -61,6 +59,39 @@ namespace Barotrauma /// Provides a snapshot of timing values. public override void Update(double deltaTime) { + //if (PlayerInput.KeyHit(Keys.T)) + //{ + // Stopwatch sw = new Stopwatch(); + // sw.Start(); + + // Rand.SetSyncedSeed(123); + + // for (int i = 0; i<10000; i++) + // { + // Hull.FindHull(new Vector2( + // Rand.Range(Submarine.Borders.X, Submarine.Borders.Right, false), + // Rand.Range(Submarine.Borders.Y - Submarine.Borders.Height, Submarine.Borders.Y, false)), + // Hull.hullList[Rand.Int(Hull.hullList.Count-1)], false); + // } + + // sw.Stop(); + // Debug.WriteLine("FindHull1: "+sw.ElapsedMilliseconds); + // sw.Restart(); + // Rand.SetSyncedSeed(123); + // for (int i = 0; i < 10000; i++) + // { + // Hull.FindHull2(new Vector2( + // Rand.Range(Submarine.Borders.X, Submarine.Borders.Right, false), + // Rand.Range(Submarine.Borders.Y - Submarine.Borders.Height, Submarine.Borders.Y, false)), + // Hull.hullList[Rand.Int(Hull.hullList.Count - 1)], false); + // } + + // sw.Stop(); + // Debug.WriteLine("FindHull2: " + sw.ElapsedMilliseconds); + // var askdnkjd = 1; + //} + + //the accumulator code is based on this article: //http://gafferongames.com/game-physics/fix-your-timestep/ Physics.accumulator += deltaTime;