Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/trunk/src/orxonox/worldentities/MobileEntity.h @ 11608

Last change on this file since 11608 was 11071, checked in by landauf, 9 years ago

merged branch cpp11_v3 back to trunk

  • Property svn:eol-style set to native
File size: 5.7 KB
Line 
1/*
2 *   ORXONOX - the hottest 3D action shooter ever to exist
3 *                    > www.orxonox.net <
4 *
5 *
6 *   License notice:
7 *
8 *   This program is free software; you can redistribute it and/or
9 *   modify it under the terms of the GNU General Public License
10 *   as published by the Free Software Foundation; either version 2
11 *   of the License, or (at your option) any later version.
12 *
13 *   This program is distributed in the hope that it will be useful,
14 *   but WITHOUT ANY WARRANTY; without even the implied warranty of
15 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16 *   GNU General Public License for more details.
17 *
18 *   You should have received a copy of the GNU General Public License
19 *   along with this program; if not, write to the Free Software
20 *   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
21 *
22 *   Author:
23 *      Reto Grieder
24 *   Co-authors:
25 *      Martin Stypinski
26 *
27 */
28
29#ifndef _MobileEntity_H__
30#define _MobileEntity_H__
31
32#include "OrxonoxPrereqs.h"
33
34#include "util/Math.h"
35#include "tools/interfaces/Tickable.h"
36#include "WorldEntity.h"
37
38namespace orxonox
39{
40    /**
41    @brief
42        The MobileEntity is a derived class from @ref orxonox::WorldEntity and @ref orxonox::Tickable. It is supposed to be the base class of
43        @ref orxonox::MovableEntity and @ref orxonox::ControllableEntity. You will never need to instanciate a MobileEntity directly.
44        Use only its derivatives.
45        In addition to the functionalities of the @ref orxonox::WorldEntity this class has a linear and angular velocity and a linear and angular acceleration.
46        Every time the @see tick function is called the linear acceleration is multiplied by the time since the last call of tick and then added to the
47        linear velocity. Then the linear velocity is multiplied by the time since the last call of tick and then added to the position. The same happens with
48        the angular acceleration and velocity. With this procedure MobileEntities can change their position and orientation with time.
49
50        A MobileEntity can only have the collisition type WorldEntity::None, WorldEntity::Dynamic or WorldEntity::Kinematic. The collsion type WorldEntity::Static is illegal.
51    */
52
53    class _OrxonoxExport MobileEntity : public WorldEntity, public Tickable
54    {
55        public:
56            MobileEntity(Context* context);
57            virtual ~MobileEntity();
58
59            virtual void XMLPort(Element& xmlelement, XMLPort::Mode mode) override;
60            virtual void tick(float dt) override;
61
62            virtual void setPosition(const Vector3& position) override;
63            virtual void setOrientation(const Quaternion& orientation) override;
64
65            virtual void setVelocity(const Vector3& velocity);
66            inline void setVelocity(float x, float y, float z)
67                { this->setVelocity(Vector3(x, y, z)); }
68            virtual inline const Vector3& getVelocity() const override
69                { return this->linearVelocity_; }
70            /**
71            @brief Get the velocity in the coordinate-system of the MoblieEntity.
72            @return Returns the velocity of the MobileEntity in its coordinate-system.
73            */
74            inline Vector3 getLocalVelocity() const
75                { return (this->getOrientation().Inverse() * this->getVelocity()); }
76
77            virtual void setAngularVelocity(const Vector3& velocity);
78            inline void setAngularVelocity(float x, float y, float z)
79                { this->setAngularVelocity(Vector3(x, y, z)); }
80            inline const Vector3& getAngularVelocity() const
81                { return this->angularVelocity_; }
82
83            void setAcceleration(const Vector3& acceleration);
84            inline void setAcceleration(float x, float y, float z)
85                { this->setAcceleration(Vector3(x, y, z)); }
86            inline const Vector3& getAcceleration() const
87                { return this->linearAcceleration_; }
88            void addAcceleration(const Vector3& acceleration, const Vector3 &relativePosition = Vector3::ZERO); // Adds the input acceleration at the input position to the MobileEntity.
89
90            void setAngularAcceleration(const Vector3& acceleration);
91            inline void setAngularAcceleration(float x, float y, float z)
92                { this->setAngularAcceleration(Vector3(x, y, z)); }
93            inline const Vector3& getAngularAcceleration() const
94                { return this->angularAcceleration_; }
95
96            void applyCentralForce(const Vector3& force);
97            inline void applyCentralForce(float x, float y, float z)
98                { this->applyCentralForce(Vector3(x, y, z)); }
99
100            inline void setRotationRate(Degree rate)
101                { this->setAngularVelocity(this->getAngularVelocity().normalisedCopy() * rate.valueRadians()); }
102            inline Degree getRotationRate() const
103                { return Radian(this->getAngularVelocity().length()); }
104
105            inline void setRotationAxis(const Vector3& axis)
106                { this->setAngularVelocity(axis * this->getAngularVelocity().length()); }
107            inline Vector3 getRotationAxis() const
108                { return this->getAngularVelocity().normalisedCopy(); }
109
110        protected:
111            // Bullet btMotionState related
112            virtual void setWorldTransform(const btTransform& worldTrans) override;
113            virtual void getWorldTransform(btTransform& worldTrans) const override;
114
115            Vector3 linearAcceleration_;
116            Vector3 linearVelocity_;
117            Vector3 angularAcceleration_;
118            Vector3 angularVelocity_;
119
120        private:
121            virtual bool isCollisionTypeLegal(WorldEntity::CollisionType type) const override;
122    };
123}
124
125#endif /* _MobileEntity_H__ */
Note: See TracBrowser for help on using the repository browser.