Spinning Topp Logo BlackTopp Studios
inc
multispherecollisionshape.cpp
1 // © Copyright 2010 - 2016 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_cpp
41 #define _physicsmultispherecollisionshape_cpp
42 
43 #include "Physics/multispherecollisionshape.h"
44 #include "collisionshapemanager.h"
45 #include "stringtool.h"
46 
47 #include "btBulletDynamicsCommon.h"
48 
49 namespace Mezzanine
50 {
51  namespace Physics
52  {
53  /////////////////////////////////////////
54  // MultiSphereCollisionShape Functions
55 
56  void MultiSphereCollisionShape::Construct(const String& Name, const std::vector<Vector3>& Locations, const std::vector<Real>& Radii)
57  {
58  if(Locations.size() != Radii.size())
59  { MEZZ_EXCEPTION(ExceptionBase::PARAMETERS_EXCEPTION,"Vector size mismatch between Locations and Radii in MultiSphereCollisionShape constructor."); }
60  Whole Spheres = Locations.size();
61  btVector3* BulletLocs = new btVector3[Spheres];
62  btScalar* BulletRadii = new btScalar[Spheres];
63  for( Whole X = 0 ; X < Spheres ; X++ )
64  {
65  BulletLocs[X] = Locations[X].GetBulletVector3();
66  BulletRadii[X] = Radii[X];
67  }
68 
69  Construct(Name,new btMultiSphereShape(BulletLocs,BulletRadii,Spheres));
70 
71  delete[] BulletLocs;
72  delete[] BulletRadii;
73  }
74 
75  void MultiSphereCollisionShape::Construct(const String& Name, btMultiSphereShape* BulletShape)
76  {
77  this->Name = Name;
78  SetPointers(BulletShape);
79  this->GetMultiSphereShape()->setImplicitShapeDimensions(Vector3(0,0,0).GetBulletVector3());
80  }
81 
82 
83  MultiSphereCollisionShape::MultiSphereCollisionShape(const String& Name, const std::vector<Vector3>& Locations, const std::vector<Real>& Radii)
84  {
85  Construct(Name,Locations,Radii);
86  }
87 
88  MultiSphereCollisionShape::MultiSphereCollisionShape(const String& Name, btMultiSphereShape* BulletShape)
89  {
90  this->Name = Name;
91  SetPointers(BulletShape);
92  }
93 
95  {
96  if(OneNode.GetAttribute("Version").AsInt() == 1)
97  {
98  XML::Attribute OneName = OneNode.GetChild("PrimitiveCollisionShape").GetChild("CollisionShape").GetAttribute("Name"); // get name
99  if(!OneName) { MEZZ_EXCEPTION(ExceptionBase::PARAMETERS_EXCEPTION,"Could not find Name Attribute on CollsionShape Node during preparation for deserialization"); }
100 
101  XML::Node Spheres = OneNode.GetChild("Spheres");
102  if(!Spheres)
103  { DeSerializeError("locate Spheres node",GetSerializableName()); }
104 
105  std::vector<Vector3> Locations;
106  std::vector<Real> Radii;
107  XML::Node OneSphere = Spheres.GetFirstChild();
108  while (OneSphere)
109  {
110  Locations.push_back(Vector3(OneSphere.GetFirstChild()));
111  Radii.push_back(OneSphere.GetFirstAttribute().AsReal());
112 
113  OneSphere = OneSphere.GetNextSibling();
114  }
115 
116  Construct(OneName.AsString(),Locations,Radii);
117 
118  this->ProtoDeSerialize(OneNode);
119  }else{
120  DeSerializeError("find usable serialization version",MultiSphereCollisionShape::GetSerializableName());
121  }
122  }
123 
125  {
126  delete GetMultiSphereShape();
127  }
128 
130  {
131  Vector3 Loc(GetMultiSphereShape()->getSpherePosition(Index));
132  return Loc;
133  }
134 
136  {
137  return GetMultiSphereShape()->getSphereRadius(Index);
138  }
139 
141  {
142  return GetMultiSphereShape()->getSphereCount();
143  }
144 
146  {
148  }
149 
151  { return static_cast<btMultiSphereShape*>(ShapeBase); }
152 
154  {
155  XML::Node CollisionNode = CurrentRoot.AppendChild(this->MultiSphereCollisionShape::GetSerializableName());
156  if (!CollisionNode) { SerializeError("create CollisionNode",this->MultiSphereCollisionShape::GetSerializableName());}
157 
158  XML::Attribute Version = CollisionNode.AppendAttribute("Version");
159  if (Version)
160  { Version.SetValue(1); }
161  else
162  { SerializeError("Create Version Attribute", GetSerializableName()); }
163 
164  XML::Node PointsNode = CollisionNode.AppendChild("Spheres");
165  if (!PointsNode) { SerializeError("create Spheres",this->MultiSphereCollisionShape::GetSerializableName());}
166 
167  for(Whole c=0; c<this->GetNumSpheres(); ++c)
168  {
169  XML::Node Sphere = PointsNode.AppendChild("Sphere");
170  if (!Sphere) { SerializeError(String("create Sphere ")+ToString(c),this->MultiSphereCollisionShape::GetSerializableName());}
171 
172  XML::Attribute Radius = Sphere.AppendAttribute("Radius");
173  if (!Radius) { SerializeError(String("Append readius to Sphere ")+ToString(c),this->MultiSphereCollisionShape::GetSerializableName());}
174  Radius.SetValue( this->GetSphereRadius(c) );
175 
176  this->GetSphereLocation(c).ProtoSerialize(Sphere);
177  }
178 
179  this->PrimitiveCollisionShape::ProtoSerialize(CollisionNode);
180  }
181 
183  {
185  {
186  if(OneNode.GetAttribute("Version").AsInt() == 1)
187  {
188  XML::Node CollisionNode = OneNode.GetChild(this->PrimitiveCollisionShape::GetSerializableName());
189  if(!CollisionNode)
190  { DeSerializeError("locate PrimitiveCollisionShape node",GetSerializableName()); }
191  this->PrimitiveCollisionShape::ProtoDeSerialize(CollisionNode);
192 
193  }else{
194  DeSerializeError("find usable serialization version",GetSerializableName());
195  }
196  }else{
197  DeSerializeError(String("find correct class to deserialize, found a ")+OneNode.Name(),GetSerializableName());
198  }
199  }
200 
202  { return String("MultiSphereCollisionShape"); }
203  }//Physics
204 }//Mezzanine
205 
206 std::ostream& operator << (std::ostream& stream, const Mezzanine::Physics::MultiSphereCollisionShape& ShapeToSerialize)
207  { Mezzanine::Serialize(stream, ShapeToSerialize); return stream; }
208 
209 std::istream& operator >> (std::istream& stream, Mezzanine::Physics::MultiSphereCollisionShape& x)
210  { return Mezzanine::DeSerialize(stream, x); }
211 
213  { x.ProtoDeSerialize(OneNode); }
214 
215 #endif
This is a generic sphere class used for spacial queries.
Definition: sphere.h:62
std::ostream & operator<<(std::ostream &stream, const Mezzanine::LinearInterpolator< T > &Lint)
Used to Serialize an Mezzanine::LinearInterpolator to a human readable stream.
Definition: interpolator.h:433
Attribute AppendAttribute(const Char8 *Name)
Creates an Attribute and puts it at the end of this Nodes attributes.
Indicates the class is a MultiSphereCollisionShape.
A light-weight handle for manipulating attributes in DOM tree.
Definition: attribute.h:74
virtual Whole GetNumSpheres() const
Gets the number of spheres contained within this shape.
virtual Real GetSphereRadius(const Whole &Index) const
Gets the radius of the sphere at the specified index.
A physics shape comprised of multiple sphere's placed in local space.
String ToString(const T &Datum)
Converts whatever to a String as long as a streaming operator is available for it.
Definition: datatypes.h:242
Attribute GetFirstAttribute() const
Get the First Attribute in this Node.
virtual void ProtoDeSerialize(const XML::Node &OneNode)
Node GetFirstChild() const
Get the first child Node of this Node.
#define MEZZ_EXCEPTION(num, desc)
An easy way to throw exceptions with rich information.
Definition: exception.h:3048
std::ostream & Serialize(std::ostream &Stream, const T &Converted, const String &Indent=String(""))
Convert any class that supports serialization or has a serializer to a string of chars in a stream...
virtual btMultiSphereShape * GetMultiSphereShape() const
static String GetSerializableName()
Get the name of the the XML tag this class will leave behind as its instances are serialized...
const Char8 * AsString(const Char8 *def="") const
Attempts to convert the value of the attribute to a String and returns the results.
Node GetNextSibling() const
Attempt to retrieve the next sibling of this Node.
virtual void ProtoSerialize(XML::Node &CurrentRoot) const
float Real
A Datatype used to represent a real floating point number.
Definition: datatypes.h:141
bool SetValue(const Char8 *rhs)
Set the value of this.
static String GetSerializableName()
Get the name of the the XML tag this class will leave behind as its instances are serialized...
A light-weight handle for manipulating nodes in DOM tree.
Definition: node.h:89
int AsInt(int def=0) const
Attempts to convert the value of the attribute to an int and returns the results. ...
virtual void ProtoDeSerialize(const XML::Node &OneNode)
ShapeType
This enum describes what kind of shape you are currently working with.
Real AsReal(Real def=0) const
Attempts to convert the value of the attribute to a Real and returns the results. ...
std::istream & DeSerialize(std::istream &Stream, T &Converted)
Deserialize the next xml tag in the stream into a specific in memory class instance.
virtual Vector3 GetSphereLocation(const Whole &Index) const
Gets the location(in local space) of the sphere at the specified index.
virtual CollisionShape::ShapeType GetType() const
Gets the type of Collision shape this is.
void DeSerializeError(const String &FailedTo, const String &ClassName, Boole SOrD)
Simply does some string concatenation, then throws an Exception.
Thrown when parameters are checked at runtime and found invalid.
Definition: exception.h:108
virtual void ProtoSerialize(XML::Node &CurrentRoot) const
This is used to represent a point in space, or a vector through space.
Definition: vector3.h:77
void SetPointers(btConvexInternalShape *Shape)
Sets the internal pointers on the base classes.
void Construct(const String &Name, const std::vector< Vector3 > &Locations, const std::vector< Real > &Radii)
Creates a btMultiSphereShape* from two vectors to help unify constructor logic.
String Name
Storage for the name of this class instance.
The bulk of the engine components go in this namspace.
Definition: actor.cpp:56
unsigned long Whole
Whole is an unsigned integer, it will be at least 32bits in size.
Definition: datatypes.h:151
std::istream & operator>>(std::istream &stream, Mezzanine::LinearInterpolator< T > &Lint)
Used to de-serialize an Mezzanine::LinearInterpolator from a stream.
Definition: interpolator.h:448
btCollisionShape * ShapeBase
A pointer to the bullet collision this uses.
MultiSphereCollisionShape(const String &Name, const std::vector< Vector3 > &Locations, const std::vector< Real > &Radii)
Class Constructor.
const Char8 * Name() const
ptrdiff_tGet the name of this Node.
void SerializeError(const String &FailedTo, const String &ClassName, Boole SOrD)
Simply does some string concatenation, then throws an Exception.
Node AppendChild(NodeType Type=NodeElement)
Creates a Node and makes it a child of this one.
std::string String
A datatype used to a series of characters.
Definition: datatypes.h:159
Attribute GetAttribute(const Char8 *Name) const
Attempt to get an Attribute on this Node with a given name.
void ProtoSerialize(XML::Node &CurrentRoot) const
Convert this class to an XML::Node ready for serialization.
Definition: vector3.cpp:588
Node GetChild(const Char8 *Name) const
Attempt to get a child Node with a given name.