diff --git a/src/SceneGraph/AbstractCamera.h b/src/SceneGraph/AbstractCamera.h index 52dc8b497..e7e71fb25 100644 --- a/src/SceneGraph/AbstractCamera.h +++ b/src/SceneGraph/AbstractCamera.h @@ -72,7 +72,7 @@ relevant sections in @see AbstractCamera2D, AbstractCamera3D, @ref scenegraph, Drawable, DrawableGroup */ -template class MAGNUM_SCENEGRAPH_EXPORT AbstractBasicCamera: public AbstractBasicFeature { +template class MAGNUM_SCENEGRAPH_EXPORT AbstractBasicCamera: public AbstractFeature { public: /** * @brief Constructor @@ -98,7 +98,7 @@ template class MAGNUM_SCENEGRAPH_EXPORT Abstrac * applied as first. */ typename DimensionTraits::MatrixType cameraMatrix() { - AbstractBasicFeature::object()->setClean(); + AbstractFeature::object()->setClean(); return _cameraMatrix; } diff --git a/src/SceneGraph/AbstractCamera.hpp b/src/SceneGraph/AbstractCamera.hpp index 15f7d3fad..91d7ed59a 100644 --- a/src/SceneGraph/AbstractCamera.hpp +++ b/src/SceneGraph/AbstractCamera.hpp @@ -70,8 +70,8 @@ template typename DimensionTraits AbstractBasicCamera::AbstractBasicCamera(AbstractObject* object): AbstractBasicFeature(object), _aspectRatioPolicy(AspectRatioPolicy::NotPreserved) { - AbstractBasicFeature::setCachedTransformations(CachedTransformation::InvertedAbsolute); +template AbstractBasicCamera::AbstractBasicCamera(AbstractObject* object): AbstractFeature(object), _aspectRatioPolicy(AspectRatioPolicy::NotPreserved) { + AbstractFeature::setCachedTransformations(CachedTransformation::InvertedAbsolute); } template AbstractBasicCamera::~AbstractBasicCamera() {} @@ -88,11 +88,11 @@ template void AbstractBasicCamera void AbstractBasicCamera::draw(BasicDrawableGroup& group) { - AbstractObject* scene = AbstractBasicFeature::object()->scene(); + AbstractObject* scene = AbstractFeature::object()->scene(); CORRADE_ASSERT(scene, "Camera::draw(): cannot draw when camera is not part of any scene", ); /* Compute camera matrix */ - AbstractBasicFeature::object()->setClean(); + AbstractFeature::object()->setClean(); /* Compute transformations of all objects in the group relative to the camera */ std::vector*> objects(group.size()); diff --git a/src/SceneGraph/AbstractFeature.h b/src/SceneGraph/AbstractFeature.h index 00e0ad57d..de9c71892 100644 --- a/src/SceneGraph/AbstractFeature.h +++ b/src/SceneGraph/AbstractFeature.h @@ -25,7 +25,7 @@ */ /** @file - * @brief Class Magnum::SceneGraph::AbstractBasicFeature, typedef Magnum::SceneGraph::AbstractFeature2D, Magnum::SceneGraph::AbstractFeature3D, enum Magnum::SceneGraph::CachedTransformation, enum set Magnum::SceneGraph::CachedTransformations + * @brief Class Magnum::SceneGraph::AbstractFeature, alias Magnum::SceneGraph::BasicAbstractFeature2D, Magnum::SceneGraph::BasicAbstractFeature3D, typedef Magnum::SceneGraph::AbstractFeature2D, Magnum::SceneGraph::AbstractFeature3D, enum Magnum::SceneGraph::CachedTransformation, enum set Magnum::SceneGraph::CachedTransformations */ #include @@ -40,8 +40,8 @@ namespace Magnum { namespace SceneGraph { @brief Which transformation to cache in given feature @see @ref scenegraph-caching, CachedTransformations, - AbstractBasicFeature::setCachedTransformations(), AbstractBasicFeature::clean(), - AbstractBasicFeature::cleanInverted() + AbstractFeature::setCachedTransformations(), AbstractFeature::clean(), + AbstractFeature::cleanInverted() @todo Provide also simpler representations from which could benefit other transformation implementations, as they won't need to e.g. create transformation matrix from quaternion? @@ -65,8 +65,8 @@ enum class CachedTransformation: UnsignedByte { /** @brief Which transformations to cache in this feature -@see @ref scenegraph-caching, AbstractBasicFeature::setCachedTransformations(), - AbstractBasicFeature::clean(), AbstractBasicFeature::cleanInverted() +@see @ref scenegraph-caching, AbstractFeature::setCachedTransformations(), + AbstractFeature::clean(), AbstractFeature::cleanInverted() */ typedef Containers::EnumSet CachedTransformations; @@ -154,18 +154,19 @@ For other specializations (e.g. using Double type) you have to use AbstractFeature.hpp implementation file to avoid linker errors. See also @ref compilation-speedup-hpp for more information. - - @ref AbstractBasicFeature "AbstractBasicFeature<2, Float>" - - @ref AbstractBasicFeature "AbstractBasicFeature<3, Float>" + - @ref AbstractFeature "AbstractFeature<2, Float>" + - @ref AbstractFeature "AbstractFeature<3, Float>" -@see @ref AbstractFeature2D, @ref AbstractFeature3D +@see @ref AbstractBasicFeature2D, @ref AbstractBasicFeature3D, + @ref AbstractFeature2D, @ref AbstractFeature3D */ -template class MAGNUM_SCENEGRAPH_EXPORT AbstractBasicFeature -#ifndef DOXYGEN_GENERATING_OUTPUT -: private Containers::LinkedListItem, AbstractObject> -#endif +template class MAGNUM_SCENEGRAPH_EXPORT AbstractFeature + #ifndef DOXYGEN_GENERATING_OUTPUT + : private Containers::LinkedListItem, AbstractObject> + #endif { - friend class Containers::LinkedList>; - friend class Containers::LinkedListItem, AbstractObject>; + friend class Containers::LinkedList>; + friend class Containers::LinkedListItem, AbstractObject>; template friend class Object; public: @@ -173,38 +174,38 @@ template class MAGNUM_SCENEGRAPH_EXPORT Abstrac * @brief Constructor * @param object %Object holding this feature */ - explicit AbstractBasicFeature(AbstractObject* object); + explicit AbstractFeature(AbstractObject* object); - virtual ~AbstractBasicFeature() = 0; + virtual ~AbstractFeature() = 0; /** @brief %Object holding this feature */ AbstractObject* object() { - return Containers::LinkedListItem, AbstractObject>::list(); + return Containers::LinkedListItem, AbstractObject>::list(); } /** @overload */ const AbstractObject* object() const { - return Containers::LinkedListItem, AbstractObject>::list(); + return Containers::LinkedListItem, AbstractObject>::list(); } /** @brief Previous feature or `nullptr`, if this is first feature */ - AbstractBasicFeature* previousFeature() { - return Containers::LinkedListItem, AbstractObject>::previous(); + AbstractFeature* previousFeature() { + return Containers::LinkedListItem, AbstractObject>::previous(); } /** @overload */ - const AbstractBasicFeature* previousFeature() const { - return Containers::LinkedListItem, AbstractObject>::previous(); + const AbstractFeature* previousFeature() const { + return Containers::LinkedListItem, AbstractObject>::previous(); } /** @brief Next feature or `nullptr`, if this is last feature */ - AbstractBasicFeature* nextFeature() { - return Containers::LinkedListItem, AbstractObject>::next(); + AbstractFeature* nextFeature() { + return Containers::LinkedListItem, AbstractObject>::next(); } /** @overload */ - const AbstractBasicFeature* nextFeature() const { - return Containers::LinkedListItem, AbstractObject>::next(); + const AbstractFeature* nextFeature() const { + return Containers::LinkedListItem, AbstractObject>::next(); } /** @@ -282,19 +283,51 @@ template class MAGNUM_SCENEGRAPH_EXPORT Abstrac CachedTransformations _cachedTransformations; }; +#ifndef CORRADE_GCC46_COMPATIBILITY +/** +@brief Base feature for two-dimensional scenes + +Convenience alternative to %AbstractFeature<2, T>. See AbstractFeature +for more information. +@note Not available on GCC < 4.7. Use %AbstractFeature<2, T> instead. +@see @ref AbstractFeature2D, @ref AbstractBasicFeature3D +*/ +template using AbstractBasicFeature2D = AbstractFeature<2, T>; +#endif + /** @brief Base feature for two-dimensional float scenes @see @ref AbstractFeature3D */ -typedef AbstractBasicFeature<2, Float> AbstractFeature2D; +#ifndef CORRADE_GCC46_COMPATIBILITY +typedef AbstractBasicFeature2D AbstractFeature2D; +#else +typedef AbstractFeature<2, Float> AbstractFeature2D; +#endif + +#ifndef CORRADE_GCC46_COMPATIBILITY +/** +@brief Base feature for three-dimensional scenes + +Convenience alternative to %AbstractFeature<3, T>. See AbstractFeature +for more information. +@note Not available on GCC < 4.7. Use %AbstractFeature<3, T> instead. +@see AbstractFeature2D +*/ +template using AbstractBasicFeature3D = AbstractFeature<3, T>; +#endif /** @brief Base feature for three-dimensional float scenes @see @ref AbstractFeature2D */ -typedef AbstractBasicFeature<3, Float> AbstractFeature3D; +#ifndef CORRADE_GCC46_COMPATIBILITY +typedef AbstractBasicFeature3D AbstractFeature3D; +#else +typedef AbstractFeature<3, Float> AbstractFeature3D; +#endif }} diff --git a/src/SceneGraph/AbstractFeature.hpp b/src/SceneGraph/AbstractFeature.hpp index 837aee192..f0da6915e 100644 --- a/src/SceneGraph/AbstractFeature.hpp +++ b/src/SceneGraph/AbstractFeature.hpp @@ -32,17 +32,17 @@ namespace Magnum { namespace SceneGraph { -template AbstractBasicFeature::AbstractBasicFeature(AbstractObject* object) { - object->Containers::template LinkedList>::insert(this); +template AbstractFeature::AbstractFeature(AbstractObject* object) { + object->Containers::template LinkedList>::insert(this); } -template AbstractBasicFeature::~AbstractBasicFeature() = default; +template AbstractFeature::~AbstractFeature() = default; -template void AbstractBasicFeature::markDirty() {} +template void AbstractFeature::markDirty() {} -template void AbstractBasicFeature::clean(const typename DimensionTraits::MatrixType&) {} +template void AbstractFeature::clean(const typename DimensionTraits::MatrixType&) {} -template void AbstractBasicFeature::cleanInverted(const typename DimensionTraits::MatrixType&) {} +template void AbstractFeature::cleanInverted(const typename DimensionTraits::MatrixType&) {} }} diff --git a/src/SceneGraph/AbstractGroupedFeature.h b/src/SceneGraph/AbstractGroupedFeature.h index 4b45f4ff5..dd589c8b2 100644 --- a/src/SceneGraph/AbstractGroupedFeature.h +++ b/src/SceneGraph/AbstractGroupedFeature.h @@ -25,7 +25,7 @@ */ /** @file - * @brief Class Magnum::SceneGraph::AbstractBasicGroupedFeature, alias Magnum::SceneGraph::AbstractGroupedFeature2D, Magnum::SceneGraph::AbstractGroupedFeature3D + * @brief Class Magnum::SceneGraph::AbstractGroupedFeature, alias Magnum::SceneGraph::AbstractBasicGroupedFeature2D, Magnum::SceneGraph::AbstractBasicGroupedFeature3D, Magnum::SceneGraph::AbstractGroupedFeature2D, Magnum::SceneGraph::AbstractGroupedFeature3D */ #include @@ -38,12 +38,12 @@ namespace Magnum { namespace SceneGraph { /** @brief Base for grouped features -Used together with BasicFeatureGroup. +Used together with FeatureGroup. @section AbstractGroupedFeature-subclassing Subclassing Usage is via subclassing the feature using [CRTP](http://en.wikipedia.org/wiki/Curiously_recurring_template_pattern) -and typedef'ing BasicFeatureGroup to accept only given type, e.g.: +and typedef'ing FeatureGroup to accept only given type, e.g.: @code class Drawable: public SceneGraph::AbstractGroupedFeature3D { // ... @@ -59,15 +59,15 @@ For other specializations (e.g. using Double type) you have to use AbstractGroupedFeature.hpp implementation file to avoid linker errors. See also @ref compilation-speedup-hpp for more information. - - @ref AbstractBasicFeatureGroup "AbstractBasicFeatureGroup<2, Float>" - - @ref AbstractBasicFeatureGroup "AbstractBasicFeatureGroup<3, Float>" + - @ref AbstractFeatureGroup "AbstractFeatureGroup<2, Float>" + - @ref AbstractFeatureGroup "AbstractFeatureGroup<3, Float>" -@see @ref AbstractGroupedFeature2D, @ref AbstractGroupedFeature3D, - @ref scenegraph, @ref BasicFeatureGroup, @ref FeatureGroup2D, - @ref FeatureGroup3D +@see @ref scenegraph, @ref AbstractBasicGroupedFeature2D, + @ref AbstractBasicGroupedFeature3D, @ref AbstractGroupedFeature2D, + @ref AbstractGroupedFeature3D, @ref FeatureGroup */ -template class AbstractBasicGroupedFeature: public AbstractBasicFeature { - friend class BasicFeatureGroup; +template class AbstractGroupedFeature: public AbstractFeature { + friend class FeatureGroup; public: /** @@ -78,7 +78,7 @@ template class AbstractBasicGrou * Adds the feature to the object and to group, if specified. * @see FeatureGroup::add() */ - explicit AbstractBasicGroupedFeature(AbstractObject* object, BasicFeatureGroup* group = nullptr): AbstractBasicFeature(object), _group(nullptr) { + explicit AbstractGroupedFeature(AbstractObject* object, FeatureGroup* group = nullptr): AbstractFeature(object), _group(nullptr) { if(group) group->add(static_cast(this)); } @@ -88,44 +88,68 @@ template class AbstractBasicGrou * Removes the feature from object and from group, if it belongs to * any. */ - ~AbstractBasicGroupedFeature() { + ~AbstractGroupedFeature() { if(_group) _group->remove(static_cast(this)); } /** @brief Group this feature belongs to */ - BasicFeatureGroup* group() { + FeatureGroup* group() { return _group; } /** @overload */ - const BasicFeatureGroup* group() const { + const FeatureGroup* group() const { return _group; } private: - BasicFeatureGroup* _group; + FeatureGroup* _group; }; #ifndef CORRADE_GCC46_COMPATIBILITY +/** +@brief Base grouped feature for two-dimensional scenes + +Convenience alternative to %AbstractGroupedFeature<2, Derived, T>. See +AbstractGroupedFeature for more information. +@note Not available on GCC < 4.7. Use %AbstractGroupedFeature<2, Derived, T> + instead. +@see @ref AbstractGroupedFeature2D, @ref AbstractBasicGroupedFeature3D +*/ +template using AbstractBasicGroupedFeature2D = AbstractGroupedFeature<2, Derived, T>; + /** @brief Base grouped feature for two-dimensional float scenes -Convenience alternative to %AbstractBasicGroupedFeature<2, Derived, Float>. -@note Not available on GCC < 4.7. Use %AbstractBasicGroupedFeature<2, Derived, Float> +Convenience alternative to %AbstractBasicGroupedFeature2D. +See AbstractGroupedFeature for more information. +@note Not available on GCC < 4.7. Use %AbstractGroupedFeature<2, Derived, Float> instead. @see @ref AbstractGroupedFeature3D */ -template using AbstractGroupedFeature2D = AbstractBasicGroupedFeature<2, Derived, Float>; +template using AbstractGroupedFeature2D = AbstractBasicGroupedFeature2D; + +/** +@brief Base grouped feature for three-dimensional scenes + +Convenience alternative to %AbstractGroupedFeature<3, Derived, T>. See +AbstractGroupedFeature for more information. +@note Not available on GCC < 4.7. Use %AbstractGroupedFeature<3, Derived, T> + instead. +@see @ref AbstractGroupedFeature3D, @ref AbstractBasicGroupedFeature2D +*/ +template using AbstractBasicGroupedFeature3D = AbstractGroupedFeature<3, Derived, T>; /** -@brief Base for three-dimensional grouped features +@brief Base grouped feature for three-dimensional float scenes -Convenience alternative to %AbstractBasicGroupedFeature<3, Derived, Float>. -@note Not available on GCC < 4.7. Use %AbstractBasicGroupedFeature<3, Derived, Float> +Convenience alternative to %AbstractBasicGroupedFeature3D. +See AbstractGroupedFeature for more information. +@note Not available on GCC < 4.7. Use %AbstractGroupedFeature<3, Derived, Float> instead. @see @ref AbstractGroupedFeature2D */ -template using AbstractGroupedFeature3D = AbstractBasicGroupedFeature<3, Derived, Float>; +template using AbstractGroupedFeature3D = AbstractBasicGroupedFeature3D; #endif }} diff --git a/src/SceneGraph/AbstractObject.h b/src/SceneGraph/AbstractObject.h index 080515e06..0c5398707 100644 --- a/src/SceneGraph/AbstractObject.h +++ b/src/SceneGraph/AbstractObject.h @@ -59,46 +59,46 @@ for(AbstractFeature* feature = o->firstFeature(); feature; feature = feature->ne */ template class MAGNUM_SCENEGRAPH_EXPORT AbstractObject #ifndef DOXYGEN_GENERATING_OUTPUT - : private Containers::LinkedList> + : private Containers::LinkedList> #endif { - friend class Containers::LinkedList>; - friend class Containers::LinkedListItem, AbstractObject>; - friend class AbstractBasicFeature; + friend class Containers::LinkedList>; + friend class Containers::LinkedListItem, AbstractObject>; + friend class AbstractFeature; public: /** @brief Matrix type */ typedef typename DimensionTraits::MatrixType MatrixType; /** @brief Feature object type */ - typedef AbstractBasicFeature FeatureType; + typedef AbstractFeature FeatureType; explicit AbstractObject(); virtual ~AbstractObject(); /** @brief Whether this object has features */ bool hasFeatures() const { - return !Containers::LinkedList>::isEmpty(); + return !Containers::LinkedList>::isEmpty(); } /** @brief First object feature or `nullptr`, if this object has no features */ FeatureType* firstFeature() { - return Containers::LinkedList>::first(); + return Containers::LinkedList>::first(); } /** @overload */ const FeatureType* firstFeature() const { - return Containers::LinkedList>::first(); + return Containers::LinkedList>::first(); } /** @brief Last object feature or `nullptr`, if this object has no features */ FeatureType* lastFeature() { - return Containers::LinkedList>::last(); + return Containers::LinkedList>::last(); } /** @overload */ const FeatureType* lastFeature() const { - return Containers::LinkedList>::last(); + return Containers::LinkedList>::last(); } /** diff --git a/src/SceneGraph/Animable.h b/src/SceneGraph/Animable.h index daa1870ca..3f7ca174b 100644 --- a/src/SceneGraph/Animable.h +++ b/src/SceneGraph/Animable.h @@ -138,9 +138,9 @@ Animable.hpp implementation file to avoid linker errors. See also - @ref Animable "Animable<3, Float>", @ref AnimableGroup "AnimableGroup<3, Float>" @see @ref scenegraph, @ref BasicAnimable2D, @ref BasicAnimable3D, - @ref Animable2D, @ref Animable3D + @ref Animable2D, @ref Animable3D, @ref AnimableGroup */ -template class MAGNUM_SCENEGRAPH_EXPORT Animable: public AbstractBasicGroupedFeature, T> { +template class MAGNUM_SCENEGRAPH_EXPORT Animable: public AbstractGroupedFeature, T> { friend class AnimableGroup; public: diff --git a/src/SceneGraph/Animable.hpp b/src/SceneGraph/Animable.hpp index 8e5cf3bdf..598959bac 100644 --- a/src/SceneGraph/Animable.hpp +++ b/src/SceneGraph/Animable.hpp @@ -35,7 +35,7 @@ namespace Magnum { namespace SceneGraph { -template Animable::Animable(AbstractObject* object, AnimableGroup* group): AbstractBasicGroupedFeature, T>(object, group), _duration(0.0f), startTime(std::numeric_limits::infinity()), pauseTime(-std::numeric_limits::infinity()), previousState(AnimationState::Stopped), currentState(AnimationState::Stopped), _repeated(false), _repeatCount(0), repeats(0) {} +template Animable::Animable(AbstractObject* object, AnimableGroup* group): AbstractGroupedFeature, T>(object, group), _duration(0.0f), startTime(std::numeric_limits::infinity()), pauseTime(-std::numeric_limits::infinity()), previousState(AnimationState::Stopped), currentState(AnimationState::Stopped), _repeated(false), _repeatCount(0), repeats(0) {} template Animable::~Animable() {} @@ -53,11 +53,11 @@ template Animable* Animable AnimableGroup* Animable::group() { - return static_cast*>(AbstractBasicGroupedFeature, T>::group()); + return static_cast*>(AbstractGroupedFeature, T>::group()); } template const AnimableGroup* Animable::group() const { - return static_cast*>(AbstractBasicGroupedFeature, T>::group()); + return static_cast*>(AbstractGroupedFeature, T>::group()); } template void AnimableGroup::step(const Float time, const Float delta) { diff --git a/src/SceneGraph/AnimableGroup.h b/src/SceneGraph/AnimableGroup.h index cbf47af49..39af7a1e6 100644 --- a/src/SceneGraph/AnimableGroup.h +++ b/src/SceneGraph/AnimableGroup.h @@ -41,7 +41,7 @@ See Animable for more information. @see @ref scenegraph, @ref BasicAnimableGroup2D, @ref BasicAnimableGroup3D, @ref AnimableGroup2D, @ref AnimableGroup3D */ -template class MAGNUM_SCENEGRAPH_EXPORT AnimableGroup: public BasicFeatureGroup, T> { +template class MAGNUM_SCENEGRAPH_EXPORT AnimableGroup: public FeatureGroup, T> { friend class Animable; public: diff --git a/src/SceneGraph/Drawable.h b/src/SceneGraph/Drawable.h index ee9595e70..c67a22bae 100644 --- a/src/SceneGraph/Drawable.h +++ b/src/SceneGraph/Drawable.h @@ -116,7 +116,7 @@ void MyApplication::drawEvent() { @see Drawable2D, Drawable3D, @ref scenegraph, DrawableGroup2D, DrawableGroup3D */ -template class BasicDrawable: public AbstractBasicGroupedFeature, T> { +template class BasicDrawable: public AbstractGroupedFeature, T> { public: /** * @brief Constructor @@ -126,7 +126,7 @@ template class BasicDrawable: public AbstractBa * Adds the feature to the object and also to the group, if specified. * Otherwise you can use BasicDrawableGroup::add(). */ - explicit BasicDrawable(AbstractObject* object, BasicDrawableGroup* drawables = nullptr): AbstractBasicGroupedFeature, T>(object, drawables) {} + explicit BasicDrawable(AbstractObject* object, BasicDrawableGroup* drawables = nullptr): AbstractGroupedFeature, T>(object, drawables) {} /** * @brief Draw the object using given camera @@ -160,9 +160,9 @@ See Drawable for more information. @see @ref scenegraph, DrawableGroup2D, DrawableGroup3D */ #ifndef CORRADE_GCC46_COMPATIBILITY -template using BasicDrawableGroup = BasicFeatureGroup, T>; +template using BasicDrawableGroup = FeatureGroup, T>; #else -template class BasicDrawableGroup: public BasicFeatureGroup, T> {}; +template class BasicDrawableGroup: public FeatureGroup, T> {}; #endif /** diff --git a/src/SceneGraph/FeatureGroup.h b/src/SceneGraph/FeatureGroup.h index c07825b0a..19cf67412 100644 --- a/src/SceneGraph/FeatureGroup.h +++ b/src/SceneGraph/FeatureGroup.h @@ -25,7 +25,7 @@ */ /** @file - * @brief Class Magnum::SceneGraph::AbstractBasicFeatureGroup, Magnum::SceneGraph::BasicFeatureGroup, alias Magnum::SceneGraph::FeatureGroup2D, Magnum::SceneGraph::FeatureGroup3D + * @brief Class Magnum::SceneGraph::AbstractFeatureGroup, Magnum::SceneGraph::FeatureGroup, alias Magnum::SceneGraph::BasicFeatureGroup2D, Magnum::SceneGraph::BasicFeatureGroup3D, Magnum::SceneGraph::FeatureGroup2D, Magnum::SceneGraph::FeatureGroup3D */ #include @@ -39,38 +39,39 @@ namespace Magnum { namespace SceneGraph { /** @brief Base for group of features -See BasicFeatureGroup. +See FeatureGroup. */ -template class MAGNUM_SCENEGRAPH_EXPORT AbstractBasicFeatureGroup { - template friend class BasicFeatureGroup; +template class MAGNUM_SCENEGRAPH_EXPORT AbstractFeatureGroup { + template friend class FeatureGroup; - explicit AbstractBasicFeatureGroup(); - virtual ~AbstractBasicFeatureGroup(); + explicit AbstractFeatureGroup(); + virtual ~AbstractFeatureGroup(); - void add(AbstractBasicFeature* feature); - void remove(AbstractBasicFeature* feature); + void add(AbstractFeature* feature); + void remove(AbstractFeature* feature); - std::vector*> features; + std::vector*> features; }; /** @brief Group of features -See AbstractBasicGroupedFeature for more information. -@see @ref FeatureGroup2D, @ref FeatureGroup3D, @ref scenegraph +See AbstractGroupedFeature for more information. +@see @ref scenegraph, @ref BasicFeatureGroup2D, @ref BasicFeatureGroup3D, + @ref FeatureGroup2D, @ref FeatureGroup3D */ -template class BasicFeatureGroup: public AbstractBasicFeatureGroup { - friend class AbstractBasicGroupedFeature; +template class FeatureGroup: public AbstractFeatureGroup { + friend class AbstractGroupedFeature; public: - explicit BasicFeatureGroup() = default; + explicit FeatureGroup() = default; /** * @brief Destructor * * Removes all features belonging to this group, but not deletes them. */ - ~BasicFeatureGroup(); + ~FeatureGroup(); /** @brief Whether the group is empty */ bool isEmpty() const { return this->features.empty(); } @@ -93,9 +94,9 @@ template class BasicFeatureGroup * @return Pointer to self (for method chaining) * * If the features is part of another group, it is removed from it. - * @see remove(), AbstractBasicGroupedFeature::AbstractBasicGroupedFeature() + * @see remove(), AbstractGroupedFeature::AbstractGroupedFeature() */ - BasicFeatureGroup* add(Feature* feature); + FeatureGroup* add(Feature* feature); /** * @brief Remove feature from the group @@ -104,51 +105,75 @@ template class BasicFeatureGroup * The feature must be part of the group. * @see add() */ - BasicFeatureGroup* remove(Feature* feature); + FeatureGroup* remove(Feature* feature); }; #ifndef CORRADE_GCC46_COMPATIBILITY /** -@brief Base feature for two-dimensional float scenes +@brief Base feature group for two-dimensional scenes -Convenience alternative to %BasicFeatureGroup<2, Feature, Float>. -@note Not available on GCC < 4.7. Use %BasicFeatureGroup<2, Feature, Float> +Convenience alternative to %FeatureGroup<2, Feature, T>. See +AbstractGroupedFeature for more information. +@note Not available on GCC < 4.7. Use %FeatureGroup<2, Feature, T> + instead. +@see @ref FeatureGroup2D, @ref BasicFeatureGroup3D +*/ +template using BasicFeatureGroup2D = FeatureGroup<2, Feature, T>; + +/** +@brief Base feature group for two-dimensional float scenes + +Convenience alternative to %BasicFeatureGroup2D. See +AbstractGroupedFeature for more information. +@note Not available on GCC < 4.7. Use %FeatureGroup<2, Feature, Float> instead. @see @ref FeatureGroup3D */ -template using FeatureGroup2D = BasicFeatureGroup<2, Feature, Float>; +template using FeatureGroup2D = BasicFeatureGroup2D; + +/** +@brief Base feature group for three-dimensional scenes + +Convenience alternative to %FeatureGroup<3, Feature, T>. See +AbstractGroupedFeature for more information. +@note Not available on GCC < 4.7. Use %FeatureGroup<3, Feature, T> + instead. +@see @ref FeatureGroup3D, @ref BasicFeatureGroup2D +*/ +template using BasicFeatureGroup3D = FeatureGroup<3, Feature, T>; /** -@brief Base feature for three-dimensional float scenes +@brief Base feature group for three-dimensional float scenes -Convenience alternative to %BasicFeatureGroup<3, Feature, Float>. +Convenience alternative to %BasicFeatureGroup3D. See +AbstractGroupedFeature for more information. @note Not available on GCC < 4.7. Use %FeatureGroup<3, Feature, Float> instead. @see @ref FeatureGroup2D */ -template using FeatureGroup3D = BasicFeatureGroup<3, Feature, Float>; +template using FeatureGroup3D = BasicFeatureGroup3D; #endif -template BasicFeatureGroup::~BasicFeatureGroup() { +template FeatureGroup::~FeatureGroup() { for(auto i: this->features) static_cast(i)->_group = nullptr; } -template BasicFeatureGroup* BasicFeatureGroup::add(Feature* feature) { +template FeatureGroup* FeatureGroup::add(Feature* feature) { /* Remove from previous group */ if(feature->_group) feature->_group->remove(feature); /* Crossreference the feature and group together */ - AbstractBasicFeatureGroup::add(feature); + AbstractFeatureGroup::add(feature); feature->_group = this; return this; } -template BasicFeatureGroup* BasicFeatureGroup::remove(Feature* feature) { +template FeatureGroup* FeatureGroup::remove(Feature* feature) { CORRADE_ASSERT(feature->_group == this, - "SceneGraph::AbstractBasicFeatureGroup::remove(): feature is not part of this group", this); + "SceneGraph::AbstractFeatureGroup::remove(): feature is not part of this group", this); - AbstractBasicFeatureGroup::remove(feature); + AbstractFeatureGroup::remove(feature); feature->_group = nullptr; return this; } diff --git a/src/SceneGraph/FeatureGroup.hpp b/src/SceneGraph/FeatureGroup.hpp index 494af730f..0f2cd1f1f 100644 --- a/src/SceneGraph/FeatureGroup.hpp +++ b/src/SceneGraph/FeatureGroup.hpp @@ -34,14 +34,14 @@ namespace Magnum { namespace SceneGraph { -template AbstractBasicFeatureGroup::AbstractBasicFeatureGroup() = default; -template AbstractBasicFeatureGroup::~AbstractBasicFeatureGroup() = default; +template AbstractFeatureGroup::AbstractFeatureGroup() = default; +template AbstractFeatureGroup::~AbstractFeatureGroup() = default; -template void AbstractBasicFeatureGroup::add(AbstractBasicFeature* feature) { +template void AbstractFeatureGroup::add(AbstractFeature* feature) { features.push_back(feature); } -template void AbstractBasicFeatureGroup::remove(AbstractBasicFeature* feature) { +template void AbstractFeatureGroup::remove(AbstractFeature* feature) { features.erase(std::find(features.begin(), features.end(), feature)); } diff --git a/src/SceneGraph/Object.hpp b/src/SceneGraph/Object.hpp index 0fa140ae6..957bfffc4 100644 --- a/src/SceneGraph/Object.hpp +++ b/src/SceneGraph/Object.hpp @@ -112,7 +112,7 @@ template void Object::setDirty() { Object* self = static_cast*>(this); /* Make all features dirty */ - for(AbstractBasicFeature* i = self->firstFeature(); i; i = i->nextFeature()) + for(AbstractFeature* i = self->firstFeature(); i; i = i->nextFeature()) i->markDirty(); /* Make all children dirty */ @@ -376,7 +376,7 @@ template void Object::setClean(const typen MatrixType matrix, invertedMatrix; /* Clean all features */ - for(AbstractBasicFeature* i = this->firstFeature(); i; i = i->nextFeature()) { + for(AbstractFeature* i = this->firstFeature(); i; i = i->nextFeature()) { /* Cached absolute transformation, compute it if it wasn't computed already */ if(i->cachedTransformations() & CachedTransformation::Absolute) { diff --git a/src/SceneGraph/SceneGraph.h b/src/SceneGraph/SceneGraph.h index d5577b3a6..7f8abc2ca 100644 --- a/src/SceneGraph/SceneGraph.h +++ b/src/SceneGraph/SceneGraph.h @@ -44,18 +44,25 @@ typedef AbstractBasicCamera<3, Float> AbstractCamera3D; /* Enum CachedTransformation and CachedTransformations used only directly */ -template class AbstractBasicFeature; -typedef AbstractBasicFeature<2, Float> AbstractFeature2D; -typedef AbstractBasicFeature<3, Float> AbstractFeature3D; +template class AbstractFeature; +#ifndef CORRADE_GCC46_COMPATIBILITY +template using AbstractBasicFeature2D = AbstractFeature<2, T>; +template using AbstractBasicFeature3D = AbstractFeature<3, T>; +typedef AbstractBasicFeature2D AbstractFeature2D; +typedef AbstractBasicFeature3D AbstractFeature3D; +#else +typedef AbstractFeature<2, Float> AbstractFeature2D; +typedef AbstractFeature<3, Float> AbstractFeature3D; +#endif -template class AbstractBasicFeatureGroup; -typedef AbstractBasicFeatureGroup<2, Float> AbstractFeatureGroup2D; -typedef AbstractBasicFeatureGroup<3, Float> AbstractFeatureGroup3D; +/* AbstractFeatureGroup shouldn't be used directly */ -template class AbstractBasicGroupedFeature; +template class AbstractGroupedFeature; #ifndef CORRADE_GCC46_COMPATIBILITY -template using AbstractGroupedFeature2D = AbstractBasicGroupedFeature<2, Derived, Float>; -template using AbstractGroupedFeature3D = AbstractBasicGroupedFeature<3, Derived, Float>; +template using AbstractBasicGroupedFeature2D = AbstractGroupedFeature<2, Derived, T>; +template using AbstractBasicGroupedFeature3D = AbstractGroupedFeature<3, Derived, T>; +template using AbstractGroupedFeature2D = AbstractBasicGroupedFeature2D; +template using AbstractGroupedFeature3D = AbstractBasicGroupedFeature3D; #endif template class AbstractObject; @@ -123,14 +130,16 @@ template class BasicDualQuaternionTransformation; typedef BasicDualComplexTransformation DualComplexTransformation; typedef BasicDualQuaternionTransformation DualQuaternionTransformation; -template class BasicFeatureGroup; +template class FeatureGroup; #ifndef CORRADE_GCC46_COMPATIBILITY -template using BasicFeatureGroup2D = BasicFeatureGroup<2, Feature, Float>; -template using BasicFeatureGroup3D = BasicFeatureGroup<3, Feature, Float>; +template using BasicFeatureGroup2D = FeatureGroup<2, Feature, T>; +template using BasicFeatureGroup3D = FeatureGroup<3, Feature, T>; +template using FeatureGroup2D = BasicFeatureGroup2D; +template using FeatureGroup3D = BasicFeatureGroup3D; #endif #ifndef CORRADE_GCC46_COMPATIBILITY -template using BasicDrawableGroup = BasicFeatureGroup, T>; +template using BasicDrawableGroup = FeatureGroup, T>; #else template class BasicDrawableGroup; #endif diff --git a/src/SceneGraph/instantiation.cpp b/src/SceneGraph/instantiation.cpp index ab056b10c..d230cbe83 100644 --- a/src/SceneGraph/instantiation.cpp +++ b/src/SceneGraph/instantiation.cpp @@ -42,10 +42,10 @@ template class MAGNUM_SCENEGRAPH_EXPORT AbstractObject<3, Float>; template class MAGNUM_SCENEGRAPH_EXPORT AbstractBasicTransformation<2, Float>; template class MAGNUM_SCENEGRAPH_EXPORT AbstractBasicTransformation<3, Float>; -template class MAGNUM_SCENEGRAPH_EXPORT AbstractBasicFeature<2, Float>; -template class MAGNUM_SCENEGRAPH_EXPORT AbstractBasicFeature<3, Float>; -template class MAGNUM_SCENEGRAPH_EXPORT AbstractBasicFeatureGroup<2, Float>; -template class MAGNUM_SCENEGRAPH_EXPORT AbstractBasicFeatureGroup<3, Float>; +template class MAGNUM_SCENEGRAPH_EXPORT AbstractFeature<2, Float>; +template class MAGNUM_SCENEGRAPH_EXPORT AbstractFeature<3, Float>; +template class MAGNUM_SCENEGRAPH_EXPORT AbstractFeatureGroup<2, Float>; +template class MAGNUM_SCENEGRAPH_EXPORT AbstractFeatureGroup<3, Float>; template class AbstractBasicCamera<2, Float>; template class AbstractBasicCamera<3, Float>; diff --git a/src/Shapes/AbstractShape.cpp b/src/Shapes/AbstractShape.cpp index 0c969964f..d9d6ef0db 100644 --- a/src/Shapes/AbstractShape.cpp +++ b/src/Shapes/AbstractShape.cpp @@ -31,16 +31,16 @@ namespace Magnum { namespace Shapes { -template AbstractShape::AbstractShape(SceneGraph::AbstractObject* object, ShapeGroup* group): SceneGraph::AbstractBasicGroupedFeature, Float>(object, group) { +template AbstractShape::AbstractShape(SceneGraph::AbstractObject* object, ShapeGroup* group): SceneGraph::AbstractGroupedFeature, Float>(object, group) { this->setCachedTransformations(SceneGraph::CachedTransformation::Absolute); } template ShapeGroup* AbstractShape::group() { - return static_cast*>(SceneGraph::AbstractBasicGroupedFeature, Float>::group()); + return static_cast*>(SceneGraph::AbstractGroupedFeature, Float>::group()); } template const ShapeGroup* AbstractShape::group() const { - return static_cast*>(SceneGraph::AbstractBasicGroupedFeature, Float>::group()); + return static_cast*>(SceneGraph::AbstractGroupedFeature, Float>::group()); } template auto AbstractShape::type() const -> Type { diff --git a/src/Shapes/AbstractShape.h b/src/Shapes/AbstractShape.h index b114ec23d..b4e30e8e6 100644 --- a/src/Shapes/AbstractShape.h +++ b/src/Shapes/AbstractShape.h @@ -49,7 +49,7 @@ This class is not directly instantiable, see Shape instead. See @ref shapes for brief introduction. @see AbstractShape2D, AbstractShape3D */ -template class MAGNUM_SHAPES_EXPORT AbstractShape: public SceneGraph::AbstractBasicGroupedFeature, Float> { +template class MAGNUM_SHAPES_EXPORT AbstractShape: public SceneGraph::AbstractGroupedFeature, Float> { friend const Implementation::AbstractShape* Implementation::getAbstractShape<>(const AbstractShape*); public: diff --git a/src/Shapes/ShapeGroup.h b/src/Shapes/ShapeGroup.h index 6b4a3a8be..bd181def2 100644 --- a/src/Shapes/ShapeGroup.h +++ b/src/Shapes/ShapeGroup.h @@ -43,7 +43,7 @@ namespace Magnum { namespace Shapes { See Shape for more information. See @ref shapes for brief introduction. @see @ref scenegraph, ShapeGroup2D, ShapeGroup3D */ -template class MAGNUM_SHAPES_EXPORT ShapeGroup: public SceneGraph::BasicFeatureGroup, Float> { +template class MAGNUM_SHAPES_EXPORT ShapeGroup: public SceneGraph::FeatureGroup, Float> { friend class AbstractShape; public: