Source code for peng3d.camera

#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
#  camera.py
#
#  Copyright 2016 notna <notna@apparat.org>
#
#  This program is free software; you can redistribute it and/or modify
#  it under the terms of the GNU General Public License as published by
#  the Free Software Foundation; either version 2 of the License, or
#  (at your option) any later version.
#
#  This program is distributed in the hope that it will be useful,
#  but WITHOUT ANY WARRANTY; without even the implied warranty of
#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#  GNU General Public License for more details.
#
#  You should have received a copy of the GNU General Public License
#  along with this program; if not, write to the Free Software
#  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
#  MA 02110-1301, USA.
#
#

__all__ = ["Camera", "CameraActorFollower"]


[docs]class Camera(object): """ Camera object representing a location to draw from. Each :py:class:`Camera` object is bound to a world and has three properties: a name, :py:attr:`pos` and :py:attr:`rot`\\ . The name of the camera can be any string and is used to identify the camera and thus should be unique. """ def __init__(self, world, name, pos=None, rot=None): if not ( isinstance(name, str) or isinstance(name, bytes) or isinstance(unicode) ): raise TypeError("name must be an instance of basestring!") self.world = world self._pos = pos if pos is not None else [0, 0, 0] self._rot = rot if rot is not None else [0, 0] self.name = name
[docs] def on_activate(self, old): """ Fake event handler called when this camera is made current by a :py:class:`WorldView()` object. """ pass
[docs] def on_rotate(self, old, new): """ Fake event handler called when this camera is rotated. The ``old`` and ``new`` parameters are both rotations and are not equal. Each parameter is a 2-tuple of ``(yaw,pitch)``\\ . """ pass
[docs] def on_move(self, old, new): """ Fake event handler called when this camera moves. The ``old`` and ``new`` parameters are both 3D Locations and are not equal. Each parameter is a 3-tuple of ``(x,y,z)`` in world coordinates. """ pass
# Move/Rotate methods @property def pos(self): """ Property for accessing the position of the camera. This property uses a setter to call the :py:meth:`on_move()` method if set and the new location is not equal to the old location. """ return self._pos @pos.setter def pos(self, value): if self._pos == value: return # Position unchanged old = self._pos self._pos = value self.on_move(old, value) @property def rot(self): """ Property for accessing the rotation of the camera. This property uses a setter to call the :py:meth:`on_rotate()` method if set and the new location is not equal to the old location. """ return self._rot @rot.setter def rot(self, value): if self._rot == value: return # Rotation unchanged old = self._rot self._rot = value self.on_rotate(old, value)
[docs]class CameraActorFollower(Camera): """ Special Camera that follows the specified :py:class:`Actor()`\\ . Note that neither the :py:meth:`on_move() <Camera.on_move>` nor the :py:meth:`on_rotate() <Camera.on_rotate>` event handlers are called due to the way the updating works. """ def __init__(self, world, name, actor): super(CameraActorFollower, self).__init__(world, name) del self._pos, self._rot self.actor = actor @property def pos(self): """ This property always equals the value of ``self.actor.pos``\\ . This property may also be written to. """ return self.actor.pos @pos.setter def pos(self, value): self.actor.pos = value @property def rot(self): """ This property always equals the value of ``self.actor.rot``\\ . This property may also be written to. """ return self.actor.rot @rot.setter def rot(self, value): self.actor.rot = value