diff --git a/src/SceneGraph/AbstractObject.h b/src/SceneGraph/AbstractObject.h index 5bea28b75..d7e572cb3 100644 --- a/src/SceneGraph/AbstractObject.h +++ b/src/SceneGraph/AbstractObject.h @@ -67,6 +67,9 @@ template class MAGNUM_SCENEGRAPH_EXPORT Abstrac friend class AbstractFeature; public: + /** @brief Matrix type */ + typedef typename DimensionTraits::MatrixType MatrixType; + /** @brief Feature object type */ typedef AbstractFeature FeatureType; @@ -114,7 +117,7 @@ template class MAGNUM_SCENEGRAPH_EXPORT Abstrac * * @see Object::transformation() */ - typename DimensionTraits::MatrixType transformationMatrix() const { + MatrixType transformationMatrix() const { return doTransformationMatrix(); } @@ -123,7 +126,7 @@ template class MAGNUM_SCENEGRAPH_EXPORT Abstrac * * @see Object::absoluteTransformation() */ - typename DimensionTraits::MatrixType absoluteTransformationMatrix() const { + MatrixType absoluteTransformationMatrix() const { return doAbsoluteTransformationMatrix(); } @@ -136,7 +139,7 @@ template class MAGNUM_SCENEGRAPH_EXPORT Abstrac * Object type, use typesafe Object::transformationMatrices() when * possible. */ - std::vector::MatrixType> transformationMatrices(const std::vector*>& objects, const typename DimensionTraits::MatrixType& initialTransformationMatrix = (typename DimensionTraits::MatrixType())) const { + std::vector transformationMatrices(const std::vector*>& objects, const MatrixType& initialTransformationMatrix = MatrixType()) const { return doTransformationMatrices(objects, initialTransformationMatrix); } @@ -204,9 +207,9 @@ template class MAGNUM_SCENEGRAPH_EXPORT Abstrac virtual AbstractObject* doScene() = 0; virtual const AbstractObject* doScene() const = 0; - virtual typename DimensionTraits::MatrixType doTransformationMatrix() const = 0; - virtual typename DimensionTraits::MatrixType doAbsoluteTransformationMatrix() const = 0; - virtual std::vector::MatrixType> doTransformationMatrices(const std::vector*>& objects, const typename DimensionTraits::MatrixType& initialTransformationMatrix) const = 0; + virtual MatrixType doTransformationMatrix() const = 0; + virtual MatrixType doAbsoluteTransformationMatrix() const = 0; + virtual std::vector doTransformationMatrices(const std::vector*>& objects, const MatrixType& initialTransformationMatrix) const = 0; virtual bool doIsDirty() const = 0; virtual void doSetDirty() = 0; diff --git a/src/SceneGraph/Object.h b/src/SceneGraph/Object.h index 96022f1cc..845e8a6b6 100644 --- a/src/SceneGraph/Object.h +++ b/src/SceneGraph/Object.h @@ -104,6 +104,9 @@ template class MAGNUM_SCENEGRAPH_EXPORT Object: public Abs #endif public: + /** @brief Matrix type */ + typedef typename DimensionTraits::MatrixType MatrixType; + /** * @brief Constructor * @param parent Parent object @@ -211,7 +214,7 @@ template class MAGNUM_SCENEGRAPH_EXPORT Object: public Abs * * @see transformation() */ - typename DimensionTraits::MatrixType transformationMatrix() const { + MatrixType transformationMatrix() const { return Transformation::toMatrix(Transformation::transformation()); } @@ -220,7 +223,7 @@ template class MAGNUM_SCENEGRAPH_EXPORT Object: public Abs * * @see absoluteTransformation() */ - typename DimensionTraits::MatrixType absoluteTransformationMatrix() const { + MatrixType absoluteTransformationMatrix() const { return Transformation::toMatrix(absoluteTransformation()); } @@ -238,7 +241,7 @@ template class MAGNUM_SCENEGRAPH_EXPORT Object: public Abs * if specified. * @see transformations() */ - std::vector::MatrixType> transformationMatrices(const std::vector*>& objects, const typename DimensionTraits::MatrixType& initialTransformationMatrix = (typename DimensionTraits::MatrixType())) const; + std::vector transformationMatrices(const std::vector*>& objects, const MatrixType& initialTransformationMatrix = MatrixType()) const; /** * @brief Transformations of given group of objects relative to this object @@ -288,20 +291,20 @@ template class MAGNUM_SCENEGRAPH_EXPORT Object: public Abs Object* doScene() override final; const Object* doScene() const override final; - typename DimensionTraits::MatrixType MAGNUM_SCENEGRAPH_LOCAL doTransformationMatrix() const override final { + MatrixType MAGNUM_SCENEGRAPH_LOCAL doTransformationMatrix() const override final { return transformationMatrix(); } - typename DimensionTraits::MatrixType MAGNUM_SCENEGRAPH_LOCAL doAbsoluteTransformationMatrix() const override final { + MatrixType MAGNUM_SCENEGRAPH_LOCAL doAbsoluteTransformationMatrix() const override final { return absoluteTransformationMatrix(); } - std::vector::MatrixType> doTransformationMatrices(const std::vector*>& objects, const typename DimensionTraits::MatrixType& initialTransformationMatrix) const override final; + std::vector doTransformationMatrices(const std::vector*>& objects, const MatrixType& initialTransformationMatrix) const override final; typename Transformation::DataType MAGNUM_SCENEGRAPH_LOCAL computeJointTransformation(const std::vector*>& jointObjects, std::vector& jointTransformations, const std::size_t joint, const typename Transformation::DataType& initialTransformation) const; - bool doIsDirty() const override final { return isDirty(); } - void doSetDirty() override final { setDirty(); } - void doSetClean() override final { setClean(); } + bool MAGNUM_SCENEGRAPH_LOCAL doIsDirty() const override final { return isDirty(); } + void MAGNUM_SCENEGRAPH_LOCAL doSetDirty() override final { setDirty(); } + void MAGNUM_SCENEGRAPH_LOCAL doSetClean() override final { setClean(); } void doSetClean(const std::vector*>& objects) override final; void MAGNUM_SCENEGRAPH_LOCAL setClean(const typename Transformation::DataType& absoluteTransformation); diff --git a/src/SceneGraph/Object.hpp b/src/SceneGraph/Object.hpp index 950814a70..73344d877 100644 --- a/src/SceneGraph/Object.hpp +++ b/src/SceneGraph/Object.hpp @@ -161,7 +161,7 @@ template void Object::setClean() { } } -template std::vector::MatrixType> Object::doTransformationMatrices(const std::vector*>& objects, const typename DimensionTraits::MatrixType& initialTransformationMatrix) const { +template auto Object::doTransformationMatrices(const std::vector*>& objects, const MatrixType& initialTransformationMatrix) const -> std::vector { std::vector*> castObjects(objects.size()); for(std::size_t i = 0; i != objects.size(); ++i) /** @todo Ensure this doesn't crash, somehow */ @@ -170,9 +170,9 @@ template std::vector std::vector::MatrixType> Object::transformationMatrices(const std::vector*>& objects, const typename DimensionTraits::MatrixType& initialTransformationMatrix) const { +template auto Object::transformationMatrices(const std::vector*>& objects, const MatrixType& initialTransformationMatrix) const -> std::vector { std::vector transformations = this->transformations(std::move(objects), Transformation::fromMatrix(initialTransformationMatrix)); - std::vector::MatrixType> transformationMatrices(transformations.size()); + std::vector transformationMatrices(transformations.size()); for(std::size_t i = 0; i != objects.size(); ++i) transformationMatrices[i] = Transformation::toMatrix(transformations[i]); @@ -375,8 +375,7 @@ template void Object::setClean(const typen /* "Lazy storage" for transformation matrix and inverted transformation matrix */ typedef typename AbstractFeature::CachedTransformation CachedTransformation; typename AbstractFeature::CachedTransformations cached; - typename DimensionTraits::MatrixType - matrix, invertedMatrix; + MatrixType matrix, invertedMatrix; /* Clean all features */ for(AbstractFeature* i = this->firstFeature(); i; i = i->nextFeature()) {