Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/trunk/src/modules/objects/Turret.h @ 11074

Last change on this file since 11074 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.8 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 *      Marian Runo, Martin Mueller
24 *   Co-authors:
25 *      ...
26 *
27 */
28
29/**
30    @brief Definition of the Turret class.
31    @ingroup Objects
32*/
33
34#ifndef _Turret_H__
35#define _Turret_H__
36
37#include "objects/ObjectsPrereqs.h"
38#include "worldentities/pawns/Pawn.h"
39#include <OgreSceneQuery.h>
40
41namespace orxonox
42{
43    /**
44    @brief
45        Creates a turret with limited rotation. The point of this class is to be able to attach
46        a turret to a spaceship or a spacestation which is more or less completely autonomous in
47        it's behaviour.
48
49        This class also contains a custom local coordinate system, which gets initially rotated through xml, and
50        afterwards is updated with the parent's rotation (if there is one). This allows for almost trivialal calculation
51        of pitch, yaw and roll through coordinate transformation. (TODO: Ogre should do something like this already, investigate...)
52       
53
54    @note
55        The rotation isn't limited "physically". You have to call isInRange to find out if the turret is allowed to shoot at a target.
56    */
57    class _ObjectsExport Turret : public Pawn
58    {
59        public:
60            Turret(Context* context);
61            virtual ~Turret();
62
63            virtual void rotatePitch(const Vector2& value) override;
64            virtual void rotateYaw(const Vector2& value) override;
65            virtual void rotateRoll(const Vector2& value) override;
66            virtual float isInRange(const WorldEntity* target);
67            virtual void aimAtPosition(const Vector3 &position);
68
69            virtual void XMLPort(Element& xmlelement, XMLPort::Mode mode) override;
70            virtual void tick(float dt) override;
71
72            /** @brief Sets the maximum distance the turret is allowed to shoot. @param radius The distance*/
73            inline void setMaxAttackRadius(float radius)
74                { this->maxAttackRadius_ = radius; }
75
76            /** @brief Sets the minimum distance the turret is allowed to shoot. @param radius The distance*/
77            inline void setMinAttackRadius(float radius)
78                { this->minAttackRadius_ = radius; }
79
80            /** @brief Sets the maximum pitch the turret can have (in both directions). @param pitch The pitch (in one direction)*/
81            inline void setMaxPitch(float pitch)
82                { this->maxPitch_ = pitch; }
83
84            /** @brief Sets the maximum yaw the turret can have (in both directions). @param yaw The yaw (in one direction)*/
85            inline void setMaxYaw(float yaw)
86                { this->maxYaw_ = yaw; }
87
88            /** @brief Returns the maximum distance the turret is allowed to shoot. @return The distance */
89            inline float getMaxAttackRadius() const
90                { return this->maxAttackRadius_; }               
91
92            /** @brief Returns the minimum distance the turret is allowed to shoot. @return The distance */
93            inline float getMinAttackRadius() const
94                { return this->minAttackRadius_; }   
95
96            /** @brief Returns the maximum pitch the turret can have. @return The pitch */
97            inline float getMaxPitch() const
98                { return this->maxPitch_; }
99
100            /** @brief Returns the maximum yaw the turret can have. @return The yaw */
101            inline float getMaxYaw() const
102                { return this->maxYaw_; }
103
104            inline void setRotationThrust(float rotationthrust)
105                { this->rotationThrust_ = rotationthrust; }
106
107            inline float getRotationThrust()
108                { return this->rotationThrust_; }
109
110        protected:
111            Vector3 startDir_; //!< The initial facing direction, in local coordinates.
112            Vector3 localZ_; //!< The local z-axis, includes for the parent's rotation and rotations done in xml.
113            Vector3 localY_; //!< The local y-axis, includes for the parent's rotation and rotations done in xml.
114            Vector3 localX_; //!< The local x-axis, includes for the parent's rotation and rotations done in xml.     
115            Quaternion rotation_; //!< The rotation to be done by the turret.
116
117        private:
118            bool once_; //!< Flag for executing code in the tick function only once.
119
120            Vector3 localZStart_; //!< The local z-axis, without the parent's rotation.
121            Vector3 localYStart_; //!< The local y-axis, without the parent's rotation.
122            Vector3 localXStart_; //!< The local x-axis, without the parent's rotation.
123            float maxAttackRadius_; //!< The maximum distance the turret is allowed to shoot.
124            float minAttackRadius_; //!< The minimum distance the turret is allowed to shoot.
125            Ogre::Real maxPitch_; //!< The maxmium pitch the turret can have (on one side).
126            Ogre::Real maxYaw_; //!< The maxmium yaw the turret can have (on one side).
127            float rotationThrust_;  //!< The velocity the turret rotates with.
128            Ogre::RaySceneQuery* rayTest_; //!< Used to perform a raytest, currently unused @see isInRange
129
130    };
131}
132
133#endif
Note: See TracBrowser for help on using the repository browser.