Browse Source

SceneGraph: Camera aspect ratio was not fixed after changing policy.

Also added test for projectionSize(), which couldn't be added before
because of gl*() calls.
vectorfields
Vladimír Vondruš 14 years ago
parent
commit
268f678221
  1. 6
      src/SceneGraph/Camera.cpp
  2. 3
      src/SceneGraph/Camera.h
  3. 15
      src/SceneGraph/Test/CameraTest.cpp
  4. 1
      src/SceneGraph/Test/CameraTest.h

6
src/SceneGraph/Camera.cpp

@ -47,8 +47,12 @@ template Matrix4 aspectRatioFix<Matrix4>(AspectRatioPolicy, const Vector2&, cons
template<class MatrixType, class VectorType, class ObjectType, class SceneType, class CameraType> Camera<MatrixType, VectorType, ObjectType, SceneType, CameraType>::Camera(ObjectType* parent): ObjectType(parent), _aspectRatioPolicy(AspectRatioPolicy::NotPreserved) {}
template<class MatrixType, class VectorType, class ObjectType, class SceneType, class CameraType> void Camera<MatrixType, VectorType, ObjectType, SceneType, CameraType>::setViewport(const Math::Vector2<GLsizei>& size) {
template<class MatrixType, class VectorType, class ObjectType, class SceneType, class CameraType> void Camera<MatrixType, VectorType, ObjectType, SceneType, CameraType>::setAspectRatioPolicy(AspectRatioPolicy policy) {
_aspectRatioPolicy = policy;
fixAspectRatio();
}
template<class MatrixType, class VectorType, class ObjectType, class SceneType, class CameraType> void Camera<MatrixType, VectorType, ObjectType, SceneType, CameraType>::setViewport(const Math::Vector2<GLsizei>& size) {
_viewport = size;
fixAspectRatio();
}

3
src/SceneGraph/Camera.h

@ -73,7 +73,7 @@ template<class MatrixType, class VectorType, class ObjectType, class SceneType,
inline AspectRatioPolicy aspectRatioPolicy() const { return _aspectRatioPolicy; }
/** @brief Set aspect ratio policy */
void setAspectRatioPolicy(AspectRatioPolicy policy) { _aspectRatioPolicy = policy; }
void setAspectRatioPolicy(AspectRatioPolicy policy);
/**
* @brief Camera matrix
@ -102,7 +102,6 @@ template<class MatrixType, class VectorType, class ObjectType, class SceneType,
* @see projectionMatrix()
*/
inline Vector2 projectionSize() const {
/** @todo Test this properly with fixAspectRatio() when Camera is free from gl*() calls */
return {2.0f/_projectionMatrix[0].x(), 2.0f/_projectionMatrix[1].y()};
}

15
src/SceneGraph/Test/CameraTest.cpp

@ -27,7 +27,8 @@ CameraTest::CameraTest() {
&CameraTest::defaultProjection3D,
&CameraTest::projection2D,
&CameraTest::orthographic,
&CameraTest::perspective);
&CameraTest::perspective,
&CameraTest::projectionSizeViewport);
}
void CameraTest::fixAspectRatio() {
@ -135,4 +136,16 @@ void CameraTest::perspective() {
CORRADE_COMPARE(camera.projectionSize(), Vector2(0.48015756f));
}
void CameraTest::projectionSizeViewport() {
Camera3D camera;
camera.setViewport({200, 300});
CORRADE_COMPARE(camera.projectionSize(), Vector2(2.0f, 2.0f));
camera.setAspectRatioPolicy(Camera3D::AspectRatioPolicy::Extend);
CORRADE_COMPARE(camera.projectionSize(), Vector2(2.0f, 3.0f));
camera.setAspectRatioPolicy(Camera3D::AspectRatioPolicy::Clip);
CORRADE_COMPARE(camera.projectionSize(), Vector2(4.0f/3.0f, 2.0f));
}
}}}

1
src/SceneGraph/Test/CameraTest.h

@ -29,6 +29,7 @@ class CameraTest: public Corrade::TestSuite::Tester<CameraTest> {
void projection2D();
void orthographic();
void perspective();
void projectionSizeViewport();
};
}}}

Loading…
Cancel
Save