Browse Source

SceneGraph: fix aspect-ratio-corrected projection with inverted Y.

The test now passes again.
pull/94/head
Vladimír Vondruš 11 years ago
parent
commit
64a9185e08
  1. 3
      src/Magnum/SceneGraph/AbstractCamera.h
  2. 1
      src/Magnum/SceneGraph/AbstractCamera.hpp

3
src/Magnum/SceneGraph/AbstractCamera.h

@ -29,6 +29,7 @@
* @brief Class @ref Magnum::SceneGraph::AbstractCamera, enum @ref Magnum::SceneGraph::AspectRatioPolicy, alias @ref Magnum::SceneGraph::AbstractBasicCamera2D, @ref Magnum::SceneGraph::AbstractBasicCamera3D, typedef @ref Magnum::SceneGraph::AbstractCamera2D, @ref Magnum::SceneGraph::AbstractCamera3D * @brief Class @ref Magnum::SceneGraph::AbstractCamera, enum @ref Magnum::SceneGraph::AspectRatioPolicy, alias @ref Magnum::SceneGraph::AbstractBasicCamera2D, @ref Magnum::SceneGraph::AbstractBasicCamera3D, typedef @ref Magnum::SceneGraph::AbstractCamera2D, @ref Magnum::SceneGraph::AbstractCamera3D
*/ */
#include "Magnum/Math/Functions.h"
#include "Magnum/Math/Matrix3.h" #include "Magnum/Math/Matrix3.h"
#include "Magnum/Math/Matrix4.h" #include "Magnum/Math/Matrix4.h"
#include "Magnum/SceneGraph/AbstractFeature.h" #include "Magnum/SceneGraph/AbstractFeature.h"
@ -150,7 +151,7 @@ template<UnsignedInt dimensions, class T> class AbstractCamera: public AbstractF
#ifndef DOXYGEN_GENERATING_OUTPUT #ifndef DOXYGEN_GENERATING_OUTPUT
void fixAspectRatio() { void fixAspectRatio() {
_projectionMatrix = Implementation::aspectRatioFix<dimensions, T>(_aspectRatioPolicy, {rawProjectionMatrix[0].x(), rawProjectionMatrix[1].y()}, _viewport)*rawProjectionMatrix; _projectionMatrix = Implementation::aspectRatioFix<dimensions, T>(_aspectRatioPolicy, {Math::abs(rawProjectionMatrix[0].x()), Math::abs(rawProjectionMatrix[1].y())}, _viewport)*rawProjectionMatrix;
} }
MatrixTypeFor<dimensions, T> rawProjectionMatrix; MatrixTypeFor<dimensions, T> rawProjectionMatrix;

1
src/Magnum/SceneGraph/AbstractCamera.hpp

@ -41,6 +41,7 @@ template<UnsignedInt dimensions, class T> MatrixTypeFor<dimensions, T> aspectRat
if(projectionScale.x() == 0 || projectionScale.y() == 0 || viewport.x() == 0 || viewport.y() == 0 || aspectRatioPolicy == AspectRatioPolicy::NotPreserved) if(projectionScale.x() == 0 || projectionScale.y() == 0 || viewport.x() == 0 || viewport.y() == 0 || aspectRatioPolicy == AspectRatioPolicy::NotPreserved)
return {}; return {};
CORRADE_INTERNAL_ASSERT((projectionScale > Math::Vector2<T>(0)).all() && (viewport > Vector2i(0)).all());
Math::Vector2<T> relativeAspectRatio = Math::Vector2<T>(viewport)*projectionScale; Math::Vector2<T> relativeAspectRatio = Math::Vector2<T>(viewport)*projectionScale;
/* Extend on larger side = scale larger side down /* Extend on larger side = scale larger side down

Loading…
Cancel
Save