From 4a23efa307b462758c102550dd62b26ab5e91968 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Wed, 11 Jan 2012 00:00:55 +0100 Subject: [PATCH] Use Vector2 for viewport size in Camera instead of ints. --- src/Camera.cpp | 23 +++++++++++------------ src/Camera.h | 13 ++++++++----- 2 files changed, 19 insertions(+), 17 deletions(-) diff --git a/src/Camera.cpp b/src/Camera.cpp index 2955bdca4..3bd11dc23 100644 --- a/src/Camera.cpp +++ b/src/Camera.cpp @@ -18,7 +18,7 @@ namespace Magnum { -Camera::Camera(Object* parent): Object(parent), _active(0), viewportWidth(0), viewportHeight(0), _aspectRatioPolicy(Extend) { +Camera::Camera(Object* parent): Object(parent), _active(0), _aspectRatioPolicy(Extend) { setOrthographic(2, 1, 1000); } @@ -79,11 +79,10 @@ void Camera::setPerspective(GLfloat fov, GLfloat near, GLfloat far) { fixAspectRatio(); } -void Camera::setViewport(int width, int height) { - glViewport(0, 0, width, height); +void Camera::setViewport(const Math::Vector2& size) { + glViewport(0, 0, size.x(), size.y()); - viewportWidth = width; - viewportHeight = height; + _viewport = size; fixAspectRatio(); } @@ -113,23 +112,23 @@ void Camera::setDirty() { void Camera::fixAspectRatio() { /* Don't divide by zero */ - if(viewportWidth == 0 || viewportHeight == 0) { + if(_viewport.x() == 0 || _viewport.y() == 0) { _projectionMatrix = rawProjectionMatrix; return; } /* Extend on larger side = scale larger side down */ if(_aspectRatioPolicy == Extend) { - _projectionMatrix = ((viewportWidth > viewportHeight) ? - Matrix4::scaling(static_cast(viewportHeight)/viewportWidth, 1, 1) : - Matrix4::scaling(1, static_cast(viewportWidth)/viewportHeight, 1) + _projectionMatrix = ((_viewport.x() > _viewport.y()) ? + Matrix4::scaling(static_cast(_viewport.y())/_viewport.x(), 1, 1) : + Matrix4::scaling(1, static_cast(_viewport.x())/_viewport.y(), 1) )*rawProjectionMatrix; /* Clip on smaller side = scale smaller side up */ } else if(_aspectRatioPolicy == Clip) { - _projectionMatrix = ((viewportWidth > viewportHeight) ? - Matrix4::scaling(1, static_cast(viewportWidth)/viewportHeight, 1) : - Matrix4::scaling(static_cast(viewportHeight)/viewportWidth, 1, 1) + _projectionMatrix = ((_viewport.x() > _viewport.y()) ? + Matrix4::scaling(1, static_cast(_viewport.x())/_viewport.y(), 1) : + Matrix4::scaling(static_cast(_viewport.y())/_viewport.x(), 1, 1) )*rawProjectionMatrix; /* Don't preserve anything */ diff --git a/src/Camera.h b/src/Camera.h index f509724ca..d6911b175 100644 --- a/src/Camera.h +++ b/src/Camera.h @@ -110,14 +110,17 @@ class Camera: public Object { inline Matrix4 projectionMatrix() const { return _projectionMatrix; } /** - * @brief Set viewport - * @param width Window / buffer width - * @param height Window / buffer height + * @brief Set viewport size * * Called when assigning the camera to the scene or when window * size changes. */ - void setViewport(int width, int height); + void setViewport(const Math::Vector2& size); + + /** @copydoc setViewport(const Math::Vector2& size); */ + inline void setViewport(unsigned int width, unsigned int height) { + setViewport({width, height}); + } /** * Recalculates camera matrix. @@ -138,7 +141,7 @@ class Camera: public Object { GLfloat _near, _far; Scene* _active; - int viewportWidth, viewportHeight; + Math::Vector2 _viewport; AspectRatioPolicy _aspectRatioPolicy; void fixAspectRatio();