From 09588e548db538a7c175805189d050f7ece81654 Mon Sep 17 00:00:00 2001 From: Regalis Date: Fri, 4 Dec 2015 17:21:59 +0200 Subject: [PATCH] Submarine rendering to correct position almost ready, fixed camera position "twitching" --- .../Source/Characters/Animation/Ragdoll.cs | 19 ++++++++++++++---- Subsurface/Source/Characters/Character.cs | 3 +-- Subsurface/Source/Characters/CharacterHUD.cs | 2 +- .../Source/Items/Components/ItemContainer.cs | 3 ++- Subsurface/Source/Items/Item.cs | 10 +++++++++ Subsurface/Source/Map/Submarine.cs | 16 ++++----------- Subsurface/Source/Screens/GameScreen.cs | 5 +++-- Subsurface_Solution.v12.suo | Bin 805376 -> 810496 bytes 8 files changed, 36 insertions(+), 22 deletions(-) diff --git a/Subsurface/Source/Characters/Animation/Ragdoll.cs b/Subsurface/Source/Characters/Animation/Ragdoll.cs index 2bcb357c5..b92ce3d2a 100644 --- a/Subsurface/Source/Characters/Animation/Ragdoll.cs +++ b/Subsurface/Source/Characters/Animation/Ragdoll.cs @@ -536,17 +536,28 @@ namespace Barotrauma } } - public void FindHull() + public void FindHull(bool setSubmarine = true) { Hull newHull = Hull.FindHull( ConvertUnits.ToDisplayUnits(refLimb.SimPosition), currentHull); - + if (newHull == currentHull) return; - CurrentHull = newHull; - + if (setSubmarine) + { + if (newHull == null && currentHull.Submarine != null) + { + SetPosition(refLimb.SimPosition + ConvertUnits.ToSimUnits(currentHull.Submarine.Position)); + } + else if (currentHull == null && newHull != null && newHull.Submarine != null) + { + SetPosition(refLimb.SimPosition - ConvertUnits.ToSimUnits(newHull.Submarine.Position)); + } + } + CurrentHull = newHull; + UpdateCollisionCategories(); } diff --git a/Subsurface/Source/Characters/Character.cs b/Subsurface/Source/Characters/Character.cs index 2126dbb26..6796d5346 100644 --- a/Subsurface/Source/Characters/Character.cs +++ b/Subsurface/Source/Characters/Character.cs @@ -443,7 +443,7 @@ namespace Barotrauma } } - AnimController.FindHull(); + AnimController.FindHull(false); CharacterList.Add(this); @@ -755,7 +755,6 @@ namespace Barotrauma if (moveCam) { - cam.TargetPos = WorldPosition; cam.OffsetAmount = MathHelper.Lerp(cam.OffsetAmount, 250.0f, 0.05f); } diff --git a/Subsurface/Source/Characters/CharacterHUD.cs b/Subsurface/Source/Characters/CharacterHUD.cs index d57d1e94c..63dfb0a46 100644 --- a/Subsurface/Source/Characters/CharacterHUD.cs +++ b/Subsurface/Source/Characters/CharacterHUD.cs @@ -67,7 +67,7 @@ namespace Barotrauma else if (character.SelectedCharacter == null && character.ClosestItem != null && character.SelectedConstruction == null) { - Vector2 startPos = character.Position + (character.ClosestItem.Position - character.Position) * 0.7f; + Vector2 startPos = character.WorldPosition + (character.ClosestItem.WorldPosition - character.WorldPosition) * 0.7f; startPos = cam.WorldToScreen(startPos); Vector2 textPos = startPos; diff --git a/Subsurface/Source/Items/Components/ItemContainer.cs b/Subsurface/Source/Items/Components/ItemContainer.cs index 8021ae386..d2a9c716b 100644 --- a/Subsurface/Source/Items/Components/ItemContainer.cs +++ b/Subsurface/Source/Items/Components/ItemContainer.cs @@ -163,6 +163,7 @@ namespace Barotrauma.Items.Components if (item.body == null) { transformedItemPos = new Vector2(item.Rect.X, item.Rect.Y); + if (item.Submarine != null) transformedItemPos += item.Submarine.Position; transformedItemPos = transformedItemPos + itemPos; } else @@ -179,7 +180,7 @@ namespace Barotrauma.Items.Components transformedItemPos = Vector2.Transform(transformedItemPos, transform); transformedItemInterval = Vector2.Transform(transformedItemInterval, transform); - transformedItemPos += ConvertUnits.ToDisplayUnits(item.body.SimPosition); + transformedItemPos += item.DrawPosition; currentRotation += item.body.Rotation; } diff --git a/Subsurface/Source/Items/Item.cs b/Subsurface/Source/Items/Item.cs index 0d923aaf3..76856230b 100644 --- a/Subsurface/Source/Items/Item.cs +++ b/Subsurface/Source/Items/Item.cs @@ -1257,6 +1257,16 @@ namespace Barotrauma } } + + public override void OnMapLoaded() + { + FindHull(); + + foreach (ItemComponent ic in components) + { + ic.OnMapLoaded(); + } + } public void NewComponentEvent(ItemComponent ic, bool isClient, bool isImportant) diff --git a/Subsurface/Source/Map/Submarine.cs b/Subsurface/Source/Map/Submarine.cs index fe80f64d8..6c0d41534 100644 --- a/Subsurface/Source/Map/Submarine.cs +++ b/Subsurface/Source/Map/Submarine.cs @@ -384,9 +384,8 @@ namespace Barotrauma if (subBody != null) subBody.ApplyForce(force); } - public void SetPrevTransform(Vector2 position, Camera cam = null) + public void SetPrevTransform(Vector2 position) { - if (cam != null) cam.Position += prevPosition - position; prevPosition = position; } @@ -646,23 +645,16 @@ namespace Barotrauma subBody = new SubmarineBody(this); - MapEntity.MapLoaded(); - - foreach (Item item in Item.ItemList) - { - foreach (ItemComponent ic in item.components) - { - ic.OnMapLoaded(); - } - } + loaded = this; + MapEntity.MapLoaded(); + WayPoint.GenerateSubWaypoints(); GameMain.LightManager.OnMapLoaded(); ID = ushort.MaxValue-10; - loaded = this; } public static Submarine Load(string fileName) diff --git a/Subsurface/Source/Screens/GameScreen.cs b/Subsurface/Source/Screens/GameScreen.cs index fb76a9f4e..75f9f334e 100644 --- a/Subsurface/Source/Screens/GameScreen.cs +++ b/Subsurface/Source/Screens/GameScreen.cs @@ -101,14 +101,15 @@ namespace Barotrauma while (Physics.accumulator >= Physics.step) { cam.MoveCamera((float)Physics.step); + if (Character.Controlled != null) cam.TargetPos = Character.Controlled.WorldPosition; - if (Submarine.Loaded != null) Submarine.Loaded.SetPrevTransform(Submarine.Loaded.Position, cam); + if (Submarine.Loaded != null) Submarine.Loaded.SetPrevTransform(Submarine.Loaded.Position); foreach (PhysicsBody pb in PhysicsBody.list) { pb.SetPrevTransform(pb.SimPosition, pb.Rotation); } - + MapEntity.UpdateAll(cam, (float)Physics.step); Character.UpdateAnimAll((float)Physics.step); diff --git a/Subsurface_Solution.v12.suo b/Subsurface_Solution.v12.suo index ffd5b832a25c2379f3b2b82eb4781af785a93154..aa21a3b5c1cbf1de53a6be1e892a25ac8ce8f3b8 100644 GIT binary patch delta 11713 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 WrgAmjR>Q29@IBcSYwh>ed;SO9RIOJ4 delta 11034 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