Source code for simvx.graphics.renderer.viewport_manager
"""Viewport management for multi-viewport rendering."""
from __future__ import annotations
import logging
from typing import Any
import numpy as np
from .._types import Viewport
log = logging.getLogger(__name__)
__all__ = ["ViewportManager"]
[docs]
class ViewportManager:
"""Manages multiple viewports for rendering."""
def __init__(self):
self._viewports: dict[int, Viewport] = {}
self._next_id = 0
[docs]
def create_viewport(
self,
x: int,
y: int,
width: int,
height: int,
camera_view: np.ndarray,
camera_proj: np.ndarray,
render_target: Any | None = None,
) -> int:
"""Create a viewport, returns viewport ID."""
vp_id = self._next_id
self._next_id += 1
self._viewports[vp_id] = Viewport(
x=x,
y=y,
width=width,
height=height,
camera_view=camera_view,
camera_proj=camera_proj,
render_target=render_target,
)
return vp_id
[docs]
def update_viewport(self, vp_id: int, **kwargs: Any) -> None:
"""Update viewport properties."""
vp = self._viewports[vp_id]
for key, value in kwargs.items():
setattr(vp, key, value)
[docs]
def get_viewport(self, vp_id: int) -> Viewport:
"""Get viewport by ID."""
return self._viewports[vp_id]
[docs]
def get_all(self) -> list[tuple[int, Viewport]]:
"""Get all viewports as (id, viewport) pairs."""
return list(self._viewports.items())
[docs]
def remove_viewport(self, vp_id: int) -> None:
"""Remove a viewport."""
del self._viewports[vp_id]
[docs]
def clear(self) -> None:
"""Remove all viewports and reset ID counter."""
self._viewports.clear()
self._next_id = 0 # Reset so next viewport gets ID 0