#ifndef Magnum_SceneGraph_AbstractObject_h #define Magnum_SceneGraph_AbstractObject_h /* Copyright © 2010, 2011, 2012 Vladimír Vondruš This file is part of Magnum. Magnum is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License version 3 only, as published by the Free Software Foundation. Magnum is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License version 3 for more details. */ /** @file * @brief Class Magnum::SceneGraph::AbstractObject, alias Magnum::SceneGraph::AbstractObject2D, Magnum::SceneGraph::AbstractObject3D */ #include #include "DimensionTraits.h" #include "Magnum.h" #include "magnumCompatibility.h" namespace Magnum { namespace SceneGraph { template class AbstractFeature; /** @brief Base for objects Provides minimal interface for features, not depending on object transformation implementation. See Object or @ref scenegraph for more information. @see AbstractObject2D, AbstractObject3D */ template class AbstractObject #ifndef DOXYGEN_GENERATING_OUTPUT : private Corrade::Containers::LinkedList> #endif { friend class Corrade::Containers::LinkedList>; friend class Corrade::Containers::LinkedListItem, AbstractObject>; friend AbstractFeature::AbstractFeature(AbstractObject*); public: /** @brief Feature object type */ typedef AbstractFeature FeatureType; inline virtual ~AbstractObject() {} /** @brief Whether this object has features */ inline bool hasFeatures() const { return !Corrade::Containers::LinkedList>::isEmpty(); } /** @brief First object feature or `nullptr`, if this object has no features */ inline FeatureType* firstFeature() { return Corrade::Containers::LinkedList>::first(); } /** @overload */ inline const FeatureType* firstFeature() const { return Corrade::Containers::LinkedList>::first(); } /** @brief Last object feature or `nullptr`, if this object has no features */ inline FeatureType* lastFeature() { return Corrade::Containers::LinkedList>::last(); } /** @overload */ inline const FeatureType* lastFeature() const { return Corrade::Containers::LinkedList>::last(); } /** @{ @name Object transformation */ /** * @brief Transformation matrix relative to root object * * @see Object::absoluteTransformation() */ virtual typename DimensionTraits::MatrixType absoluteTransformationMatrix() const = 0; /*@}*/ }; /** @brief Base for two-dimensional objects Convenience alternative to %AbstractObject<2, T>. See AbstractObject for more information. @note Not available on GCC < 4.7. Use %AbstractObject<2, T> instead. @see AbstractObject3D @todoc Remove workaround when Doxygen supports alias template */ #ifndef DOXYGEN_GENERATING_OUTPUT #ifndef MAGNUM_GCC46_COMPATIBILITY template using AbstractObject2D = AbstractObject<2, T>; #endif #else typedef AbstractObject<2, T = GLfloat> AbstractObject2D; #endif /** @brief Base for three-dimensional objects Convenience alternative to %AbstractObject<3, T>. See AbstractObject for more information. @note Not available on GCC < 4.7. Use %AbstractObject<3, T> instead. @see AbstractObject2D @todoc Remove workaround when Doxygen supports alias template */ #ifndef DOXYGEN_GENERATING_OUTPUT #ifndef MAGNUM_GCC46_COMPATIBILITY template using AbstractObject3D = AbstractObject<3, T>; #endif #else typedef AbstractObject<3, T = GLfloat> AbstractObject3D; #endif }} #endif