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

17
src/SceneGraph/Camera.h

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

10
src/SceneGraph/Test/CameraTest.cpp

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

Loading…
Cancel
Save