Browse Source

Using DimensionTraits in SceneGraph implementation.

Removed equivalent typedefs from AbstractObject and replaced them with
DimensionTraits.
vectorfields
Vladimír Vondruš 14 years ago
parent
commit
cac85252ac
  1. 2
      src/Physics/ShapedObject.cpp
  2. 2
      src/Physics/ShapedObject.h
  3. 6
      src/SceneGraph/Camera.cpp
  4. 16
      src/SceneGraph/Camera.h
  5. 10
      src/SceneGraph/Object.cpp
  6. 31
      src/SceneGraph/Object.h
  7. 12
      src/SceneGraph/Scene.h

2
src/Physics/ShapedObject.cpp

@ -42,7 +42,7 @@ template<size_t dimensions> void ShapedObject<dimensions>::setDirty() {
group->setDirty();
}
template<size_t dimensions> void ShapedObject<dimensions>::clean(const typename SceneGraph::AbstractObject<dimensions>::MatrixType& absoluteTransformation) {
template<size_t dimensions> void ShapedObject<dimensions>::clean(const typename DimensionTraits<dimensions, GLfloat>::MatrixType& absoluteTransformation) {
SceneGraph::AbstractObject<dimensions>::ObjectType::clean(absoluteTransformation);
if(_shape) _shape->applyTransformation(absoluteTransformation);

2
src/Physics/ShapedObject.h

@ -72,7 +72,7 @@ template<size_t dimensions> class PHYSICS_EXPORT ShapedObject: public SceneGraph
*
* Applies transformation to associated shape.
*/
void clean(const typename SceneGraph::AbstractObject<dimensions>::MatrixType& absoluteTransformation);
void clean(const typename DimensionTraits<dimensions, GLfloat>::MatrixType& absoluteTransformation);
private:
ShapedObjectGroup<dimensions>* group;

6
src/SceneGraph/Camera.cpp

@ -58,7 +58,7 @@ template<size_t dimensions> void AbstractCamera<dimensions>::setViewport(const M
fixAspectRatio();
}
template<size_t dimensions> void AbstractCamera<dimensions>::clean(const typename AbstractObject<dimensions>::MatrixType& absoluteTransformation) {
template<size_t dimensions> void AbstractCamera<dimensions>::clean(const typename DimensionTraits<dimensions, GLfloat>::MatrixType& absoluteTransformation) {
AbstractObject<dimensions>::ObjectType::clean(absoluteTransformation);
_cameraMatrix = absoluteTransformation.inverted();
@ -72,10 +72,10 @@ template<size_t dimensions> void AbstractCamera<dimensions>::draw() {
drawChildren(s, cameraMatrix());
}
template<size_t dimensions> void AbstractCamera<dimensions>::drawChildren(typename AbstractObject<dimensions>::ObjectType* object, const typename AbstractObject<dimensions>::MatrixType& transformationMatrix) {
template<size_t dimensions> void AbstractCamera<dimensions>::drawChildren(typename AbstractObject<dimensions>::ObjectType* object, const typename DimensionTraits<dimensions, GLfloat>::MatrixType& transformationMatrix) {
for(typename AbstractObject<dimensions>::ObjectType* i = object->firstChild(); i; i = i->nextSibling()) {
/* Transformation matrix for the object */
typename AbstractObject<dimensions>::MatrixType matrix = transformationMatrix*i->transformation();
typename DimensionTraits<dimensions, GLfloat>::MatrixType matrix = transformationMatrix*i->transformation();
/* Draw the object and its children */
i->draw(matrix, static_cast<typename AbstractObject<dimensions>::CameraType*>(this));

16
src/SceneGraph/Camera.h

@ -86,7 +86,7 @@ template<size_t dimensions> class SCENEGRAPH_EXPORT AbstractCamera: public Abstr
* Camera matrix describes world position relative to the camera and is
* applied as first.
*/
inline typename AbstractObject<dimensions>::MatrixType cameraMatrix() {
inline typename DimensionTraits<dimensions, GLfloat>::MatrixType cameraMatrix() {
this->setClean();
return _cameraMatrix;
}
@ -98,7 +98,7 @@ template<size_t dimensions> class SCENEGRAPH_EXPORT AbstractCamera: public Abstr
* as last.
* @see projectionSize()
*/
inline typename AbstractObject<dimensions>::MatrixType projectionMatrix() const { return _projectionMatrix; }
inline typename DimensionTraits<dimensions, GLfloat>::MatrixType projectionMatrix() const { return _projectionMatrix; }
/**
* @brief Size of (near) XY plane in current projection
@ -135,27 +135,27 @@ template<size_t dimensions> class SCENEGRAPH_EXPORT AbstractCamera: public Abstr
/**
* Recalculates camera matrix.
*/
void clean(const typename AbstractObject<dimensions>::MatrixType& absoluteTransformation);
void clean(const typename DimensionTraits<dimensions, GLfloat>::MatrixType& absoluteTransformation);
/**
* @brief Draw object children
*
* Recursively draws all children of the object.
*/
void drawChildren(typename AbstractObject<dimensions>::ObjectType* object, const typename AbstractObject<dimensions>::MatrixType& transformationMatrix);
void drawChildren(typename AbstractObject<dimensions>::ObjectType* object, const typename DimensionTraits<dimensions, GLfloat>::MatrixType& transformationMatrix);
#ifndef DOXYGEN_GENERATING_OUTPUT
inline void fixAspectRatio() {
_projectionMatrix = Implementation::aspectRatioFix<typename AbstractObject<dimensions>::MatrixType>(_aspectRatioPolicy, {rawProjectionMatrix[0].x(), rawProjectionMatrix[1].y()}, _viewport)*rawProjectionMatrix;
_projectionMatrix = Implementation::aspectRatioFix<typename DimensionTraits<dimensions, GLfloat>::MatrixType>(_aspectRatioPolicy, {rawProjectionMatrix[0].x(), rawProjectionMatrix[1].y()}, _viewport)*rawProjectionMatrix;
}
typename AbstractObject<dimensions>::MatrixType rawProjectionMatrix;
typename DimensionTraits<dimensions, GLfloat>::MatrixType rawProjectionMatrix;
AspectRatioPolicy _aspectRatioPolicy;
#endif
private:
typename AbstractObject<dimensions>::MatrixType _projectionMatrix;
typename AbstractObject<dimensions>::MatrixType _cameraMatrix;
typename DimensionTraits<dimensions, GLfloat>::MatrixType _projectionMatrix;
typename DimensionTraits<dimensions, GLfloat>::MatrixType _cameraMatrix;
Math::Vector2<GLsizei> _viewport;
};

10
src/SceneGraph/Object.cpp

@ -49,11 +49,11 @@ template<size_t dimensions> typename AbstractObject<dimensions>::ObjectType* Abs
return static_cast<ObjectType*>(this);
}
template<size_t dimensions> typename AbstractObject<dimensions>::MatrixType AbstractObject<dimensions>::absoluteTransformation(CameraType* camera) {
template<size_t dimensions> typename DimensionTraits<dimensions, GLfloat>::MatrixType AbstractObject<dimensions>::absoluteTransformation(CameraType* camera) {
/* Shortcut for absolute transformation of camera relative to itself */
if(camera == this) return MatrixType();
if(camera == this) return typename DimensionTraits<dimensions, GLfloat>::MatrixType();
MatrixType t = _transformation;
typename DimensionTraits<dimensions, GLfloat>::MatrixType t = _transformation;
ObjectType* p = parent();
while(p != nullptr) {
@ -89,7 +89,7 @@ template<size_t dimensions> typename AbstractObject<dimensions>::SceneType* Abst
return nullptr;
}
template<size_t dimensions> typename AbstractObject<dimensions>::ObjectType* AbstractObject<dimensions>::setTransformation(const MatrixType& transformation) {
template<size_t dimensions> typename AbstractObject<dimensions>::ObjectType* AbstractObject<dimensions>::setTransformation(const typename DimensionTraits<dimensions, GLfloat>::MatrixType& transformation) {
/* Setting transformation is forbidden for the scene */
/** @todo Assert for this? */
if(isScene()) return static_cast<ObjectType*>(this);
@ -130,7 +130,7 @@ template<size_t dimensions> void AbstractObject<dimensions>::setClean() {
/* Call setClean(const Matrix4&) for every parent and also this object */
ObjectType* o = objects.top();
objects.pop();
MatrixType absoluteTransformation = o->absoluteTransformation();
typename DimensionTraits<dimensions, GLfloat>::MatrixType absoluteTransformation = o->absoluteTransformation();
o->clean(absoluteTransformation);
while(!objects.empty()) {
o = objects.top();

31
src/SceneGraph/Object.h

@ -24,6 +24,7 @@
#include "Math/Matrix3.h"
#include "Math/Matrix4.h"
#include "Magnum.h"
#include "DimensionTraits.h"
#include "magnumSceneGraphVisibility.h"
@ -42,18 +43,12 @@ namespace Implementation {
template<size_t dimensions> struct ObjectDimensionTraits {};
template<> struct ObjectDimensionTraits<2> {
static const size_t Dimensions = 2;
typedef Vector2 VectorType;
typedef Matrix3 MatrixType;
typedef Object2D ObjectType;
typedef Camera2D CameraType;
typedef Scene2D SceneType;
};
template<> struct ObjectDimensionTraits<3> {
static const size_t Dimensions = 3;
typedef Vector3 VectorType;
typedef Matrix4 MatrixType;
typedef Object3D ObjectType;
typedef Camera3D CameraType;
typedef Scene3D SceneType;
@ -88,12 +83,6 @@ template<size_t dimensions> class SCENEGRAPH_EXPORT AbstractObject: public Corra
public:
static const size_t Dimensions = dimensions; /**< @brief %Object dimension count */
/** @brief %Vector type for given dimension count */
typedef typename Implementation::ObjectDimensionTraits<Dimensions>::VectorType VectorType;
/** @brief %Matrix type for given dimension count */
typedef typename Implementation::ObjectDimensionTraits<Dimensions>::MatrixType MatrixType;
/** @brief %Object type for given dimension count */
typedef typename Implementation::ObjectDimensionTraits<Dimensions>::ObjectType ObjectType;
@ -174,7 +163,7 @@ template<size_t dimensions> class SCENEGRAPH_EXPORT AbstractObject: public Corra
};
/** @brief Transformation */
inline MatrixType transformation() const {
inline typename DimensionTraits<dimensions, GLfloat>::MatrixType transformation() const {
return _transformation;
}
@ -189,13 +178,13 @@ template<size_t dimensions> class SCENEGRAPH_EXPORT AbstractObject: public Corra
* objects every time it is asked, unless this function is
* reimplemented in a different way.
*/
virtual MatrixType absoluteTransformation(CameraType* camera = nullptr);
virtual typename DimensionTraits<dimensions, GLfloat>::MatrixType absoluteTransformation(CameraType* camera = nullptr);
/**
* @brief Set transformation
* @return Pointer to self (for method chaining)
*/
ObjectType* setTransformation(const MatrixType& transformation);
ObjectType* setTransformation(const typename DimensionTraits<dimensions, GLfloat>::MatrixType& transformation);
/**
* @brief Multiply transformation
@ -203,7 +192,7 @@ template<size_t dimensions> class SCENEGRAPH_EXPORT AbstractObject: public Corra
* @param type Transformation type
* @return Pointer to self (for method chaining)
*/
inline ObjectType* multiplyTransformation(const MatrixType& transformation, Transformation type = Transformation::Global) {
inline ObjectType* multiplyTransformation(const typename DimensionTraits<dimensions, GLfloat>::MatrixType& transformation, Transformation type = Transformation::Global) {
setTransformation(type == Transformation::Global ?
transformation*_transformation : _transformation*transformation);
return static_cast<ObjectType*>(this);
@ -220,7 +209,7 @@ template<size_t dimensions> class SCENEGRAPH_EXPORT AbstractObject: public Corra
*
* Default implementation does nothing.
*/
virtual void draw(const MatrixType& transformationMatrix, CameraType* camera);
virtual void draw(const typename DimensionTraits<dimensions, GLfloat>::MatrixType& transformationMatrix, CameraType* camera);
/** @{ @name Caching helpers
*
@ -295,7 +284,7 @@ template<size_t dimensions> class SCENEGRAPH_EXPORT AbstractObject: public Corra
* }
* @endcode
*/
virtual void clean(const MatrixType& absoluteTransformation);
virtual void clean(const typename DimensionTraits<dimensions, GLfloat>::MatrixType& absoluteTransformation);
/*@}*/
@ -313,15 +302,15 @@ template<size_t dimensions> class SCENEGRAPH_EXPORT AbstractObject: public Corra
using Corrade::Containers::LinkedListItem<ObjectType, ObjectType>::previous;
using Corrade::Containers::LinkedListItem<ObjectType, ObjectType>::next;
MatrixType _transformation;
typename DimensionTraits<dimensions, GLfloat>::MatrixType _transformation;
bool dirty;
};
template<size_t dimensions> inline AbstractObject<dimensions>::~AbstractObject() {}
/* Implementations for inline functions with unused parameters */
template<size_t dimensions> inline void AbstractObject<dimensions>::draw(const MatrixType&, CameraType*) {}
template<size_t dimensions> inline void AbstractObject<dimensions>::clean(const MatrixType&) { dirty = false; }
template<size_t dimensions> inline void AbstractObject<dimensions>::draw(const typename DimensionTraits<dimensions, GLfloat>::MatrixType&, CameraType*) {}
template<size_t dimensions> inline void AbstractObject<dimensions>::clean(const typename DimensionTraits<dimensions, GLfloat>::MatrixType&) { dirty = false; }
#ifndef DOXYGEN_GENERATING_OUTPUT
/* These templates are instantiated in source file */

12
src/SceneGraph/Scene.h

@ -36,15 +36,15 @@ template<size_t dimensions> class SCENEGRAPH_EXPORT Scene: public AbstractObject
/** @todo Some deleted functions belong only to Scene2D, some only to Scene3D - what to do? */
#ifndef DOXYGEN_GENERATING_OUTPUT
void setParent(typename AbstractObject<dimensions>::ObjectType* parent) = delete;
void setTransformation(const typename AbstractObject<dimensions>::MatrixType& transformation) = delete;
void multiplyTransformation(const typename AbstractObject<dimensions>::MatrixType& transformation, typename AbstractObject<dimensions>::Transformation type = AbstractObject<dimensions>::Transformation::Global) = delete;
void translate(const typename AbstractObject<dimensions>::VectorType& vec, typename AbstractObject<dimensions>::Transformation type = AbstractObject<dimensions>::Transformation::Global) = delete;
void scale(const typename AbstractObject<dimensions>::VectorType& vec, typename AbstractObject<dimensions>::Transformation type = AbstractObject<dimensions>::Transformation::Global) = delete;
void rotate(GLfloat angle, const typename AbstractObject<dimensions>::VectorType& vec, typename AbstractObject<dimensions>::Transformation type = AbstractObject<dimensions>::Transformation::Global) = delete;
void setTransformation(const typename DimensionTraits<dimensions, GLfloat>::MatrixType& transformation) = delete;
void multiplyTransformation(const typename DimensionTraits<dimensions, GLfloat>::MatrixType& transformation, typename AbstractObject<dimensions>::Transformation type = DimensionTraits<dimensions, GLfloat>::Transformation::Global) = delete;
void translate(const typename DimensionTraits<dimensions, GLfloat>::VectorType& vec, typename AbstractObject<dimensions>::Transformation type = AbstractObject<dimensions>::Transformation::Global) = delete;
void scale(const typename DimensionTraits<dimensions, GLfloat>::VectorType& vec, typename AbstractObject<dimensions>::Transformation type = AbstractObject<dimensions>::Transformation::Global) = delete;
void rotate(GLfloat angle, const typename DimensionTraits<dimensions, GLfloat>::VectorType& vec, typename AbstractObject<dimensions>::Transformation type = AbstractObject<dimensions>::Transformation::Global) = delete;
#endif
private:
inline void draw(const typename AbstractObject<dimensions>::MatrixType&, typename AbstractObject<dimensions>::CameraType*) {}
inline void draw(const typename DimensionTraits<dimensions, GLfloat>::MatrixType&, typename AbstractObject<dimensions>::CameraType*) {}
};
/** @brief Two-dimensional scene */

Loading…
Cancel
Save