Files
RobustToolbox/Robust.Client/GameObjects/Components/Input/ClickableComponent.cs
T
Pieter-Jan BriersandGitHub 09c36b57cd Shift half of Clyde around to implement better outline rendering. (#830)
* Attempted Clyde cleanup, didn't get far.

* Add negation operator to Vector2i.

* Add RenderOrder to ISpriteComponent.

* Post process shaders.

Adds "post process" shaders to sprite component.
These are executed on the WHOLE sprite component (every layer)
in one draw.

This is necessary to implement functional outlines.
2019-07-06 19:17:33 +02:00

83 lines
2.5 KiB
C#

using Robust.Client.Graphics.Shaders;
using Robust.Client.Interfaces.GameObjects;
using Robust.Client.Interfaces.GameObjects.Components;
using Robust.Shared.GameObjects;
using Robust.Shared.Input;
using Robust.Shared.Interfaces.GameObjects;
using Robust.Shared.IoC;
using Robust.Shared.Map;
using Robust.Shared.Prototypes;
using Robust.Shared.Serialization;
using Robust.Shared.ViewVariables;
namespace Robust.Client.GameObjects
{
// Notice: Most actual logic for clicking is done by the game screen.
public class ClickableComponent : Component, IClientClickableComponent
{
#pragma warning disable 649
[Dependency] private readonly IPrototypeManager _prototypeManager;
#pragma warning restore 649
private ShaderInstance _selectionShaderInstance;
private string _selectionShader;
public override string Name => "Clickable";
public override uint? NetID => NetIDs.CLICKABLE;
[ViewVariables(VVAccess.ReadWrite)]
public string SelectionShader => _selectionShader;
public override void ExposeData(ObjectSerializer serializer)
{
serializer.DataFieldCached(ref _selectionShader, "selectionshader", "selection_outline");
}
public override void Initialize()
{
base.Initialize();
_selectionShaderInstance = _prototypeManager.Index<ShaderPrototype>(_selectionShader).Instance();
}
public bool CheckClick(GridCoordinates worldPos, out int drawdepth)
{
var component = Owner.GetComponent<IClickTargetComponent>();
if (Owner.TryGetComponent(out ISpriteComponent sprite) && !sprite.Visible)
{
drawdepth = default;
return false;
}
drawdepth = (int)component.DrawDepth;
return true;
}
public void DispatchClick(IEntity user, ClickType clickType)
{
var message = new ClientEntityClickMsg(user.Uid, clickType);
SendMessage(message);
}
public void OnMouseEnter()
{
if (Owner.TryGetComponent(out ISpriteComponent sprite))
{
sprite.PostShader = _selectionShaderInstance;
sprite.RenderOrder = Owner.EntityManager.CurrentTick.Value;
}
}
public void OnMouseLeave()
{
if (Owner.TryGetComponent(out ISpriteComponent sprite))
{
sprite.PostShader = null;
sprite.RenderOrder = 0;
}
}
}
}