MezzanineEngine 
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
multispherecollisionshape.h
1 // © Copyright 2010 - 2014 BlackTopp Studios Inc.
2 /* This file is part of The Mezzanine Engine.
3 
4  The Mezzanine Engine is free software: you can redistribute it and/or modify
5  it under the terms of the GNU General Public License as published by
6  the Free Software Foundation, either version 3 of the License, or
7  (at your option) any later version.
8 
9  The Mezzanine Engine is distributed in the hope that it will be useful,
10  but WITHOUT ANY WARRANTY; without even the implied warranty of
11  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12  GNU General Public License for more details.
13 
14  You should have received a copy of the GNU General Public License
15  along with The Mezzanine Engine. If not, see <http://www.gnu.org/licenses/>.
16 */
17 /* The original authors have included a copy of the license specified above in the
18  'Docs' folder. See 'gpl.txt'
19 */
20 /* We welcome the use of the Mezzanine engine to anyone, including companies who wish to
21  Build professional software and charge for their product.
22 
23  However there are some practical restrictions, so if your project involves
24  any of the following you should contact us and we will try to work something
25  out:
26  - DRM or Copy Protection of any kind(except Copyrights)
27  - Software Patents You Do Not Wish to Freely License
28  - Any Kind of Linking to Non-GPL licensed Works
29  - Are Currently In Violation of Another Copyright Holder's GPL License
30  - If You want to change our code and not add a few hundred MB of stuff to
31  your distribution
32 
33  These and other limitations could cause serious legal problems if you ignore
34  them, so it is best to simply contact us or the Free Software Foundation, if
35  you have any questions.
36 
37  Joseph Toppi - toppij@gmail.com
38  John Blackwood - makoenergy02@gmail.com
39 */
40 #ifndef _physicsmultispherecollisionshape_h
41 #define _physicsmultispherecollisionshape_h
42 
43 #include "Physics/primitivecollisionshape.h"
44 
45 class btMultiSphereShape;
46 
47 namespace Mezzanine
48 {
49  namespace Physics
50  {
51  ///////////////////////////////////////////////////////////////////////////////
52  /// @class MultiSphereCollisionShape
53  /// @headerfile collisionshape.h
54  /// @brief A physics shape comprised of multiple sphere's placed in local space.
55  /// @details It's important to note that this shape isn't just a bunch of placed sphere's, but
56  /// a convex hull comprised of all the provided sphere's. You can make a capsule shape with
57  /// two sphere's, one above the other(internally this is how it works).
58  ///////////////////////////////////////
60  {
61  protected:
62  /// @internal
63  /// @brief Creates a btMultiSphereShape* from two vectors to help unify constructor logic
64  /// @param Name The name of this name
65  /// @param Locations An std::vector containing all the locations, this must have the same amount of locations as there are radii
66  /// @param Radii An std::vector containing all the Radiuses, this must have the same amount of radii as there are locations
67  /// @throw An out of bounds exception if the there are differing amounts of radii and locations.
68  void Construct(const String& Name, const std::vector<Vector3>& Locations, const std::vector<Real>& Radii);
69  /// @internal
70  /// @brief Constructs the shape when the bullet is already prepared
71  /// @param BulletShape The bullet shape to use
72  /// @param Name The name of this name
73  void Construct(const String& Name, btMultiSphereShape* BulletShape);
74  public:
75  /// @brief Class Constructor.
76  /// @param Name The name of this Shape.
77  MultiSphereCollisionShape(const String& Name, const std::vector<Vector3>& Locations, const std::vector<Real>& Radii);
78  /// @internal
79  /// @brief Internal Constructor.
80  /// @param Name The name of this Shape.
81  /// @param BulletShape The internal shape this shape is based on.
82  MultiSphereCollisionShape(const String& Name, btMultiSphereShape* BulletShape);
83  /// @copydoc BoxCollisionShape::BoxCollisionShape(XML::Node OneNode)
85 
86  /// @brief Class Destructor.
87  virtual ~MultiSphereCollisionShape();
88  /// @brief Gets the location(in local space) of the sphere at the specified index.
89  /// @return Returns a vector3 representing the location of the specified sphere.
90  /// @param Index The index of the desired sphere.
91  virtual Vector3 GetSphereLocation(const Whole& Index) const;
92  /// @brief Gets the radius of the sphere at the specified index.
93  /// @return Returns a Real representing the radius of the specified sphere.
94  /// @param Index The index of the desired sphere.
95  virtual Real GetSphereRadius(const Whole& Index) const;
96  /// @brief Gets the number of spheres contained within this shape.
97  /// @return Returns a Whole representing the number of spheres in this shape.
98  virtual Whole GetNumSpheres() const;
99  /// @copydoc CollisionShape::GetType()
100  virtual CollisionShape::ShapeType GetType() const;
101  /// @copydoc CollisionShape::GetBulletShape
102  virtual btMultiSphereShape* GetMultiSphereShape() const;
103 
104  /// @copydoc CollisionShape::GetBulletShape
105  virtual void ProtoSerialize(XML::Node& CurrentRoot) const;
106  /// @copydoc CollisionShape::GetBulletShape
107  virtual void ProtoDeSerialize(const XML::Node& OneNode);
108  /// @brief Get the name of the the XML tag this class will leave behind as its instances are serialized.
109  /// @return A string containing "MultiSphereCollisionShape"
110  static String SerializableName();
111  };//MultiSphereCollisionShape
112  }//Physics
113 }//Mezzanine
114 
115 /// @copydoc operator << (std::ostream& stream, const Mezzanine::Physics::CollisionShape& ShapeToSerialize)
116 std::ostream& MEZZ_LIB operator << (std::ostream& stream, const Mezzanine::Physics::MultiSphereCollisionShape& ShapeToSerialize);
117 /// @copydoc operator >> (std::istream& stream, Mezzanine::Physics::CollisionShape& x)
118 std::istream& MEZZ_LIB operator >> (std::istream& stream, Mezzanine::Physics::MultiSphereCollisionShape& x);
119 /// @copydoc operator >> (const Mezzanine::XML::Node& OneNode, Mezzanine::Physics::CollisionShape& x)
121 
122 #endif