Source code for mini_arcade_core.engine.render.packet

"""
Render packet module.
Defines the RenderPacket class and related types."""

from __future__ import annotations

from dataclasses import dataclass, field
from typing import Callable, Iterable, Protocol, runtime_checkable

from mini_arcade_core.backend import Backend

DrawOp = Callable[[Backend], None]


[docs] @dataclass(frozen=True) class RenderPacket: """ Minimal render packet for v1. It is intentionally backend-agnostic: each op is a callable that knows how to draw itself using the Backend instance. Later you can replace DrawOp with typed primitives + passes. """ ops: tuple[DrawOp, ...] = () meta: dict[str, object] = field(default_factory=dict)
[docs] @staticmethod def from_ops(ops: Iterable[DrawOp], **meta: object) -> "RenderPacket": """ Create a RenderPacket from an iterable of DrawOps and optional meta. :param ops: Iterable of DrawOp callables. :type ops: Iterable[DrawOp] :return: RenderPacket instance. :rtype: RenderPacket """ return RenderPacket(ops=tuple(ops), meta=dict(meta))
# TODO: Implement later
[docs] @runtime_checkable class Renderable(Protocol): """ Optional convenience: any object that can produce a RenderPacket. """
[docs] def render(self) -> RenderPacket: """ Produce a RenderPacket for this object. :return: RenderPacket instance. :rtype: RenderPacket """