Browse Source

SceneGraph: disallow instantiation of Object and Camera base classes.

Renamed them to AbstractObject and AbstractCamera to make this more
evident to end user.
pull/279/head
Vladimír Vondruš 14 years ago
parent
commit
dfe566886a
  1. 28
      src/SceneGraph/Camera.cpp
  2. 44
      src/SceneGraph/Camera.h
  3. 2
      src/SceneGraph/Light.cpp
  4. 16
      src/SceneGraph/Object.cpp
  5. 38
      src/SceneGraph/Object.h
  6. 18
      src/SceneGraph/Scene.h

28
src/SceneGraph/Camera.cpp

@ -45,40 +45,40 @@ template Matrix4 aspectRatioFix<Matrix4>(AspectRatioPolicy, const Vector2&, cons
}
#endif
template<size_t dimensions> Camera<dimensions>::Camera(typename Object<dimensions>::ObjectType* parent): Object<dimensions>::ObjectType(parent), _aspectRatioPolicy(AspectRatioPolicy::NotPreserved) {}
template<size_t dimensions> AbstractCamera<dimensions>::AbstractCamera(typename AbstractObject<dimensions>::ObjectType* parent): AbstractObject<dimensions>::ObjectType(parent), _aspectRatioPolicy(AspectRatioPolicy::NotPreserved) {}
template<size_t dimensions> typename Object<dimensions>::CameraType* Camera<dimensions>::setAspectRatioPolicy(AspectRatioPolicy policy) {
template<size_t dimensions> typename AbstractObject<dimensions>::CameraType* AbstractCamera<dimensions>::setAspectRatioPolicy(AspectRatioPolicy policy) {
_aspectRatioPolicy = policy;
fixAspectRatio();
return static_cast<typename Object<dimensions>::CameraType*>(this);
return static_cast<typename AbstractObject<dimensions>::CameraType*>(this);
}
template<size_t dimensions> void Camera<dimensions>::setViewport(const Math::Vector2<GLsizei>& size) {
template<size_t dimensions> void AbstractCamera<dimensions>::setViewport(const Math::Vector2<GLsizei>& size) {
_viewport = size;
fixAspectRatio();
}
template<size_t dimensions> void Camera<dimensions>::clean(const typename Object<dimensions>::MatrixType& absoluteTransformation) {
Object<dimensions>::ObjectType::clean(absoluteTransformation);
template<size_t dimensions> void AbstractCamera<dimensions>::clean(const typename AbstractObject<dimensions>::MatrixType& absoluteTransformation) {
AbstractObject<dimensions>::ObjectType::clean(absoluteTransformation);
_cameraMatrix = absoluteTransformation.inverted();
}
template<size_t dimensions> void Camera<dimensions>::draw() {
typename Object<dimensions>::SceneType* s = this->scene();
template<size_t dimensions> void AbstractCamera<dimensions>::draw() {
typename AbstractObject<dimensions>::SceneType* s = this->scene();
CORRADE_ASSERT(s, "Camera: cannot draw without camera attached to scene", );
/* Recursively draw child objects */
drawChildren(s, cameraMatrix());
}
template<size_t dimensions> void Camera<dimensions>::drawChildren(typename Object<dimensions>::ObjectType* object, const typename Object<dimensions>::MatrixType& transformationMatrix) {
for(typename Object<dimensions>::ObjectType* i = object->firstChild(); i; i = i->nextSibling()) {
template<size_t dimensions> void AbstractCamera<dimensions>::drawChildren(typename AbstractObject<dimensions>::ObjectType* object, const typename AbstractObject<dimensions>::MatrixType& transformationMatrix) {
for(typename AbstractObject<dimensions>::ObjectType* i = object->firstChild(); i; i = i->nextSibling()) {
/* Transformation matrix for the object */
typename Object<dimensions>::MatrixType matrix = transformationMatrix*i->transformation();
typename AbstractObject<dimensions>::MatrixType matrix = transformationMatrix*i->transformation();
/* Draw the object and its children */
i->draw(matrix, static_cast<typename Object<dimensions>::CameraType*>(this));
i->draw(matrix, static_cast<typename AbstractObject<dimensions>::CameraType*>(this));
drawChildren(i, matrix);
}
}
@ -128,7 +128,7 @@ Camera3D* Camera3D::setPerspective(GLfloat fov, GLfloat near, GLfloat far) {
}
/* Explicitly instantiate the templates */
template class Camera<2>;
template class Camera<3>;
template class AbstractCamera<2>;
template class AbstractCamera<3>;
}}

44
src/SceneGraph/Camera.h

@ -16,7 +16,7 @@
*/
/** @file
* @brief Class Magnum::SceneGraph::Camera, Magnum::SceneGraph::Camera2D, Magnum::SceneGraph::Camera3D
* @brief Class Magnum::SceneGraph::AbstractCamera, Magnum::SceneGraph::Camera2D, Magnum::SceneGraph::Camera3D
*/
#include "Object.h"
@ -49,7 +49,7 @@ namespace Implementation {
/**
@brief %Camera object
*/
template<size_t dimensions> class SCENEGRAPH_EXPORT Camera: public Object<dimensions>::ObjectType {
template<size_t dimensions> class SCENEGRAPH_EXPORT AbstractCamera: public AbstractObject<dimensions>::ObjectType {
public:
/**
* @brief Aspect ratio policy
@ -66,8 +66,10 @@ template<size_t dimensions> class SCENEGRAPH_EXPORT Camera: public Object<dimens
};
#endif
/** @copydoc Object::Object */
Camera(typename Object<dimensions>::ObjectType* parent = nullptr);
/** @copydoc AbstractObject::AbstractObject() */
AbstractCamera(typename AbstractObject<dimensions>::ObjectType* parent = nullptr);
virtual ~AbstractCamera() = 0;
/** @brief Aspect ratio policy */
inline AspectRatioPolicy aspectRatioPolicy() const { return _aspectRatioPolicy; }
@ -76,7 +78,7 @@ template<size_t dimensions> class SCENEGRAPH_EXPORT Camera: public Object<dimens
* @brief Set aspect ratio policy
* @return Pointer to self (for method chaining)
*/
typename Object<dimensions>::CameraType* setAspectRatioPolicy(AspectRatioPolicy policy);
typename AbstractObject<dimensions>::CameraType* setAspectRatioPolicy(AspectRatioPolicy policy);
/**
* @brief Camera matrix
@ -84,7 +86,7 @@ template<size_t dimensions> class SCENEGRAPH_EXPORT Camera: public Object<dimens
* Camera matrix describes world position relative to the camera and is
* applied as first.
*/
inline typename Object<dimensions>::MatrixType cameraMatrix() {
inline typename AbstractObject<dimensions>::MatrixType cameraMatrix() {
this->setClean();
return _cameraMatrix;
}
@ -96,7 +98,7 @@ template<size_t dimensions> class SCENEGRAPH_EXPORT Camera: public Object<dimens
* as last.
* @see projectionSize()
*/
inline typename Object<dimensions>::MatrixType projectionMatrix() const { return _projectionMatrix; }
inline typename AbstractObject<dimensions>::MatrixType projectionMatrix() const { return _projectionMatrix; }
/**
* @brief Size of (near) XY plane in current projection
@ -127,41 +129,43 @@ template<size_t dimensions> class SCENEGRAPH_EXPORT Camera: public Object<dimens
*/
virtual void draw();
using Object<dimensions>::ObjectType::draw; /* Don't hide Object's draw() */
using AbstractObject<dimensions>::ObjectType::draw; /* Don't hide Object's draw() */
protected:
/**
* Recalculates camera matrix.
*/
void clean(const typename Object<dimensions>::MatrixType& absoluteTransformation);
void clean(const typename AbstractObject<dimensions>::MatrixType& absoluteTransformation);
/**
* @brief Draw object children
*
* Recursively draws all children of the object.
*/
void drawChildren(typename Object<dimensions>::ObjectType* object, const typename Object<dimensions>::MatrixType& transformationMatrix);
void drawChildren(typename AbstractObject<dimensions>::ObjectType* object, const typename AbstractObject<dimensions>::MatrixType& transformationMatrix);
#ifndef DOXYGEN_GENERATING_OUTPUT
inline void fixAspectRatio() {
_projectionMatrix = Implementation::aspectRatioFix<typename Object<dimensions>::MatrixType>(_aspectRatioPolicy, {rawProjectionMatrix[0].x(), rawProjectionMatrix[1].y()}, _viewport)*rawProjectionMatrix;
_projectionMatrix = Implementation::aspectRatioFix<typename AbstractObject<dimensions>::MatrixType>(_aspectRatioPolicy, {rawProjectionMatrix[0].x(), rawProjectionMatrix[1].y()}, _viewport)*rawProjectionMatrix;
}
typename Object<dimensions>::MatrixType rawProjectionMatrix;
typename AbstractObject<dimensions>::MatrixType rawProjectionMatrix;
AspectRatioPolicy _aspectRatioPolicy;
#endif
private:
typename Object<dimensions>::MatrixType _projectionMatrix;
typename Object<dimensions>::MatrixType _cameraMatrix;
typename AbstractObject<dimensions>::MatrixType _projectionMatrix;
typename AbstractObject<dimensions>::MatrixType _cameraMatrix;
Math::Vector2<GLsizei> _viewport;
};
template<size_t dimensions> inline AbstractCamera<dimensions>::~AbstractCamera() {}
#ifndef DOXYGEN_GENERATING_OUTPUT
/* These templates are instantiated in source file */
extern template class SCENEGRAPH_EXPORT Camera<2>;
extern template class SCENEGRAPH_EXPORT Camera<3>;
extern template class SCENEGRAPH_EXPORT AbstractCamera<2>;
extern template class SCENEGRAPH_EXPORT AbstractCamera<3>;
namespace Implementation {
template<> class Camera<2> {
@ -180,7 +184,7 @@ namespace Implementation {
#endif
/** @brief %Camera for two-dimensional scenes */
class SCENEGRAPH_EXPORT Camera2D: public Camera<2> {
class SCENEGRAPH_EXPORT Camera2D: public AbstractCamera<2> {
public:
/**
* @brief Constructor
@ -189,7 +193,7 @@ class SCENEGRAPH_EXPORT Camera2D: public Camera<2> {
* Sets orthographic projection to the default OpenGL cube (range @f$ [-1; 1] @f$ in all directions).
* @see setOrthographic()
*/
inline Camera2D(Object2D* parent = nullptr): Camera(parent) {}
inline Camera2D(Object2D* parent = nullptr): AbstractCamera(parent) {}
/**
* @brief Set projection
@ -203,7 +207,7 @@ class SCENEGRAPH_EXPORT Camera2D: public Camera<2> {
};
/** @brief %Camera for three-dimensional scenes */
class SCENEGRAPH_EXPORT Camera3D: public Camera<3> {
class SCENEGRAPH_EXPORT Camera3D: public AbstractCamera<3> {
public:
/**
* @brief Constructor
@ -212,7 +216,7 @@ class SCENEGRAPH_EXPORT Camera3D: public Camera<3> {
* Sets orthographic projection to the default OpenGL cube (range @f$ [-1; 1] @f$ in all directions).
* @see setOrthographic(), setPerspective()
*/
inline Camera3D(Object3D* parent = nullptr): Camera(parent), _near(0.0f), _far(0.0f) {}
inline Camera3D(Object3D* parent = nullptr): AbstractCamera(parent), _near(0.0f), _far(0.0f) {}
/**
* @brief Set orthographic projection

2
src/SceneGraph/Light.cpp

@ -18,7 +18,7 @@
namespace Magnum { namespace SceneGraph {
void Light::clean(const Matrix4& absoluteTransformation) {
Object::clean(absoluteTransformation);
Object3D::clean(absoluteTransformation);
_position = absoluteTransformation[3];
}

16
src/SceneGraph/Object.cpp

@ -25,7 +25,7 @@ using namespace Magnum::Math;
namespace Magnum { namespace SceneGraph {
template<size_t dimensions> typename Object<dimensions>::ObjectType* Object<dimensions>::setParent(ObjectType* parent) {
template<size_t dimensions> typename AbstractObject<dimensions>::ObjectType* AbstractObject<dimensions>::setParent(ObjectType* parent) {
/* Skip if nothing to do or this is scene */
if(this->parent() == parent || isScene()) return static_cast<ObjectType*>(this);
@ -49,7 +49,7 @@ template<size_t dimensions> typename Object<dimensions>::ObjectType* Object<dime
return static_cast<ObjectType*>(this);
}
template<size_t dimensions> typename Object<dimensions>::MatrixType Object<dimensions>::absoluteTransformation(CameraType* camera) {
template<size_t dimensions> typename AbstractObject<dimensions>::MatrixType AbstractObject<dimensions>::absoluteTransformation(CameraType* camera) {
/* Shortcut for absolute transformation of camera relative to itself */
if(camera == this) return MatrixType();
@ -77,7 +77,7 @@ template<size_t dimensions> typename Object<dimensions>::MatrixType Object<dimen
return t;
}
template<size_t dimensions> typename Object<dimensions>::SceneType* Object<dimensions>::scene() {
template<size_t dimensions> typename AbstractObject<dimensions>::SceneType* AbstractObject<dimensions>::scene() {
/* Goes up the family tree until it finds object which is parent of itself
(that's the scene) */
ObjectType* p = parent();
@ -89,7 +89,7 @@ template<size_t dimensions> typename Object<dimensions>::SceneType* Object<dimen
return nullptr;
}
template<size_t dimensions> typename Object<dimensions>::ObjectType* Object<dimensions>::setTransformation(const MatrixType& transformation) {
template<size_t dimensions> typename AbstractObject<dimensions>::ObjectType* AbstractObject<dimensions>::setTransformation(const MatrixType& transformation) {
/* Setting transformation is forbidden for the scene */
/** @todo Assert for this? */
if(isScene()) return static_cast<ObjectType*>(this);
@ -99,7 +99,7 @@ template<size_t dimensions> typename Object<dimensions>::ObjectType* Object<dime
return static_cast<ObjectType*>(this);
}
template<size_t dimensions> void Object<dimensions>::setDirty() {
template<size_t dimensions> void AbstractObject<dimensions>::setDirty() {
/* The object (and all its children) are already dirty, nothing to do */
if(dirty) return;
@ -110,7 +110,7 @@ template<size_t dimensions> void Object<dimensions>::setDirty() {
i->setDirty();
}
template<size_t dimensions> void Object<dimensions>::setClean() {
template<size_t dimensions> void AbstractObject<dimensions>::setClean() {
/* The object (and all its parents) are already clean, nothing to do */
if(!dirty) return;
@ -141,7 +141,7 @@ template<size_t dimensions> void Object<dimensions>::setClean() {
}
/* Explicitly instantiate the templates */
template class Object<2>;
template class Object<3>;
template class AbstractObject<2>;
template class AbstractObject<3>;
}}

38
src/SceneGraph/Object.h

@ -16,7 +16,7 @@
*/
/** @file
* @brief Class Magnum::SceneGraph::Object, Magnum::SceneGraph::Object2D, Magnum::SceneGraph::Object3D
* @brief Class Magnum::SceneGraph::AbstractObject, Magnum::SceneGraph::Object2D, Magnum::SceneGraph::Object3D
*/
#include <Containers/LinkedList.h>
@ -76,12 +76,12 @@ namespace Implementation {
* @todo Transform transformation when changing parent, so the object stays in
* place.
*/
template<size_t dimensions> class SCENEGRAPH_EXPORT Object: public Corrade::Containers::LinkedList<typename Implementation::ObjectDimensionTraits<dimensions>::ObjectType>, public Corrade::Containers::LinkedListItem<typename Implementation::ObjectDimensionTraits<dimensions>::ObjectType, typename Implementation::ObjectDimensionTraits<dimensions>::ObjectType> {
template<size_t dimensions> class SCENEGRAPH_EXPORT AbstractObject: public Corrade::Containers::LinkedList<typename Implementation::ObjectDimensionTraits<dimensions>::ObjectType>, public Corrade::Containers::LinkedListItem<typename Implementation::ObjectDimensionTraits<dimensions>::ObjectType, typename Implementation::ObjectDimensionTraits<dimensions>::ObjectType> {
#ifndef DOXYGEN_GENERATING_OUTPUT
Object(const Object<dimensions>& other) = delete;
Object(Object<dimensions>&& other) = delete;
Object<dimensions>& operator=(const Object<dimensions>& other) = delete;
Object<dimensions>& operator=(Object<dimensions>&& other) = delete;
AbstractObject(const AbstractObject<dimensions>& other) = delete;
AbstractObject(AbstractObject<dimensions>&& other) = delete;
AbstractObject<dimensions>& operator=(const AbstractObject<dimensions>& other) = delete;
AbstractObject<dimensions>& operator=(AbstractObject<dimensions>&& other) = delete;
#endif
public:
@ -108,7 +108,7 @@ template<size_t dimensions> class SCENEGRAPH_EXPORT Object: public Corrade::Cont
*
* Sets all transformations to their default values.
*/
inline Object(ObjectType* parent = nullptr): dirty(true) {
inline AbstractObject(ObjectType* parent = nullptr): dirty(true) {
setParent(parent);
}
@ -118,7 +118,7 @@ template<size_t dimensions> class SCENEGRAPH_EXPORT Object: public Corrade::Cont
* Removes itself from parent's children list and destroys all own
* children.
*/
virtual inline ~Object() {}
virtual ~AbstractObject() = 0;
/** @{ @name Scene hierarchy */
@ -309,21 +309,23 @@ template<size_t dimensions> class SCENEGRAPH_EXPORT Object: public Corrade::Cont
bool dirty;
};
template<size_t dimensions> inline AbstractObject<dimensions>::~AbstractObject() {}
/* Implementations for inline functions with unused parameters */
template<size_t dimensions> inline void Object<dimensions>::draw(const MatrixType&, CameraType*) {}
template<size_t dimensions> inline void Object<dimensions>::clean(const MatrixType&) { dirty = false; }
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; }
#ifndef DOXYGEN_GENERATING_OUTPUT
/* These templates are instantiated in source file */
extern template class SCENEGRAPH_EXPORT Object<2>;
extern template class SCENEGRAPH_EXPORT Object<3>;
extern template class SCENEGRAPH_EXPORT AbstractObject<2>;
extern template class SCENEGRAPH_EXPORT AbstractObject<3>;
#endif
/** @brief Two-dimensional object */
class SCENEGRAPH_EXPORT Object2D: public Object<2> {
class SCENEGRAPH_EXPORT Object2D: public AbstractObject<2> {
public:
/** @copydoc Object::Object */
inline Object2D(Object2D* parent = nullptr): Object(parent) {}
/** @copydoc AbstractObject::AbstractObject() */
inline Object2D(Object2D* parent = nullptr): AbstractObject(parent) {}
/**
* @brief Translate object
@ -371,10 +373,10 @@ class SCENEGRAPH_EXPORT Object2D: public Object<2> {
};
/** @brief Three-dimensional object */
class SCENEGRAPH_EXPORT Object3D: public Object<3> {
class SCENEGRAPH_EXPORT Object3D: public AbstractObject<3> {
public:
/** @copydoc Object::Object */
inline Object3D(Object3D* parent = nullptr): Object(parent) {}
/** @copydoc AbstractObject::AbstractObject() */
inline Object3D(Object3D* parent = nullptr): AbstractObject(parent) {}
/**
* @brief Translate object

18
src/SceneGraph/Scene.h

@ -24,23 +24,23 @@
namespace Magnum { namespace SceneGraph {
/** @brief %Scene */
template<size_t dimensions> class SCENEGRAPH_EXPORT Scene: public Object<dimensions>::ObjectType {
template<size_t dimensions> class SCENEGRAPH_EXPORT Scene: public AbstractObject<dimensions>::ObjectType {
public:
/** @copydoc Object::isScene() */
/** @copydoc AbstractObject::isScene() */
inline bool isScene() const { return true; }
/** @todo Some deleted functions belong only to Scene2D, some only to Scene3D - what to do? */
#ifndef DOXYGEN_GENERATING_OUTPUT
void setParent(typename Object<dimensions>::ObjectType* parent) = delete;
void setTransformation(const typename Object<dimensions>::MatrixType& transformation) = delete;
void multiplyTransformation(const typename Object<dimensions>::MatrixType& transformation, typename Object<dimensions>::Transformation type = Object<dimensions>::Transformation::Global) = delete;
void translate(const typename Object<dimensions>::VectorType& vec, typename Object<dimensions>::Transformation type = Object<dimensions>::Transformation::Global) = delete;
void scale(const typename Object<dimensions>::VectorType& vec, typename Object<dimensions>::Transformation type = Object<dimensions>::Transformation::Global) = delete;
void rotate(GLfloat angle, const typename Object<dimensions>::VectorType& vec, typename Object<dimensions>::Transformation type = Object<dimensions>::Transformation::Global) = delete;
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;
#endif
private:
inline void draw(const typename Object<dimensions>::MatrixType&, typename Object<dimensions>::CameraType*) {}
inline void draw(const typename AbstractObject<dimensions>::MatrixType&, typename AbstractObject<dimensions>::CameraType*) {}
};
/** @brief Two-dimensional scene */

Loading…
Cancel
Save