Browse Source

SceneGraph: Simplified Implementation::Camera<3>::fixAspectRatio().

vectorfields
Vladimír Vondruš 14 years ago
parent
commit
27bbf23dff
  1. 35
      src/SceneGraph/Camera.cpp
  2. 17
      src/SceneGraph/Camera.h
  3. 10
      src/SceneGraph/Test/CameraTest.cpp

35
src/SceneGraph/Camera.cpp

@ -24,29 +24,22 @@ namespace Magnum { namespace SceneGraph {
#ifndef DOXYGEN_GENERATING_OUTPUT
namespace Implementation {
Matrix4 Camera<3>::fixAspectRatio(AspectRatioPolicy aspectRatioPolicy, const Math::Vector2<GLsizei>& viewport) {
/* Don't divide by zero */
if(viewport.x() == 0 || viewport.y() == 0)
return Matrix4();
/* Extend on larger side = scale larger side down */
if(aspectRatioPolicy == AspectRatioPolicy::Extend)
return ((viewport.x() > viewport.y()) ?
Matrix4::scaling({GLfloat(viewport.y())/viewport.x(), 1, 1}) :
Matrix4::scaling({1, GLfloat(viewport.x())/viewport.y(), 1})
);
/* Clip on smaller side = scale smaller side up */
if(aspectRatioPolicy == AspectRatioPolicy::Clip)
return ((viewport.x() > viewport.y()) ?
Matrix4::scaling({1, GLfloat(viewport.x())/viewport.y(), 1}) :
Matrix4::scaling({GLfloat(viewport.y())/viewport.x(), 1, 1})
);
/* Don't preserve anything */
return Matrix4();
template<class MatrixType> MatrixType aspectRatioFix(AspectRatioPolicy aspectRatioPolicy, const Math::Vector2<GLsizei>& viewport) {
/* Don't divide by zero / don't preserve anything */
if(viewport.x() == 0 || viewport.y() == 0 || aspectRatioPolicy == AspectRatioPolicy::NotPreserved)
return MatrixType();
/* Extend on larger side = scale larger side down
Clip on smaller side = scale smaller side up */
return Camera<MatrixType::Size-1>::aspectRatioScale(
(viewport.x() > viewport.y()) == (aspectRatioPolicy == AspectRatioPolicy::Extend) ?
Vector2(GLfloat(viewport.y())/viewport.x(), 1.0f) :
Vector2(1.0f, GLfloat(viewport.x())/viewport.y()));
}
/* Explicitly instantiate the templates */
template Matrix4 aspectRatioFix<Matrix4>(AspectRatioPolicy, const Math::Vector2<GLsizei>&);
}
#endif

17
src/SceneGraph/Camera.h

@ -28,6 +28,8 @@
namespace Magnum { namespace SceneGraph {
/** @todo Export implementation symbols only for tests */
#ifndef DOXYGEN_GENERATING_OUTPUT
namespace Implementation {
enum class AspectRatioPolicy {
@ -35,6 +37,11 @@ namespace Implementation {
};
template<size_t dimensions> class Camera {};
template<class MatrixType> MatrixType aspectRatioFix(AspectRatioPolicy aspectRatioPolicy, const Math::Vector2<GLsizei>& viewport);
/* These templates are instantiated in source file */
extern template SCENEGRAPH_EXPORT Matrix4 aspectRatioFix<Matrix4>(AspectRatioPolicy, const Math::Vector2<GLsizei>&);
}
#endif
@ -123,7 +130,7 @@ template<class MatrixType, class VectorType, class ObjectType, class SceneType,
#ifndef DOXYGEN_GENERATING_OUTPUT
inline void fixAspectRatio() {
_projectionMatrix = Implementation::Camera<VectorType::Size>::fixAspectRatio(_aspectRatioPolicy, _viewport)*rawProjectionMatrix;
_projectionMatrix = Implementation::aspectRatioFix<MatrixType>(_aspectRatioPolicy, _viewport)*rawProjectionMatrix;
}
MatrixType rawProjectionMatrix;
@ -137,16 +144,16 @@ template<class MatrixType, class VectorType, class ObjectType, class SceneType,
Math::Vector2<GLsizei> _viewport;
};
/** @todo Export implementation symbols only for tests */
#ifndef DOXYGEN_GENERATING_OUTPUT
/* These templates are instantiated in source file */
extern template class SCENEGRAPH_EXPORT Camera<Matrix4, Vector3, Object3D, Scene3D, Camera3D>;
namespace Implementation {
template<> class SCENEGRAPH_EXPORT Camera<3> {
template<> class Camera<3> {
public:
static Matrix4 fixAspectRatio(AspectRatioPolicy aspectRatioPolicy, const Math::Vector2<GLsizei>& viewport);
inline constexpr static Matrix4 aspectRatioScale(const Vector2& scale) {
return Matrix4::scaling({scale.x(), scale.y(), 1.0f});
}
};
}
#endif

10
src/SceneGraph/Test/CameraTest.cpp

@ -31,27 +31,27 @@ void CameraTest::fixAspectRatio() {
/* Division by zero */
Math::Vector2<GLsizei> sizeZeroY(400, 0);
Math::Vector2<GLsizei> sizeZeroX(0, 300);
CORRADE_COMPARE(Implementation::Camera<3>::fixAspectRatio(Implementation::AspectRatioPolicy::Clip, sizeZeroY), Matrix4());
CORRADE_COMPARE(Implementation::Camera<3>::fixAspectRatio(Implementation::AspectRatioPolicy::Extend, sizeZeroX), Matrix4());
CORRADE_COMPARE(Implementation::aspectRatioFix<Matrix4>(Implementation::AspectRatioPolicy::Clip, sizeZeroY), Matrix4());
CORRADE_COMPARE(Implementation::aspectRatioFix<Matrix4>(Implementation::AspectRatioPolicy::Extend, sizeZeroX), Matrix4());
Math::Vector2<GLsizei> size(400, 300);
/* Not preserved */
CORRADE_COMPARE(Implementation::Camera<3>::fixAspectRatio(Implementation::AspectRatioPolicy::NotPreserved, size), Matrix4());
CORRADE_COMPARE(Implementation::aspectRatioFix<Matrix4>(Implementation::AspectRatioPolicy::NotPreserved, size), Matrix4());
/* Clip */
Matrix4 expectedClip(1.0f, 0.0f, 0.0f, 0.0f,
0.0f, 4.0f/3.0f, 0.0f, 0.0f,
0.0f, 0.0f, 1.0f, 0.0f,
0.0f, 0.0f, 0.0f, 1.0f);
CORRADE_COMPARE(Implementation::Camera<3>::fixAspectRatio(Implementation::AspectRatioPolicy::Clip, size), expectedClip);
CORRADE_COMPARE(Implementation::aspectRatioFix<Matrix4>(Implementation::AspectRatioPolicy::Clip, size), expectedClip);
/* Extend */
Matrix4 expectedExtend(3.0f/4.0f, 0.0f, 0.0f, 0.0f,
0.0f, 1.0f, 0.0f, 0.0f,
0.0f, 0.0f, 1.0f, 0.0f,
0.0f, 0.0f, 0.0f, 1.0f);
CORRADE_COMPARE(Implementation::Camera<3>::fixAspectRatio(Implementation::AspectRatioPolicy::Extend, size), expectedExtend);
CORRADE_COMPARE(Implementation::aspectRatioFix<Matrix4>(Implementation::AspectRatioPolicy::Extend, size), expectedExtend);
}
void CameraTest::orthographic() {

Loading…
Cancel
Save