Engine UI FrameUpdate compat, Speech bubble first frame fix (#8472)

* Compat fix for engine UI FrameUpdate order change.

Engine is getting FrameUpdate changed to run BEFORE style & layout. This is needed to avoid exploding.

* Fix speech bubble layout on first frame.
This commit is contained in:
Pieter-Jan Briers
2022-05-27 05:34:25 +02:00
committed by GitHub
parent d19f83fced
commit c5982e0b10
3 changed files with 8 additions and 12 deletions

View File

@@ -525,7 +525,7 @@ namespace Content.Client.Chat.Managers
// Push up existing bubbles above the mob's head. // Push up existing bubbles above the mob's head.
foreach (var existingBubble in existing) foreach (var existingBubble in existing)
{ {
existingBubble.VerticalOffset += bubble.ContentHeight; existingBubble.VerticalOffset += bubble.ContentSize.Y;
} }
} }
else else

View File

@@ -46,7 +46,7 @@ namespace Content.Client.Chat.UI
public float VerticalOffset { get; set; } public float VerticalOffset { get; set; }
private float _verticalOffsetAchieved; private float _verticalOffsetAchieved;
public float ContentHeight { get; private set; } public Vector2 ContentSize { get; private set; }
public static SpeechBubble CreateSpeechBubble(SpeechType type, string text, EntityUid senderEntity, IEyeManager eyeManager, IChatManager chatManager, IEntityManager entityManager) public static SpeechBubble CreateSpeechBubble(SpeechType type, string text, EntityUid senderEntity, IEyeManager eyeManager, IChatManager chatManager, IEntityManager entityManager)
{ {
@@ -83,8 +83,8 @@ namespace Content.Client.Chat.UI
ForceRunStyleUpdate(); ForceRunStyleUpdate();
bubble.Measure(Vector2.Infinity); bubble.Measure(Vector2.Infinity);
ContentHeight = bubble.DesiredSize.Y; ContentSize = bubble.DesiredSize;
_verticalOffsetAchieved = -ContentHeight; _verticalOffsetAchieved = -ContentSize.Y;
} }
protected abstract Control BuildBubble(string text, string speechStyleClass); protected abstract Control BuildBubble(string text, string speechStyleClass);
@@ -133,12 +133,12 @@ namespace Content.Client.Chat.UI
var offset = new Vector2(0, EntityVerticalOffset * EyeManager.PixelsPerMeter * scale); var offset = new Vector2(0, EntityVerticalOffset * EyeManager.PixelsPerMeter * scale);
var lowerCenter = (_eyeManager.WorldToScreen(worldPos) - offset) / UIScale; var lowerCenter = (_eyeManager.WorldToScreen(worldPos) - offset) / UIScale;
var screenPos = lowerCenter - (Width / 2, ContentHeight + _verticalOffsetAchieved); var screenPos = lowerCenter - (ContentSize.X / 2, ContentSize.Y + _verticalOffsetAchieved);
// Round to nearest 0.5 // Round to nearest 0.5
screenPos = (screenPos * 2).Rounded() / 2; screenPos = (screenPos * 2).Rounded() / 2;
LayoutContainer.SetPosition(this, screenPos); LayoutContainer.SetPosition(this, screenPos);
var height = MathF.Ceiling(MathHelper.Clamp(lowerCenter.Y - screenPos.Y, 0, ContentHeight)); var height = MathF.Ceiling(MathHelper.Clamp(lowerCenter.Y - screenPos.Y, 0, ContentSize.Y));
SetHeight = height; SetHeight = height;
} }

View File

@@ -129,14 +129,10 @@ namespace Content.Client.Viewport
_inputManager.ViewportKeyEvent(this, args); _inputManager.ViewportKeyEvent(this, args);
} }
protected override void FrameUpdate(FrameEventArgs args)
{
EnsureViewportCreated();
}
protected override void Draw(DrawingHandleScreen handle) protected override void Draw(DrawingHandleScreen handle)
{ {
EnsureViewportCreated();
DebugTools.AssertNotNull(_viewport); DebugTools.AssertNotNull(_viewport);
_viewport!.Render(); _viewport!.Render();