Source code for pygfx.utils.viewport
from ..renderers import Renderer
[docs]
class Viewport:
"""A rectangular area on a renderer.
Parameters
----------
renderer : Renderer
The renderer on which the viewport should be defined.
rect : tuple, [4]
The viewport rect (x, y, w, h). If None, it is set to the full size of
the renderer's canvas.
"""
[docs]
def __init__(self, renderer, rect=None):
if not isinstance(renderer, Renderer):
raise TypeError("Viewport first arg must be a Renderer.")
self._renderer = renderer
self.rect = rect
[docs]
@classmethod
def from_viewport_or_renderer(cls, x):
"""Convenience method. Some parts of pygfx that accept a viewport
might just as well accept a renderer.
"""
if isinstance(x, Viewport):
return x
elif isinstance(x, Renderer):
return cls(x)
else:
raise TypeError("Expected a Viewport or a Renderer.")
@property
def renderer(self):
"""A reference to the renderer that this is a viewport of."""
return self._renderer
@property
def logical_size(self):
"""The logical size of the rectangular area described by this viewport."""
rect = self.rect
return rect[2], rect[3]
@property
def rect(self):
"""The viewport rect (x, y, w, h). Can be set to None to set
it to the full renderer size.
"""
return self._get_rect()
@rect.setter
def rect(self, rect):
if rect is None:
self._rect = None
else:
if not (len(rect) == 4):
raise ValueError("Viewport rect must be 4 numbers, or None.")
self._rect = tuple(float(v) for v in rect)
def _get_rect(self):
"""Can be overloaded, e.g. for viewports that define their own rect."""
if self._rect is None:
return (0, 0, *self.renderer.logical_size)
else:
return self._rect
[docs]
def is_inside(self, x, y):
"""Get whether the given position is inside the viewport rect."""
vp = self.rect
return vp[0] <= x <= vp[0] + vp[2] and vp[1] <= y <= vp[1] + vp[3]
[docs]
def render(self, scene, camera, flush=False):
"""A shorthand for ``renderer.render(scene, camera)`` at the appropriate
viewport. Does not flush by default.
"""
self.renderer.render(scene, camera, rect=self.rect, flush=flush)