Source code for mini_arcade_core.engine.render.passes.ui
"""
UI render pass implementation.
"""
from __future__ import annotations
from dataclasses import dataclass
from mini_arcade_core.backend import Backend
from mini_arcade_core.engine.render.context import RenderContext
from mini_arcade_core.engine.render.frame_packet import FramePacket
from mini_arcade_core.engine.render.packet import DrawOp, RenderPacket
[docs]
@dataclass
class UIPass:
"""
UI Render Pass.
This pass handles rendering of UI overlays.
"""
name: str = "UIPass"
[docs]
def run(
self, backend: Backend, ctx: RenderContext, packets: list[FramePacket]
):
"""Run the UI render pass."""
# UI overlays should be screen-space (no world transform / no clip).
backend.clear_viewport_transform()
backend.render.clear_clip_rect()
for fp in packets:
if fp.is_overlay:
ops = tuple(fp.packet.ops)
else:
layer_ops = self._layer_ops(fp.packet, "ui")
if layer_ops is None:
continue
ops = layer_ops
if not ops:
continue
ctx.stats.packets += 1
ctx.stats.renderables += len(ops)
ctx.stats.draw_groups += 1
for op in ops:
op(backend)
@staticmethod
def _layer_ops(
packet: RenderPacket, key: str
) -> tuple[DrawOp, ...] | None:
raw = packet.meta.get("pass_ops")
if not isinstance(raw, dict):
return None
ops = raw.get(key)
if ops is None:
return tuple()
return tuple(ops)