MezzanineEngine 
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
generic6dofconstraint.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 _physicsgeneric6dofconstraint_h
41 #define _physicsgeneric6dofconstraint_h
42 
43 #include "Physics/dualtransformconstraint.h"
44 
45 class btGeneric6DofConstraint;
46 
47 namespace Mezzanine
48 {
49  namespace Physics
50  {
51  ///////////////////////////////////////////////////////////////////////////////
52  /// @brief Create simple but specific limits on any axis of movement or rotation
53  /// @details Provides optional limits on the x, y, and z for rotation and
54  /// translation. You can get the ID of the axis with ValidLinearAxis() or
55  /// ValidAngularAxis() for this particular constraint at the time of this
56  /// writing the constraint axis looked liked this:
57  /// - 0: Translation X
58  /// - 1: Translation Y
59  /// - 2: Translation Z
60  /// - 3: Rotation X
61  /// - 4: Rotation Y
62  /// - 5: Rotation Z
63  ///
64  /// This has to perform a larger amount of calculations and should be used only
65  /// when other simpler constraints have been ruled out.
66  /// @n @n
67  /// As with all limits when the upper and lower limits match the two actors will
68  /// be locked on that axis and relative translation or rotation will not be
69  /// permitted (within the bounds or error correction). If the Lower limit is
70  /// lower than the Upper limit a range of translation or rotation will be
71  /// allowed. If the Lower limit is higher than the Upper limit this will cause
72  /// the system to realized that no position can satisfy the constraint and
73  /// no restriction will be enforced.
74  /// @n @n
75  /// Each of the Axis also has a motor that can be enabled to cause a specified
76  /// amount of translation or rotation. To aid in selection of specific Axis,
77  /// you should use the UsableAxis enum
78  ///////////////////////////////////////
80  {
81  protected:
82  /// @brief Bullet constraint that this class encapsulates.
83  btGeneric6DofConstraint* Generic6dof;
84  /// @brief Inheritance Constructor.
85  /// @details This is only called by derived classes, and shouldn't be called manually.
87  public:
88  /// @brief Identify the Axis a bit easier when iterating over them is less convienent than typing an Identifier
89  enum UsableAxis{
90  LinearX = 0, ///< Translation on the X axis
91  LinearY = 1, ///< Translation on the Y axis
92  LinearZ = 2, ///< Translation on the Z axis
93  AngularX = 3, ///< Rotation on the X axis
94  AngularY = 4, ///< Rotation on the Y axis
95  AngularZ = 5, ///< Rotation on the Z axis
96 
97  AngularXAsRotationalAxis = 0, ///< Rotation on the X axis, when working with only rotational Axis
98  AngularYAsRotationalAxis = 1, ///< Rotation on the Y axis, when working with only rotational Axis
99  AngularZAsRotationalAxis = 2 ///< Rotation on the Z axis, when working with only rotational Axis
100  };
101 
102  ////////////////////////////////////////////////////////////////////////////////
103  // Generic6DofConstraint Construction and Destruction
104 
105  /// @brief Two proxy Verbose constructor.
106  /// @param ProxyA The First proxy to be bound.
107  /// @param ProxyB The Second proxy to be bound.
108  /// @param VectorA The offset from ProxyAs center of gravity to get to match an offset from ProxyB.
109  /// @param VectorB The offset from ProxyBs center of gravity.
110  /// @param QuaternionA Relative rotation from ProxyA.
111  /// @param QuaternionB Relative rotation from ProxyB.
112  /// @param UseLinearReferenceA Perform Linear math from ProxyA's perspective, default to false.
113  Generic6DofConstraint(RigidProxy* ProxyA, RigidProxy* ProxyB, const Vector3& VectorA, const Vector3& VectorB, const Quaternion& QuaternionA, const Quaternion& QuaternionB, bool UseLinearReferenceA = false);
114  /// @brief Two proxy Terse constructor.
115  /// @param ProxyA The First proxy to be bound.
116  /// @param ProxyB The Second proxy to be bound.
117  /// @param TransformA The offset and rotation from ProxyAs center of gravity to get to match an offset from ProxyB.
118  /// @param TransformB The offset and rotation from ProxyBs center of gravity.
119  /// @param UseLinearReferenceA Perform Linear math from ProxyA's perspective, default to false.
120  Generic6DofConstraint(RigidProxy* ProxyA, RigidProxy* ProxyB, const Transform& TransformA, const Transform& TransformB, bool UseLinearReferenceA = false);
121  /// @brief Body and World Verbose constructor.
122  /// @param ProxyB The proxy to be bound to the world.
123  /// @param VectorB The offset for the ProxyB pivot/hinge/joint.
124  /// @param QuaternionB The rotation.
125  /// @param UseLinearReferenceB Perform Linear math from ProxyBs perspective, default to true.
126  /// @details This Joins an object to the world.
127  Generic6DofConstraint(RigidProxy* ProxyB, const Vector3& VectorB, const Quaternion& QuaternionB, bool UseLinearReferenceB = true);
128  /// @brief Body and World Terse constructor.
129  /// @param ProxyB The proxy to be bound to the world.
130  /// @param TransformB The offset and rotation for the ProxyB pivot/hinge/joint.
131  /// @param UseLinearReferenceB Perform Linear math from ProxyB's perspective, default to true.
132  /// @details This Joins an object to the world.
133  Generic6DofConstraint(RigidProxy* ProxyB, const Transform& TransformB, bool UseLinearReferenceB = true);
134  /// @brief Class destructor.
135  virtual ~Generic6DofConstraint();
136 
137  ////////////////////////////////////////////////////////////////////////////////
138  // Generic6DofConstraint Location and Rotation
139 
140  /// @copydoc DualTransformConstraint::SetPivotATransform(const Transform&)
141  virtual void SetPivotATransform(const Transform& TranA);
142  /// @copydoc DualTransformConstraint::SetPivotBTransform(const Transform&)
143  virtual void SetPivotBTransform(const Transform& TranB);
144  /// @copydoc DualTransformConstraint::GetPivotATransform()
145  virtual Transform GetPivotATransform() const;
146  /// @copydoc DualTransformConstraint::GetPivotBTransform()
147  virtual Transform GetPivotBTransform() const;
148 
149  /// @copydoc DualTransformConstraint::SetPivotALocation(const Vector3&)
150  virtual void SetPivotALocation(const Vector3& Location);
151  /// @copydoc DualTransformConstraint::SetPivotBLocation(const Vector3&)
152  virtual void SetPivotBLocation(const Vector3& Location);
153  /// @copydoc DualTransformConstraint::GetPivotALocation()
154  virtual Vector3 GetPivotALocation() const;
155  /// @copydoc DualTransformConstraint::GetPivotBLocation()
156  virtual Vector3 GetPivotBLocation() const;
157 
158  /// @copydoc DualTransformConstraint::SetPivotARotation(const Quaternion&)
159  virtual void SetPivotARotation(const Quaternion& Rotation);
160  /// @copydoc DualTransformConstraint::SetPivotBRotation(const Quaternion&)
161  virtual void SetPivotBRotation(const Quaternion& Rotation);
162  /// @copydoc DualTransformConstraint::GetPivotARotation()
163  virtual Quaternion GetPivotARotation() const;
164  /// @copydoc DualTransformConstraint::GetPivotBRotation()
165  virtual Quaternion GetPivotBRotation() const;
166 
167  ////////////////////////////////////////////////////////////////////////////////
168  // Generic6DofConstraint Basic Limit Accessors
169 
170  /// @brief Change the upper and lower limit for one axis of translation or rotation limit
171  /// @param Axis The axis to change
172  /// @param Lower The new lower limit
173  /// @param UpperThe new Higher limit
174  virtual void SetLimit(int Axis, Real Lower, Real Upper);
175 
176  /// @brief Set the lower limits on translation
177  /// @param Limit A Vector3 that stores the lower limit x, y and z that cannot be exceeded
178  virtual void SetLinearLimitUpper(const Vector3& Limit);
179  /// @brief Set the Upper limits on translation
180  /// @return A Vector3 that stores the upper limit x, y and z that cannot be exceeded
181  virtual void SetLinearLimitLower(const Vector3& Limit);
182  /// @brief Get the lower limits on translation
183  /// @param Limit A Vector3 that stores the lower limit x, y and z that cannot be exceeded
184  virtual Vector3 GetLinearLimitUpper() const;
185  /// @brief Get the Upper limits on translation
186  /// @return A Vector3 that stores the upper limit x, y and z that cannot be exceeded
187  virtual Vector3 GetLinearLimitLower() const;
188 
189  /// @brief Set the Upper limits on rotation
190  /// @param Limit A Vector3 that store the lower limit x, y and z rotation in radians
191  virtual void SetAngularLimitUpper(const Vector3& Limit);
192  /// @brief Set the Lower limits on rotation
193  /// @param Limit A Vector3 that store the upper limit x, y and z rotation in radians
194  virtual void SetAngularLimitLower(const Vector3& Limit);
195  /// @brief Get the Power limits on rotation
196  /// @return Limit A Vector3 that stores the lower limit x, y and z rotation in radians
197  virtual Vector3 GetAngularLimitUpper() const;
198  /// @brief Get the Upper limits on rotation
199  /// @return Limit A Vector3 that stores the upper limit x, y and z rotation in radians
200  virtual Vector3 GetAngularLimitLower() const;
201 
202  /// @brief Get a specific lower rotational limit
203  /// @param RotationalAxis The Axis to work with.
204  Real GetAngularLimitLowerOnAxis(int RotationalAxis) const;
205  /// @brief Get a specific upper rotational limit
206  /// @param RotationalAxis The Axis to work with.
207  /// @details This selects axis with
208  /// @return A real containing the specified upper limit
209  Real GetAngularLimitUpperOnAxis(int RotationalAxis) const;
210 
211  ////////////////////////////////////////////////////////////////////////////////
212  // Generic6DofConstraint Angular Limit and Motor Details
213 
214  /// @brief Convert to internal Axis IDs from external or internal axis IDs
215  /// @param Axis the Axis ID to be converted
216  /// @return A number that correlates toe corresponding internal Axis. For example Axis 4 is the Rotation Y. This would return the corresponding ID for the internal Rotation Y axis
217  /// @details Due to the way this is stored internally, All the axis are listed from from
218  /// 0 to 2. So rather than throw an exception(or have undefined behavior) if the Axis
219  /// selected one of those, this select the axis like this:
220  /// - 0, 3: Rotation X
221  /// - 1, 4: Rotation Y
222  /// - 2, 5: Rotation Z
223  /// @return A real containing the specified lower limit
224  inline virtual int AxisToAngularAxis(int Axis) const
225  { return (Axis%3); }
226 
227  /// @brief Set the Maximimum amount of force applied to ensure limits are not surpassed.
228  /// @param MaxLimitForces A Vector3 containing the X, Y and Z Maximium forces.
229  virtual void SetAngularLimitMaxForce(const Vector3& MaxLimitForces);
230  /// @brief Set the Maximimum amount of force applied to ensure a limit on one axis is not surpassed.
231  /// @param MaxLimitForce The new maximum force.
232  /// @param Axis The Angular Axis to be set, as per AxisToAngularAxis(int).
233  virtual void SetAngularLimitMaxForceOnAxis(Real MaxLimitForce, int Axis);
234  /// @brief Get the Maximimum amount of force applied to ensure limits are not surpassed.
235  /// @return A Vector3 with the forces on the X, Y and Z angular Axis.
236  virtual Vector3 GetAngularLimitMaxForce() const;
237  /// @brief Get the Maximimum amount of force applied to ensure a limit one axis is not surpassed.
238  /// @param Axis The Angular Axis to get, as per AxisToAngularAxis(int).
239  /// @return A Real with the force for the Given Axis.
240  virtual Real GetAngularLimitMaxForceOnAxis(int Axis) const;
241 
242  /// @brief Set the Target velocity of the motor on each anuglar axis.
243  /// @param Velocities A Vector3 containing the X, Y and Z Target Velocites.
244  virtual void SetAngularMotorTargetVelocity(const Vector3& Velocities);
245  /// @brief For one Axis, set the target velocity of the angular motor.
246  /// @param Velocity The new Target Velovity.
247  /// @param Axis The Angular Axis to be set, as per AxisToAngularAxis(int).
248  virtual void SetAngularMotorTargetVelocityOnAxis(Real Velocity, int Axis);
249  /// @brief Get the target velocity for all angular Axis
250  /// @return A Vector3 with the TAger Velocities on the X, Y and Z angular Axis.
251  virtual Vector3 GetAngularMotorTargetVelocity() const;
252  /// @brief Get the Target Velocity for one axis.
253  /// @param Axis The Angular Axis to get, as per AxisToAngularAxis(int).
254  /// @return A Real with the force for the Given Axis.
255  virtual Real GetAngularMotorTargetVelocityOnAxis(int Axis) const;
256 
257  /// @brief Set the Angular Motor Maximum force on all 3 rotational axis
258  /// @param Forces A Vector3 with the Max Motor Force for each axis.
259  virtual void SetAngularMotorMaxForce(const Vector3& Forces);
260  /// @brief For one Axis, set the Maximimum Motor Force.
261  /// @param Force The new Max motor force.
262  /// @param Axis The Angular Axis to be set, as per AxisToAngularAxis(int).
263  virtual void SetAngularMotorMaxForceOnAxis(Real Force, int Axis);
264  /// @brief Get the Max Motor Force for each Axis
265  /// @return A Vector3 with the max force on the X, Y and Z angular Axis.
266  virtual Vector3 GetAngularMotorMaxForce() const;
267  /// @brief Get the Max motor Force on a certain Axis.
268  /// @param Axis The Angular Axis to get, as per AxisToAngularAxis(int).
269  /// @return A Real with the Max Motor Force for the Given Axis.
270  virtual Real GetAngularMotorMaxForceOnAxis(int Axis) const;
271 
272  /// @brief Set the Angular Motor Damping for each Angular Axis.
273  /// @param Dampings A Vector3 with Damping value for the X, Y and Z axis.
274  virtual void SetAngularMotorDamping(const Vector3& Dampings);
275  /// @brief For one Axis, set the Damping.
276  /// @param Damping The new amount to Damp rotation on the given Axis.
277  /// @param Axis The Angular Axis to be set, as per AxisToAngularAxis(int).
278  virtual void SetAngularMotorDampingOnAxis(Real Damping, int Axis);
279  /// @brief Get the Damping for all Angular Axis.
280  /// @return A Vector3 with the forces on the X, Y and Z angular Axis.
281  virtual Vector3 GetAngularMotorDamping() const;
282  /// @brief Get the Damping for one given Axis.
283  /// @param Axis The Angular Axis to get, as per AxisToAngularAxis(int).
284  /// @return A Real with the XXX for the Given Axis.
285  virtual Real GetAngularMotorDampingOnAxis(int Axis) const;
286 
287  /// @brief Set the Bounciness/Restition for rotation on all three Axis
288  /// @param Restistutions A Vector3 containing all the New Bounciness values
289  virtual void SetAngularMotorRestitution(const Vector3& Restistutions);
290  /// @brief For one Axis, set the Restistution/Bounciness/
291  /// @param Restistution The new value for the given Axis.
292  /// @param Axis The Angular Axis to be set, as per AxisToAngularAxis(int).
293  virtual void SetAngularMotorRestitutionOnAxis(Real Restistution, int Axis);
294  /// @brief Get the Restistution values for all three axis
295  /// @return A Vector3 with the forces on the X, Y and Z angular Axis.
296  virtual Vector3 GetAngularMotorRestitution() const;
297  /// @brief Get the Restistution/Bounciness for a single Axis
298  /// @param Axis The Angular Axis to get, as per AxisToAngularAxis(int).
299  /// @return A Real with the Restistution for the Given Axis.
300  virtual Real GetAngularMotorRestitutionOnAxis(int Axis) const;
301 
302  /// @brief Set whether or not the motor is enabled for all Axis Simultaneously.
303  /// @param Enableds A Vector3 that will be interpretted as 3 true/false values where 0 is false and any other value it true.
304  virtual void SetAngularMotorEnabled(const Vector3& Enableds);
305  /// @brief For one Axis, set whether or not the motor is enabled
306  /// @param Enabled Is the motor enabled? TRue for yes, false for no.
307  /// @param Axis The Angular Axis to be set, as per AxisToAngularAxis(int).
308  virtual void SetAngularMotorEnabledOnAxis(bool Enabled, int Axis);
309  /// @brief Get a Vector3 with 3 zero or nonzero values that store whether or not a given rotational motor is enable.
310  /// @return A Vector3 with the forces on the X, Y and Z angular Axis.
311  virtual Vector3 GetAngularMotorEnabled() const;
312  /// @brief Is a specific rotational motor enabled.
313  /// @param Axis The Angular Axis to get, as per AxisToAngularAxis(int).
314  /// @return A bool that is true if the given Axis is enabled.
315  virtual bool GetAngularMotorEnabledOnAxis(int Axis) const;
316 
317  ////////////////////////////////////////////////////////////////////////////////
318  // Generic6DofConstraint Linear Limit and Motor Details
319 
320  /// @brief Set the Softness of the linear Limits
321  /// @param Softness How spongy, how much give does the constraint have.
322  virtual void SetLinearLimitSoftness(Real Softness);
323  /// @brief Get the Softness of the linear Limits
324  /// @return The Softness as a real.
325  virtual Real GetLinearLimitSoftness() const;
326 
327  /// @brief Set the Damping of the linear Limits
328  /// @param Damping The new damping value placed on forces the limits impose
329  virtual void SetLinearLimitDamping(Real Damping);
330  /// @brief Get the Damping of the linear Limits
331  /// @return The Damping as a real.
332  virtual Real GetLinearLimitDamping() const;
333 
334  /// @brief Set the Restitution of the linear Limits.
335  /// @param Restitution How bouncy are the limits.
336  virtual void SetLinearLimitRestitution(Real Restitution);
337  /// @brief Get the Restitution of the linear Limits.
338  /// @return The Restitution as a real.
339  virtual Real GetLinearLimitRestitution() const;
340 
341  /// @brief Set the Linear Motor Maximum force on all 3 translation axis
342  /// @param Forces A Vector3 with the Max Motor Force for each axis.
343  virtual void SetLinearMotorMaxForce(const Vector3& Forces);
344  /// @brief For one Axis, set the Maximimum Motor Force.
345  /// @param Force The new Max motor force.
346  /// @param Axis The Linear Axis to be set.
347  virtual void SetLinearMotorMaxForceOnAxis(Real Force, int Axis);
348  /// @brief Get the Max Motor Force for each Axis
349  /// @return A Vector3 with the max force on the X, Y and Z Linear Axis.
350  virtual Vector3 GetLinearMotorMaxForce() const;
351  /// @brief Get the Max motor Force on a certain Axis.
352  /// @param Axis The Linear Axis to get.
353  /// @return A Real with the Max Motor Force for the Given Axis.
354  virtual Real GetLinearMotorMaxForceOnAxis(int Axis) const;
355 
356  /// @brief Set the Target velocity of the motor on each anuglar axis.
357  /// @param Velocities A Vector3 containing the X, Y and Z Target Velocites.
358  virtual void SetLinearMotorTargetVelocity(const Vector3& Velocities);
359  /// @brief For one Axis, set the target velocity of the Linear motor.
360  /// @param Velocity The new Target Velovity.
361  /// @param Axis The Linear Axis to be set.
362  virtual void SetLinearMotorTargetVelocityOnAxis(Real Velocity, int Axis);
363  /// @brief Get the target velocity for all Linear Axis
364  /// @return A Vector3 with the Target Velocities on the X, Y and Z Linear Axis.
365  virtual Vector3 GetLinearMotorTargetVelocity() const;
366  /// @brief Get the Target Velocity for one axis.
367  /// @param Axis The Linear Axis to get.
368  /// @return A Real with the force for the Given Axis.
369  virtual Real GetLinearMotorTargetVelocityOnAxis(int Axis) const;
370 
371  /// @brief Set whether or not the motor is enabled for all Linear Axis Simultaneously.
372  /// @param Enableds A Vector3 that will be interpretted as 3 true/false values where 0 is false and any other value it true.
373  virtual void SetLinearMotorEnabled(const Vector3& Enableds);
374  /// @brief For one Axis, set whether or not the motor is enabled
375  /// @param Enabled Is the motor enabled? True for yes, false for no.
376  /// @param Axis The Linear Axis to be set.
377  virtual void SetLinearMotorEnabledOnAxis(bool Enabled, int Axis);
378  /// @brief Get a Vector3 with 3 zero or nonzero values that store whether or not a given rotational motor is enable.
379  /// @return A Vector3 with the forces on the X, Y and Z Linear Axis.
380  virtual Vector3 GetLinearMotorEnabled() const;
381  /// @brief Is a specific Linear motor enabled.
382  /// @param Axis The Linear Axis to get.
383  /// @return A bool that is true if the given Axis is enabled.
384  virtual bool GetLinearMotorEnabledOnAxis(int Axis) const;
385 
386  ////////////////////////////////////////////////////////////////////////////////
387  // Generic6DofConstraint Axis, Params and other Details
388 
389  /// @copydoc Constraint::ValidParamOnAxis(int) const
390  virtual Constraint::ParamList ValidParamOnAxis(int Axis) const;
391  /// @copydoc Constraint::ValidLinearAxis() const
392  virtual Constraint::AxisList ValidLinearAxis() const;
393  /// @copydoc Constraint::ValidAngularAxis() const
394  virtual Constraint::AxisList ValidAngularAxis() const;
395  /// @copydoc Constraint::ValidAngularAxis(ConstraintParam,int) const
396  virtual bool HasParamBeenSet(ConstraintParam Param, int Axis) const;
397 
398  /// @brief Retrieve the stored value from the physics subsystem(bullet)
399  /// @return a True or false.
400  virtual bool GetUseFrameOffset() const;
401  /// @brief Set the stored value for UseFrameOffset on this hinge in the physics subsystem(bullet)
402  /// @param FrameOffset The new desired value.
403  virtual void SetUseFrameOffset(bool FrameOffset);
404 
405  /// @copydoc Constraint::GetConstraintBase() const
406  virtual btTypedConstraint* GetConstraintBase() const;
407 
408  ///////////////////////////////////////////////////////////////////////////////
409  // Generic6DofConstraint Serialization
410 
411  /// @brief Convert this class to an XML::Node ready for serialization
412  /// @param CurrentRoot The point in the XML hierarchy that all this vectorw should be appended to.
413  virtual void ProtoSerialize(XML::Node& CurrentRoot) const;
414  /// @brief Take the data stored in an XML and overwrite this instance of this object with it
415  /// @param OneNode and XML::Node containing the data.
416  /// @warning A precondition of using this is that all of the actors intended for use must already be Deserialized.
417  virtual void ProtoDeSerialize(const XML::Node& OneNode);
418  /// @brief Get the name of the the XML tag this class will leave behind as its instances are serialized.
419  /// @return A string containing "Generic6DofConstraint"
420  static String SerializableName();
421  };//Generic6DofConstraint
422  }//Physics
423 }//Mezzanine
424 
425 ///////////////////////////////////////////////////////////////////////////////
426 // Class External << Operators for streaming or assignment
427 
428 /// @copydoc operator << (std::ostream& stream, const Mezzanine::Physics::Constraint& x)
429 std::ostream& MEZZ_LIB operator << (std::ostream& stream, const Mezzanine::Physics::Generic6DofConstraint& x);
430 /// @copydoc operator >> (std::istream& stream, Mezzanine::Physics::Constraint& x)
431 std::istream& MEZZ_LIB operator >> (std::istream& stream, Mezzanine::Physics::Generic6DofConstraint& x);
432 /// @copydoc operator >> (const Mezzanine::XML::Node& OneNode, Mezzanine::Physics::Constraint& x)
433 void operator >> (const Mezzanine::XML::Node& OneNode, Mezzanine::Physics::Generic6DofConstraint& x);
434 
435 #endif