diff --git a/Subsurface/Source/Events/Missions/CombatMission.cs b/Subsurface/Source/Events/Missions/CombatMission.cs index 768668136..cc2335880 100644 --- a/Subsurface/Source/Events/Missions/CombatMission.cs +++ b/Subsurface/Source/Events/Missions/CombatMission.cs @@ -17,7 +17,7 @@ namespace Barotrauma private string[] descriptions; - private static string[] teamNames; + private static string[] teamNames = { "Team A", "Team B" }; public override bool AllowRespawn { diff --git a/Subsurface/Source/Map/Submarine.cs b/Subsurface/Source/Map/Submarine.cs index eb285b73c..bae0e0c2c 100644 --- a/Subsurface/Source/Map/Submarine.cs +++ b/Subsurface/Source/Map/Submarine.cs @@ -59,6 +59,8 @@ namespace Barotrauma } private static List loaded = new List(); + private static List visibleEntities; + private SubmarineBody subBody; public readonly List DockedTo; @@ -287,37 +289,59 @@ namespace Barotrauma } //drawing ---------------------------------------------------- - - public static void Draw(SpriteBatch spriteBatch, bool editing = false, List visibleSubs = null) + + public static void CullEntities(Camera cam) { - for (int i = 0; i < MapEntity.mapEntityList.Count; i++ ) + List visibleSubs = new List(); + foreach (Submarine sub in Submarine.Loaded) { - if (visibleSubs!=null && MapEntity.mapEntityList[i].Submarine!=null) - { - if (!visibleSubs.Contains(MapEntity.mapEntityList[i].Submarine)) continue; - } + Rectangle worldBorders = new Rectangle( + sub.Borders.X + (int)sub.WorldPosition.X - 500, + sub.Borders.Y + (int)sub.WorldPosition.Y + 500, + sub.Borders.Width + 1000, + sub.Borders.Height + 1000); - MapEntity.mapEntityList[i].Draw(spriteBatch, editing); + + if (Submarine.RectsOverlap(worldBorders, cam.WorldView)) + { + visibleSubs.Add(sub); + } + } + + visibleEntities = new List(); + foreach (MapEntity me in MapEntity.mapEntityList) + { + if (me.Submarine == null || visibleSubs.Contains(me.Submarine)) + { + visibleEntities.Add(me); + } } } - public static void DrawFront(SpriteBatch spriteBatch, bool editing = false, Predicate predicate = null, List visibleSubs = null) + public static void Draw(SpriteBatch spriteBatch, bool editing = false) { - for (int i = 0; i < MapEntity.mapEntityList.Count; i++) - { - if (!MapEntity.mapEntityList[i].DrawOverWater) continue; + var entitiesToRender = !editing && visibleEntities != null ? visibleEntities : MapEntity.mapEntityList; - if (visibleSubs != null && MapEntity.mapEntityList[i].Submarine != null) - { - if (!visibleSubs.Contains(MapEntity.mapEntityList[i].Submarine)) continue; - } + foreach (MapEntity e in entitiesToRender) + { + e.Draw(spriteBatch, editing); + } + } + + public static void DrawFront(SpriteBatch spriteBatch, bool editing = false, Predicate predicate = null) + { + var entitiesToRender = !editing && visibleEntities != null ? visibleEntities : MapEntity.mapEntityList; + + foreach (MapEntity e in entitiesToRender) + { + if (!e.DrawOverWater) continue; if (predicate != null) { - if (!predicate(MapEntity.mapEntityList[i])) continue; + if (!predicate(e)) continue; } - MapEntity.mapEntityList[i].Draw(spriteBatch, editing, false); + e.Draw(spriteBatch, editing, false); } if (GameMain.DebugDraw) @@ -349,18 +373,14 @@ namespace Barotrauma } } - public static void DrawDamageable(SpriteBatch spriteBatch, Effect damageEffect, bool editing = false, List visibleSubs = null) + public static void DrawDamageable(SpriteBatch spriteBatch, Effect damageEffect, bool editing = false) { - for (int i = 0; i < MapEntity.mapEntityList.Count; i++) + var entitiesToRender = !editing && visibleEntities != null ? visibleEntities : MapEntity.mapEntityList; + + foreach (MapEntity e in entitiesToRender) { - if (visibleSubs != null && MapEntity.mapEntityList[i].Submarine != null) - { - if (!visibleSubs.Contains(MapEntity.mapEntityList[i].Submarine)) continue; - } - - - if (MapEntity.mapEntityList[i].DrawDamageEffect) - MapEntity.mapEntityList[i].DrawDamage(spriteBatch, damageEffect); + if (e.DrawDamageEffect) + e.DrawDamage(spriteBatch, damageEffect); } if (damageEffect != null) { @@ -370,23 +390,20 @@ namespace Barotrauma } - public static void DrawBack(SpriteBatch spriteBatch, bool editing = false, Predicate predicate = null, List visibleSubs = null) + public static void DrawBack(SpriteBatch spriteBatch, bool editing = false, Predicate predicate = null) { - for (int i = 0; i < MapEntity.mapEntityList.Count; i++) + var entitiesToRender = !editing && visibleEntities != null ? visibleEntities : MapEntity.mapEntityList; + + foreach (MapEntity e in entitiesToRender) { - if (!MapEntity.mapEntityList[i].DrawBelowWater) continue; - - if (visibleSubs != null && MapEntity.mapEntityList[i].Submarine != null) - { - if (!visibleSubs.Contains(MapEntity.mapEntityList[i].Submarine)) continue; - } + if (!e.DrawBelowWater) continue; if (predicate != null) { - if (!predicate(MapEntity.mapEntityList[i])) continue; + if (!predicate(e)) continue; } - MapEntity.mapEntityList[i].Draw(spriteBatch, editing, true); + e.Draw(spriteBatch, editing, true); } } @@ -1160,6 +1177,8 @@ namespace Barotrauma loaded.Clear(); + visibleEntities = null; + if (GameMain.GameScreen.Cam != null) GameMain.GameScreen.Cam.TargetPos = Vector2.Zero; Entity.RemoveAll(); @@ -1179,6 +1198,8 @@ namespace Barotrauma subBody = null; + visibleEntities = null; + if (MainSub == this) MainSub = null; if (MainSubs[1] == this) MainSubs[1] = null; diff --git a/Subsurface/Source/Screens/GameScreen.cs b/Subsurface/Source/Screens/GameScreen.cs index 548239710..d01389cf1 100644 --- a/Subsurface/Source/Screens/GameScreen.cs +++ b/Subsurface/Source/Screens/GameScreen.cs @@ -114,6 +114,7 @@ namespace Barotrauma closestSub.ApplyForce(targetMovement * closestSub.SubBody.Body.Mass * 100.0f); } #endif + if (GameMain.GameSession != null) GameMain.GameSession.Update((float)deltaTime); if (Level.Loaded != null) Level.Loaded.Update((float)deltaTime); @@ -164,18 +165,17 @@ namespace Barotrauma GameMain.World.Step((float)deltaTime); - if (!PlayerInput.LeftButtonHeld()) { Inventory.draggingSlot = null; Inventory.draggingItem = null; } - } public override void Draw(double deltaTime, GraphicsDevice graphics, SpriteBatch spriteBatch) { cam.UpdateTransform(true); + Submarine.CullEntities(cam); DrawMap(graphics, spriteBatch); @@ -258,7 +258,7 @@ namespace Barotrauma null, null, null, null, cam.Transform); - Submarine.DrawBack(spriteBatch, false, s => s is Structure, visibleSubs); + Submarine.DrawBack(spriteBatch, false, s => s is Structure); spriteBatch.End(); @@ -274,7 +274,7 @@ namespace Barotrauma null, null, null, null, cam.Transform); - Submarine.DrawBack(spriteBatch, false, s => !(s is Structure), visibleSubs); + Submarine.DrawBack(spriteBatch, false, s => !(s is Structure)); foreach (Character c in Character.CharacterList) c.Draw(spriteBatch); @@ -355,8 +355,8 @@ namespace Barotrauma null, null, null, cam.Transform); - Submarine.DrawDamageable(spriteBatch, null, false, visibleSubs); - Submarine.DrawFront(spriteBatch, false, s => s is Structure, visibleSubs); + Submarine.DrawDamageable(spriteBatch, null, false); + Submarine.DrawFront(spriteBatch, false, s => s is Structure); spriteBatch.End(); @@ -389,7 +389,7 @@ namespace Barotrauma null, null, null, cam.Transform); - Submarine.DrawFront(spriteBatch, false, null, visibleSubs); + Submarine.DrawFront(spriteBatch, false, null); spriteBatch.End(); @@ -399,7 +399,7 @@ namespace Barotrauma damageEffect, cam.Transform); - Submarine.DrawDamageable(spriteBatch, damageEffect, false, visibleSubs); + Submarine.DrawDamageable(spriteBatch, damageEffect, false); spriteBatch.End();