using System.Numerics;
namespace AcDream.App.UI;
/// Leaf widget for dat Type 0xD (UIElement_Viewport). Blits the texture produced by its
/// IUiViewportRenderer (run in the pre-UI hook) as a single sprite at its own rect. The 3-D render
/// does NOT happen here (OnDraw only has a 2-D context).
public sealed class UiViewport : UiElement
{
public override bool ConsumesDatChildren => true;
/// Optional click action (e.g. the paperdoll doll = "target self"
/// during item target-use). Non-null makes the viewport handle the press
/// itself instead of it being captured as a window move.
public System.Action? Clicked { get; set; }
public override bool HandlesClick => Clicked is not null;
public override bool OnEvent(in UiEvent e)
{
if (Clicked is null) return base.OnEvent(e);
switch (e.Type)
{
case UiEventType.MouseDown: return true; // consume the press; act on Click
case UiEventType.Click: Clicked.Invoke(); return true;
}
return base.OnEvent(e);
}
/// Renderer that produces the off-screen texture. Set by GameWindow wiring (later task).
public IUiViewportRenderer? Renderer { get; set; }
/// Last GL color-texture handle produced by the pre-UI hook. 0 = nothing to blit.
public uint TextureHandle { get; set; }
protected override void OnDraw(UiRenderContext ctx)
{
if (!Visible || TextureHandle == 0) return;
// Local origin is already at this widget's Left/Top (PushTransform applied by DrawSelfAndChildren).
// V is FLIPPED (v0=1, v1=0): TextureHandle is an off-screen FBO color texture, whose origin is
// bottom-left (GL), while the UI sprite convention is top-left. Without the flip the doll renders
// upside-down. (If the doll appears upside-down at the visual gate, this is the line to revisit.)
ctx.DrawSprite(TextureHandle, 0f, 0f, Width, Height, 0f, 1f, 1f, 0f, Vector4.One);
}
}