From 6127bb473d9c13e47a05e0937b84eccb95fba7e8 Mon Sep 17 00:00:00 2001
From: Joonas Rikkonen
Date: Sun, 17 Dec 2017 21:47:03 +0200
Subject: [PATCH] - Moved character nametag visibility culling to the update
method (doesn't make sense for the update rate to be tied to rendering
framerate). - Name tags on characters that are outside the camera view are
automatically hidden to avoid the costly visibility checks. - If the
controlled character or the target has no head, the visibility check is done
based on the position of the torso. - Fixed sub->outside visibility checks. -
Fixed invalid attributes in the flashlight config.
---
.../Source/Characters/Character.cs | 113 +++++++-----------
.../Content/Items/Tools/tools.xml | 2 +-
.../Source/Characters/Character.cs | 4 +
3 files changed, 49 insertions(+), 70 deletions(-)
diff --git a/Barotrauma/BarotraumaClient/Source/Characters/Character.cs b/Barotrauma/BarotraumaClient/Source/Characters/Character.cs
index da4bf9838..bd5705ffb 100644
--- a/Barotrauma/BarotraumaClient/Source/Characters/Character.cs
+++ b/Barotrauma/BarotraumaClient/Source/Characters/Character.cs
@@ -204,6 +204,48 @@ namespace Barotrauma
if (Lights.LightManager.ViewTarget == this) Lights.LightManager.ViewTarget = null;
}
+ partial void UpdateProjSpecific(float deltaTime, Camera cam)
+ {
+ nameTimer -= deltaTime;
+ if (nameTimer <= 0.0f)
+ {
+ if (controlled == null)
+ {
+ nameVisible = true;
+ }
+ //if the character is not in the camera view, the name can't be visible and we can avoid the expensive visibility checks
+ else if (WorldPosition.X < cam.WorldView.X || WorldPosition.X > cam.WorldView.Right ||
+ WorldPosition.Y > cam.WorldView.Y || WorldPosition.Y < cam.WorldView.Y - cam.WorldView.Height)
+ {
+ nameVisible = false;
+ }
+ else
+ {
+ //Ideally it shouldn't send the character entirely if we can't see them but /shrug, this isn't the most hacker-proof game atm
+ Limb selfLimb = controlled.AnimController.GetLimb(LimbType.Head);
+ if (selfLimb == null) selfLimb = controlled.AnimController.GetLimb(LimbType.Torso);
+
+ Limb targHead = AnimController.GetLimb(LimbType.Head);
+ if (targHead == null) targHead = AnimController.GetLimb(LimbType.Torso);
+
+ if (selfLimb != null && targHead != null)
+ {
+ Vector2 diff = ConvertUnits.ToSimUnits(targHead.WorldPosition - selfLimb.WorldPosition);
+
+ Body closestBody = Submarine.CheckVisibility(selfLimb.SimPosition, selfLimb.SimPosition + diff);
+ Structure wall = null;
+ if (closestBody != null) wall = closestBody.UserData as Structure;
+ nameVisible = closestBody == null || wall == null || !wall.CastShadow;
+ }
+ else
+ {
+ nameVisible = false;
+ }
+ }
+ nameTimer = Rand.Range(0.5f, 1.0f);
+ }
+ }
+
public static void AddAllToGUIUpdateList()
{
for (int i = 0; i < CharacterList.Count; i++)
@@ -242,48 +284,7 @@ namespace Barotrauma
if (aiTarget != null) aiTarget.Draw(spriteBatch);
}
-
- /*if (memPos != null && memPos.Count > 0 && controlled == this)
- {
- PosInfo serverPos = memPos.Last();
- Vector2 remoteVec = ConvertUnits.ToDisplayUnits(serverPos.Position);
- if (Submarine != null)
- {
- remoteVec += Submarine.DrawPosition;
- }
- remoteVec.Y = -remoteVec.Y;
-
- PosInfo localPos = memLocalPos.Find(m => m.ID == serverPos.ID);
- int mpind = memLocalPos.FindIndex(lp => lp.ID == localPos.ID);
- PosInfo localPos1 = mpind > 0 ? memLocalPos[mpind - 1] : null;
- PosInfo localPos2 = mpind < memLocalPos.Count-1 ? memLocalPos[mpind + 1] : null;
-
- Vector2 localVec = ConvertUnits.ToDisplayUnits(localPos.Position);
- Vector2 localVec1 = localPos1 != null ? ConvertUnits.ToDisplayUnits(((PosInfo)localPos1).Position) : Vector2.Zero;
- Vector2 localVec2 = localPos2 != null ? ConvertUnits.ToDisplayUnits(((PosInfo)localPos2).Position) : Vector2.Zero;
- if (Submarine != null)
- {
- localVec += Submarine.DrawPosition;
- localVec1 += Submarine.DrawPosition;
- localVec2 += Submarine.DrawPosition;
- }
- localVec.Y = -localVec.Y;
- localVec1.Y = -localVec1.Y;
- localVec2.Y = -localVec2.Y;
-
- //GUI.DrawLine(spriteBatch, remoteVec, localVec, Color.Yellow, 0, 10);
- if (localPos1 != null) GUI.DrawLine(spriteBatch, remoteVec, localVec1, Color.Lime, 0, 2);
- if (localPos2 != null) GUI.DrawLine(spriteBatch, remoteVec + Vector2.One, localVec2 + Vector2.One, Color.Red, 0, 2);
- }
-
- Vector2 mouseDrawPos = CursorWorldPosition;
- mouseDrawPos.Y = -mouseDrawPos.Y;
- GUI.DrawLine(spriteBatch, mouseDrawPos - new Vector2(0, 5), mouseDrawPos + new Vector2(0, 5), Color.Red, 0, 10);
-
- Vector2 closestItemPos = closestItem != null ? closestItem.DrawPosition : Vector2.Zero;
- closestItemPos.Y = -closestItemPos.Y;
- GUI.DrawLine(spriteBatch, closestItemPos - new Vector2(0, 5), closestItemPos + new Vector2(0, 5), Color.Lime, 0, 10);*/
-
+
if (this == controlled || GUI.DisableHUD) return;
Vector2 pos = DrawPosition;
@@ -298,33 +299,7 @@ namespace Barotrauma
if (this == controlled) return;
- nameTimer -= (float)Timing.Step;
- if (nameTimer <= 0.0f)
- {
- //Ideally it shouldn't send the character entirely if we can't see them but /shrug, this isn't the most hacker-proof game atm
- Limb selfHead = controlled != null ? controlled.AnimController.GetLimb(LimbType.Head) : null;
- Limb targHead = this.AnimController.GetLimb(LimbType.Head);
-
- if (controlled != null && controlled.Submarine == Submarine)
- {
- if (selfHead != null && targHead != null)
- {
- Body closestBody = Submarine.CheckVisibility(selfHead.SimPosition, targHead.SimPosition);
- Structure wall = null;
- if (closestBody != null)
- wall = closestBody.UserData as Structure;
- nameVisible = closestBody == null || wall == null || !wall.CastShadow;
- }
- else
- nameVisible = false;
- }
- else
- nameVisible = true; //Ideally it should check for visibility from outside the sub/from sub-to-sub, but this will work for now.
- nameTimer = Rand.Range(0.5f, 2f);
- }
-
- if (!nameVisible)
- return;
+ if (!nameVisible) return;
if (info != null)
{
diff --git a/Barotrauma/BarotraumaShared/Content/Items/Tools/tools.xml b/Barotrauma/BarotraumaShared/Content/Items/Tools/tools.xml
index 417336892..1c05f3b14 100644
--- a/Barotrauma/BarotraumaShared/Content/Items/Tools/tools.xml
+++ b/Barotrauma/BarotraumaShared/Content/Items/Tools/tools.xml
@@ -247,7 +247,7 @@
-
+
diff --git a/Barotrauma/BarotraumaShared/Source/Characters/Character.cs b/Barotrauma/BarotraumaShared/Source/Characters/Character.cs
index 5477b49ae..dc04384ba 100644
--- a/Barotrauma/BarotraumaShared/Source/Characters/Character.cs
+++ b/Barotrauma/BarotraumaShared/Source/Characters/Character.cs
@@ -1400,6 +1400,8 @@ namespace Barotrauma
public virtual void Update(float deltaTime, Camera cam)
{
+ UpdateProjSpecific(deltaTime, cam);
+
if (GameMain.Client != null && this == Controlled && !isSynced) return;
if (!Enabled) return;
@@ -1542,6 +1544,8 @@ namespace Barotrauma
partial void UpdateControlled(float deltaTime, Camera cam);
+ partial void UpdateProjSpecific(float deltaTime, Camera cam);
+
private void UpdateOxygen(float deltaTime)
{
float prevOxygen = oxygen;