From 77832dbcb4862aef45381eb99250309bfc061e2a Mon Sep 17 00:00:00 2001 From: tosh Date: Wed, 17 Apr 2013 20:53:24 +0200 Subject: [PATCH] makes FieldOfView store the view matrix instead of its inverse --- interface/src/FieldOfView.cpp | 21 ++++++++++++++----- interface/src/FieldOfView.h | 39 ++++++++++++++++++++++++++--------- 2 files changed, 45 insertions(+), 15 deletions(-) diff --git a/interface/src/FieldOfView.cpp b/interface/src/FieldOfView.cpp index c255d7232f..0aef91b0ab 100644 --- a/interface/src/FieldOfView.cpp +++ b/interface/src/FieldOfView.cpp @@ -1,6 +1,6 @@ // // FieldOfView.cpp -// interface +// hifi // // Created by Tobias Schwinger on 3/21/13. // Copyright (c) 2013 High Fidelity, Inc. All rights reserved. @@ -16,7 +16,7 @@ using namespace glm; FieldOfView::FieldOfView() : - _matOrientation(mat4(1.0f)), + _matView(mat4(1.0f)), _vecBoundsLow(vec3(-1.0f,-1.0f,-1.0f)), _vecBoundsHigh(vec3(1.0f,1.0f,1.0f)), _valWidth(256.0f), @@ -26,6 +26,17 @@ FieldOfView::FieldOfView() : _enmAspectBalancing(expose_less) { } +FieldOfView& FieldOfView::setOrientation(mat4 const& matrix) { + + _matView = affineInverse(matrix); + return *this; +} + +mat4 FieldOfView::getOrientation() const { + + return affineInverse(_matView); +} + mat4 FieldOfView::getViewerScreenXform() const { mat4 projection; @@ -48,14 +59,14 @@ mat4 FieldOfView::getViewerScreenXform() const { mat4 FieldOfView::getWorldViewerXform() const { - return translate(affineInverse(_matOrientation), + return translate(_matView, vec3(0.0f, 0.0f, -_vecBoundsHigh.z) ); } mat4 FieldOfView::getWorldScreenXform() const { return translate( - getViewerScreenXform() * affineInverse(_matOrientation), + getViewerScreenXform() * _matView, vec3(0.0f, 0.0f, -_vecBoundsHigh.z) ); } @@ -65,7 +76,7 @@ mat4 FieldOfView::getViewerWorldXform() const { return translate( translate(mat4(1.0f), n_translate) - * _matOrientation, -n_translate ); + * affineInverse(_matView), -n_translate ); } float FieldOfView::getPixelSize() const { diff --git a/interface/src/FieldOfView.h b/interface/src/FieldOfView.h index f4caf582c2..82d5c79b6b 100644 --- a/interface/src/FieldOfView.h +++ b/interface/src/FieldOfView.h @@ -1,22 +1,30 @@ // // FieldOfView.h -// interface +// hifi // // Created by Tobias Schwinger on 3/21/13. // Copyright (c) 2013 High Fidelity, Inc. All rights reserved. // -#ifndef __interface__FieldOfView__ -#define __interface__FieldOfView__ +#ifndef __hifi__FieldOfView__ +#define __hifi__FieldOfView__ #include // // Viewing parameter encapsulation. -// +// +// Once configured provides transformation matrices between different coordinate spaces, such as +// +// o world space, +// o viewer space (orientation of local viewer, no projective transforms), and +// o screen space (as Viewer space + projection). +// +// Also provides information about the mapping of the screen space coordinates onto the screen. +// class FieldOfView { - glm::mat4 _matOrientation; + glm::mat4 _matView; glm::vec3 _vecBoundsLow; glm::vec3 _vecBoundsHigh; float _valWidth; @@ -33,7 +41,9 @@ class FieldOfView { FieldOfView& setBounds(glm::vec3 const& low, glm::vec3 const& high) { _vecBoundsLow = low; _vecBoundsHigh = high; return *this; } - FieldOfView& setOrientation(glm::mat4 const& matrix) { _matOrientation = matrix; return *this; } + FieldOfView& setView(glm::mat4 const& matrix) { _matView = matrix; return *this; } + + FieldOfView& setOrientation(glm::mat4 const& matrix); FieldOfView& setPerspective(float angle) { _valAngle = angle; return *this; } @@ -52,13 +62,20 @@ class FieldOfView { // dumb accessors - glm::mat4 const& getOrientation() const { return _matOrientation; } + glm::mat4 const& getView() const { return _matView; } float getWidthInPixels() const { return _valWidth; } float getHeightInPixels() const { return _valHeight; } float getPerspective() const { return _valAngle; } // matrices + // + // Returns a matrix representing the camera position and rotation in + // space. Similar to getViewerWorldXform but without translation offset + // applied. + // + glm::mat4 getOrientation() const; + // // Returns a full transformation matrix to project world coordinates // onto the screen. @@ -100,7 +117,8 @@ class FieldOfView { float getPixelSize() const; // - // Returns the frustum as used for the projection matrices. + // Returns the frustum as used for the projection matrices. That + // is the one that applies when the current orientation is at identity. // The result depdends on the bounds, eventually aspect correction // for the current resolution, the perspective angle (specified in // respect to diagonal) and zoom. @@ -109,7 +127,8 @@ class FieldOfView { // // Returns the z-offset from the origin to where orientation ia - // applied. + // applied (in negated form equivalent to the 'near' parameter of + // gluPerspective). // float getTransformOffset() const { return _vecBoundsHigh.z; } @@ -119,5 +138,5 @@ class FieldOfView { float getAspectRatio() const { return _valHeight / _valWidth; } }; -#endif +#endif /* defined(__hifi__FieldOfView__) */