Viewport improvements (#3765)

This commit is contained in:
Pieter-Jan Briers
2021-04-19 09:52:40 +02:00
committed by GitHub
parent 8e2fc49357
commit 147a54c642
40 changed files with 1173 additions and 418 deletions

View File

@@ -11,28 +11,23 @@ namespace Content.Client.GameObjects.Components
{
[Dependency] private readonly IPrototypeManager _prototypeManager = default!;
private const float DefaultWidth = 1;
private const string ShaderInRange = "SelectionOutlineInrange";
private const string ShaderOutOfRange = "SelectionOutline";
public override string Name => "InteractionOutline";
private ShaderInstance? _selectionShaderInstance;
private ShaderInstance? _selectionShaderInRangeInstance;
private bool _inRange;
private ShaderInstance? _shader;
private int _lastRenderScale;
/// <inheritdoc />
public override void Initialize()
{
base.Initialize();
_selectionShaderInRangeInstance = _prototypeManager.Index<ShaderPrototype>(ShaderInRange).Instance();
_selectionShaderInstance = _prototypeManager.Index<ShaderPrototype>(ShaderOutOfRange).Instance();
}
public void OnMouseEnter(bool inInteractionRange)
public void OnMouseEnter(bool inInteractionRange, int renderScale)
{
_lastRenderScale = renderScale;
_inRange = inInteractionRange;
if (Owner.TryGetComponent(out ISpriteComponent? sprite))
{
sprite.PostShader = inInteractionRange ? _selectionShaderInRangeInstance : _selectionShaderInstance;
sprite.PostShader = MakeNewShader(inInteractionRange, renderScale);
sprite.RenderOrder = Owner.EntityManager.CurrentTick.Value;
}
}
@@ -44,14 +39,30 @@ namespace Content.Client.GameObjects.Components
sprite.PostShader = null;
sprite.RenderOrder = 0;
}
_shader?.Dispose();
_shader = null;
}
public void UpdateInRange(bool inInteractionRange)
public void UpdateInRange(bool inInteractionRange, int renderScale)
{
if (Owner.TryGetComponent(out ISpriteComponent? sprite))
if (Owner.TryGetComponent(out ISpriteComponent? sprite)
&& (inInteractionRange != _inRange || _lastRenderScale != renderScale))
{
sprite.PostShader = inInteractionRange ? _selectionShaderInRangeInstance : _selectionShaderInstance;
_inRange = inInteractionRange;
_lastRenderScale = renderScale;
_shader = MakeNewShader(_inRange, _lastRenderScale);
sprite.PostShader = _shader;
}
}
private ShaderInstance MakeNewShader(bool inRange, int renderScale)
{
var shaderName = inRange ? ShaderInRange : ShaderOutOfRange;
var instance = _prototypeManager.Index<ShaderPrototype>(shaderName).InstanceUnique();
instance.SetParameter("outline_width", DefaultWidth * renderScale);
return instance;
}
}
}

View File

@@ -35,17 +35,7 @@ namespace Content.Client.GameObjects.Components.Suspicion
_font = new VectorFont(resourceCache.GetResource<FontResource>("/Fonts/NotoSans/NotoSans-Regular.ttf"), 10);
}
protected override void Draw(DrawingHandleBase handle, OverlaySpace currentSpace)
{
switch (currentSpace)
{
case OverlaySpace.ScreenSpace:
DrawScreen((DrawingHandleScreen) handle);
break;
}
}
private void DrawScreen(DrawingHandleScreen screen)
protected override void Draw(in OverlayDrawArgs args)
{
var viewport = _eyeManager.GetWorldViewport();
@@ -91,8 +81,8 @@ namespace Content.Client.GameObjects.Components.Suspicion
continue;
}
var screenCoordinates = _eyeManager.WorldToScreen(physics.GetWorldAABB().TopLeft + (0, 0.5f));
DrawString(screen, _font, screenCoordinates, _traitorText, Color.OrangeRed);
var screenCoordinates = args.ViewportControl!.WorldToScreen(physics.GetWorldAABB().TopLeft + (0, 0.5f));
DrawString(args.ScreenHandle, _font, screenCoordinates, _traitorText, Color.OrangeRed);
}
}