Spinning Topp Logo BlackTopp Studios
inc
vector2.h
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 _vector2_h
41 #define _vector2_h
42 
43 #include "crossplatformexport.h"
44 #include "datatypes.h"
45 #ifndef SWIG
46  #include "XML/xml.h"
47  #include <limits>
48 #endif
49 
50 namespace Ogre
51 {
52  class Vector2;
53 }
54 
55 namespace Mezzanine
56 {
57  ///////////////////////////////////////////////////////////////////////////////
58  /// @brief This is used to represent a point on a 2 dimentional area, such as a screen.
59  /// @details This contains an X and Y value used to represent coordinates.
60  /// This also has a number of facilities to make converting to graphics subsystems
61  /// as easy as possible.
62  ///////////////////////////////////////
64  {
65  public:
66  /// @brief Coordinate on the X vector.
68  /// @brief Coordinate on the Y vector.
70 
71  /// @brief Default Constructor.
72  Vector2();
73  /// @brief Single Real value Constructor.
74  /// @param xy Value to set both x and y to.
75  explicit Vector2(const Real& xy);
76  /// @brief Real value Constructor.
77  /// @param x Coordinate on the X vector.
78  /// @param y Coordinate on the Y vector.
79  Vector2(const Real& x, const Real& y);
80  /// @brief Ogre Value Constructor.
81  /// @param Vec The vector to be copied to make this vector.
82  Vector2(const Ogre::Vector2& Vec);
83 
84  /// @brief Gets a Ogre vector2.
85  /// @return Returns an Ogre Vector2 with the same values as this.
86  Ogre::Vector2 GetOgreVector2() const;
87  /// @brief Copies an existing Ogre vector2.
88  /// @param Thiers The vector2 to be extracted.
89  void ExtractOgreVector2(const Ogre::Vector2& Thiers);
90 
91  ///////////////////////////////////////////////////////////////////////////////
92  // Prebuilt Vectors
93 
94  /// @brief Gets a vector representing the X unit of a Vector2.
95  /// @return A Vector2(1,0).
96  static Vector2 Unit_X();
97  /// @brief Gets a vector representing the Y unit of a Vector2.
98  /// @return A Vector2(0,1).
99  static Vector2 Unit_Y();
100  /// @brief Gets a vector representing the negative X unit of a Vector2.
101  /// @return A Vector2(-1,0).
102  static Vector2 Neg_Unit_X();
103  /// @brief Gets a vector representing the negative Y unit of a Vector2.
104  /// @return A Vector2(0,-1).
105  static Vector2 Neg_Unit_Y();
106 
107  ///////////////////////////////////////////////////////////////////////////////
108  // Utility
109 
110  /// @brief Sets the values of this vector2 to identity values(0,0).
111  void SetIdentity();
112  /// @brief Sets the X and Y values of this vector2.
113  /// @param x The real that will have this vector's X member set to.
114  /// @param y The real that will have this vector's Y member set to.
115  void SetValues(const Real& x, const Real& y);
116  /// @brief Checks to see if the values of this vector are all zero.
117  /// @return Returns true if all components of this vector are zero, false otherwise.
118  Boole IsZero() const;
119 
120  ///////////////////////////////////////////////////////////////////////////////
121  // Equality Comparison operators
122 
123  /// @brief Equality Comparison Operator.
124  /// @param Vec2 This is the other Mezzanine::Vector2 to compare with.
125  /// @return Returns true if X==X and Y==Y, otherwise returns false.
126  Boole operator==(const Mezzanine::Vector2& Vec2) const;
127  /// @brief Equality Comparison Operator.
128  /// @param Vec2 This is the other Mezzanine::Vector2.
129  /// @return Returns true if X!=X or Y!=Y, otherwise returns false.
130  Boole operator!=(const Mezzanine::Vector2& Vec2) const;
131  /// @brief Equality Comparison Operator.
132  /// @param Vec2 This is the other Ogre::Vector2.
133  /// @return Returns true if X==X and Y==Y, otherwise returns false.
134  Boole operator==(const Ogre::Vector2& Vec2) const;
135  /// @brief Equality Comparison Operator.
136  /// @param Vec2 This is the other Ogre::Vector2.
137  /// @return Returns true if X!=X or Y!=Y, otherwise returns false.
138  Boole operator!=(const Ogre::Vector2& Vec2) const;
139 
140  /// @brief Less or Equal Comparison Operator.
141  /// @details Returns true if X<=X and Y<=Y. If any of those do not hold this returns false.
142  /// @param Vec This is the other Mezzanine::Vector2.
143  /// @note Used primarily for testing. This is not implement for use with other kinds of Vector3 implementations as it is widely considered useless.
144  Boole operator<= (const Mezzanine::Vector2 &Vec) const;
145  /// @brief Greater than or Equal Comparison Operator.
146  /// @details Returns true if X>=X and Y>=Y . If any of those do not hold this returns false.
147  /// @param Vec This is the other Mezzanine::Vector2.
148  /// @note Used primarily for testing. This is not implement for use with other kinds of Vector3 implementations as it is widely considered useless.
149  Boole operator>= (const Mezzanine::Vector2 &Vec) const;
150 
151  ///////////////////////////////////////////////////////////////////////////////
152  // Unary Operators
153 
154  /// @brief Unary Operator.
155  /// @return Returns a copy of this Vector2 with the +/- signs on each value flipped.
157 
158  ///////////////////////////////////////////////////////////////////////////////
159  // Vector2 Arithmetic with Real
160 
161  /// @brief Scaling by multiplication.
162  /// @return This returns a Vector2 that has been scaled.
163  /// @param scalar This is the amount to scale the Vector2 by.
164  Vector2 operator* (const Real& scalar) const;
165  /// @brief Scaling by Division.
166  /// @return This returns a Vector2 that has been scaled.
167  /// @param scalar This is the amount to scale the Vector2 by.
168  Vector2 operator/ (const Real& scalar) const;
169 
170  ///////////////////////////////////////////////////////////////////////////////
171  // Vector2 Arithmetic and assignment with Real
172 
173  /// @brief Scaling by multiplication.
174  /// @param scalar This is the amount to scale the Vector2 by.
175  /// @return Returns a reference to this.
176  Vector2& operator*= (const Real& scalar);
177  /// @brief Scaling by Division.
178  /// @param scalar This is the amount to scale the Vector2 by.
179  /// @return Returns a reference to this.
180  Vector2& operator/= (const Real& scalar);
181 
182  ///////////////////////////////////////////////////////////////////////////////
183  // Arithmetic Operators
184 
185  /// @brief Addition Operator.
186  /// @param Vec2 The other Vector2 to add to this.
187  /// @return Returns a new Vector2 that is the result of this operation.
188  Vector2 operator+ (const Vector2& Vec2) const;
189  /// @brief Subraction Operator.
190  /// @param Vec2 The other Vector2 to subtract from this.
191  /// @return Returns a new Vector2 that is the result of this operation.
192  Vector2 operator- (const Vector2& Vec2) const;
193  /// @brief Multiplaction Operator.
194  /// @param Vec2 The other Vector2 to multiply by this.
195  /// @return Returns a new Vector2 that is the result of this operation.
196  Vector2 operator* (const Vector2& Vec2) const;
197  /// @brief Division Operator.
198  /// @param Vec2 The other Vector2 to divide by.
199  /// @return Returns a new Vector2 that is the result of this operation.
200  Vector2 operator/ (const Vector2& Vec2) const;
201 
202  /// @brief Addition assignment Operator.
203  /// @param Vec2 The other Vector2 to add to this.
204  /// @return Returns a reference to this.
205  Vector2& operator+= (const Vector2& Vec2);
206  /// @brief Subraction assignment Operator.
207  /// @param Vec2 The other Vector2 to subtract from this.
208  /// @return Returns a reference to this.
209  Vector2& operator-= (const Vector2& Vec2);
210  /// @brief Multiplaction assignment Operator.
211  /// @param Vec2 The other Vector2 to multiply by this.
212  /// @return Returns a reference to this.
213  Vector2& operator*= (const Vector2& Vec2);
214  /// @brief Division assignment Operator.
215  /// @param Vec2 The other Vector2 to divide by.
216  /// @return Returns a reference to this.
217  Vector2& operator/= (const Vector2& Vec2);
218 
219  ///////////////////////////////////////////////////////////////////////////////
220  // Fancy Math
221 
222  /// @brief This is used to calculate the crossproduct of this and another vector.
223  /// @param Other the Vector to work with to create the cross product.
224  /// @return A Real containing crossproduct of this vector and Vec.
225  Real CrossProduct(const Vector2& Other) const;
226  /// @brief This is used to calculate the dotproduct of this and another vector.
227  /// @param Other The vector to work with to create the cross product.
228  /// @return This is the dotproduct of this vector and vec.
229  Real DotProduct(const Vector2& Other) const;
230  /// @brief Gets the distance between this and another vector.
231  /// @param Other This is the other point to measure the distance to.
232  /// @return Returns a Real representing the distance.
233  Real Distance(const Vector2& Other) const;
234  /// @brief Gets the squared distance between this and another vector.
235  /// @param Other This is the other point to measure the distance to.
236  /// @return Returns a Real representing the distance squared.
237  Real SquaredDistance(const Vector2& Other) const;
238  /// @brief Gets the length of this vector.
239  /// @return Returns a real representing the length of this vector.
240  Real Length() const;
241  /// @brief Gets the length of this vector squared.
242  /// @return Returns a real representing the squared length of this vector.
243  Real SquaredLength() const;
244  /// @brief Generates a Vector2 that is perpendicular to this vector.
245  /// @return Returns a new Vector2 that is perpendicular to this.
246  Vector2 Perpendicular() const;
247  /// @brief Gets a reflection vector to the line with the given normal.
248  /// @param Normal The normal of the line being reflected off of.
249  /// @return Returns a Vector3 containing the reflection vector.
250  Vector2 Reflect(const Vector2& Normal) const;
251  /// @brief Normalizes this Vector2.
252  /// @return Returns a reference to this.
253  Vector2& Normalize();
254  /// @brief Gets the normal of this Vector2.
255  /// @return Returns a new Vector2 that is a normalized copy of this Vector2.
256  Vector2 GetNormal() const;
257 
258  /// @brief Gets an oriented angle between this Vector2 and another Vector2.
259  /// @note This method assumes both Vector2s are axis vectors.
260  /// @param Other The other Vector2 to compare with.
261  /// @return Returns the angle between both Vector2s in radians in the range of 0pi-2pi.
262  Real AngleTo(const Vector2& Other) const;
263  /// @brief Gets the angle between this Vector2 and another.
264  /// @note This method assumes both Vector2s are axis vectors.
265  /// @param Other The other Vector2 to compare with.
266  /// @return Returns the angle between both Vector2s in radians.
267  Real AngleBetween(const Vector2& Other) const;
268 
269  ///////////////////////////////////////////////////////////////////////////////
270  // Serialization
271 
272  /// @brief Convert this class to an XML::Node ready for serialization
273  /// @param CurrentRoot The point in the XML hierarchy that all this vector2 should be appended to.
274  void ProtoSerialize(XML::Node& CurrentRoot) const;
275  /// @brief Take the data stored in an XML and overwrite this instance of this object with it
276  /// @param OneNode and XML::Node containing the data.
277  void ProtoDeSerialize(const XML::Node& OneNode);
278 
279  /// @brief Get the name of the the XML tag this class will leave behind as its instances are serialized.
280  /// @return A string containing "Vector2"
281  static String GetSerializableName();
282  };//Vector2
283 
284  ///////////////////////////////////////////////////////////////////////////////
285  /// @brief A compare fuctor that uses vector length.
286  /// @details
287  ///////////////////////////////////////
289  {
290  public:
291  /// @brief Compares two Vector2's to determine which has the greater length/magnitude.
292  /// @param First The first Vector2 to compare with.
293  /// @param Second The second Vector2 to compare with.
294  /// @return Returns true if the first Vector2 has a smaller length/magnitude than the second, false otherwise.
295  Boole operator()(const Vector2& First, const Vector2& Second) const;
296  };//Vector2LengthCompare
297 }//Mezzanine
298 
299 // We can skip these operators when creating bindings with swig
300 #ifndef SWIG
301 
302 /// @brief Used to Serialize an Mezzanine::Vector2 to a human readable stream
303 /// @details Sends proper XML to the output stream,
304 /// including versioning information which will be used to maintain backwards compatibility. The current XML format
305 /// will create one element with no sub-elements. The name of the xml node will be "Vector2". It will have 3 attributes.
306 /// "Version", will be set to a value of 1, indicating if came from version 1 compatible Vector2. It will also have an "X" and "Y"
307 /// attributes with values set appropriately. For example '<Vector2 Version="1" X="1" Y="2" />'.
308 /// @param x The Mezzanine::Vector2 to be converted to a stream of characters.
309 /// @param stream The place to send the characters, that define the Mezzanine::Vector2.
310 /// @return Get an std::ostream that was written to, this allow chaining of the << operators.
311 std::ostream& MEZZ_LIB operator << (std::ostream& stream, const Mezzanine::Vector2& x);
312 
313 /// @brief Used to de-serialize an Mezzanine::Vector2 from a stream
314 /// @details This reads in the xml and sets the target vector according to values from the stream.
315 /// @param Vec The Mezzanine::Vector2 that will accept the values from the xml
316 /// @param stream The place to get the characters from, that define the Mezzanine::Vector2.
317 /// @return Get an std::ostream that was read from, this allow chaining of the >> operators.
318 /// @throw Can throw any exception that any function in the Mezzanine::xml namespace could throw in addition to a Mezzanine::Exception if the serialization version doesn't match.
319 std::istream& MEZZ_LIB operator >> (std::istream& stream, Mezzanine::Vector2& Vec);
320 
321 /// @brief Converts an XML node into a Mezzanine::Vector2
322 /// @details This will convert an XML::Node will a valid serialized Mezzanine::Vector2 into a Mezzanine::Vector2
323 /// @param OneNode An XML Node containing the the text of a Vector2
324 /// @param Vec the Mezzanine::Vector2 to store the deserialized Vector2
325 /// @return This returns a reference to the XML::Node for operator chaining or whatever.
326 /// @throw Can throw any exception that any function in the Mezzanine::xml namespace could throw in addition to a Mezzanine::Exception if the serialization version doesn't match.
328 
329 #endif // \SWIG
330 
331 namespace std
332 {
333  #ifndef SWIG
334  /// @brief Get Numeric details on Vector2
335  template<>
336  class numeric_limits<Mezzanine::Vector2>
337  {
338  public:
339  /// @brief Does this class (numeric_limits<Mezzanine::Vector2>) exist
340  static const bool is_specialized = true;
341  /// @brief Does this support negative values?
342  static const bool is_signed = true;
343  /// @brief Can this only store integer types.
344  static const bool is_integer = false;
345  /// @brief The Vector2 uses Real, which is typically a machine dependedant which can be inexact
346  static const bool is_exact = std::numeric_limits<Mezzanine::Real>::is_exact;
347  /// @brief Can This represent an infinitely large value in X, Y or Z?
348  static const bool has_infinity = std::numeric_limits<Mezzanine::Real>::has_infinity;
349  /// @brief ??? Required by std::numeric to be compliant
350  /// @todo Learn why this exists and document it.
351  static const bool has_quiet_NaN = std::numeric_limits<Mezzanine::Real>::has_quiet_NaN;
352  /// @brief ??? Required by std::numeric to be compliant
353  /// @todo Learn why this exists and document it.
354  static const bool has_signaling_NaN = std::numeric_limits<Mezzanine::Real>::has_signaling_NaN;
355  /// @brief Does this support exceptionally small numbers near 0?
356  static const std::float_denorm_style has_denorm = std::numeric_limits<Mezzanine::Real>::has_denorm;
357  /// @brief When extra precision near 0 is lost, can this type distinguish that from other imprecision.
358  static const bool has_denorm_loss = std::numeric_limits<Mezzanine::Real>::has_denorm_loss;
359  /// @brief How items that fit between the precise amount a Real can represent will be adapted.
360  static const std::float_round_style round_style = std::numeric_limits<Mezzanine::Real>::round_style;
361  /// @brief Do X, Y and Z adhere to iec 559?
362  static const bool is_iec559 = std::numeric_limits<Mezzanine::Real>::is_iec559;
363  /// @brief Is overflow of this type handle by modulo overflow?
364  static const bool is_modulo = std::numeric_limits<Mezzanine::Real>::is_modulo;
365  /// @brief How many integer digits(in machine base) of precision can this handle in each X, Y or Z without floating point component or error?
366  static const int digits = std::numeric_limits<Mezzanine::Real>::digits;
367  /// @brief How many integer digits in base 10 of precision can this handle in each X, Y or Z without floating point component or error?
368  static const int digits10 = std::numeric_limits<Mezzanine::Real>::digits10;
369  /// @brief The base of the number system that this is implemented in
370  static const int radix = std::numeric_limits<Mezzanine::Real>::radix;
371  /// @brief The smallest power of the radix that is valid floating point value
372  static const int min_exponent = std::numeric_limits<Mezzanine::Real>::min_exponent;
373  /// @brief The smallest power of 10 that is valid floating point value
374  static const int min_exponent10 = std::numeric_limits<Mezzanine::Real>::min_exponent10;
375  /// @brief The largest power of the radix that is valid floating point value
376  static const int max_exponent = std::numeric_limits<Mezzanine::Real>::max_exponent;
377  /// @brief The largest power of 10 that is valid floating point value
378  static const int max_exponent10 = std::numeric_limits<Mezzanine::Real>::max_exponent10;
379  /// @brief Can this generate a trap?
380  static const bool traps = std::numeric_limits<Mezzanine::Real>::traps;
381  /// @brief Are tiny values respected during rounding?
382  static const bool tinyness_before = std::numeric_limits<Mezzanine::Real>::tinyness_before;
383 
384  /// @brief Get the lowest positive finite value this can represent
385  /// @return A vector with 2 very small numbers
387  {
388  return Mezzanine::Vector2(std::numeric_limits<Mezzanine::Real>::min(),
389  std::numeric_limits<Mezzanine::Real>::min()
390  );
391  }
392 
393  /// @brief Get the highest positive finite value this can represent
394  /// @return A vector with 2 very large numbers
396  {
397  return Mezzanine::Vector2(std::numeric_limits<Mezzanine::Real>::max(),
398  std::numeric_limits<Mezzanine::Real>::max()
399  );
400  }
401 
402  /// @brief The smallest value representable from 1.0,1.0 to the next value
403  /// @return A vector with a very small number
405  {
406  return Mezzanine::Vector2(std::numeric_limits<Mezzanine::Real>::epsilon(),
407  std::numeric_limits<Mezzanine::Real>::epsilon()
408  );
409  }
410 
411  /// @brief Get the largest possible rounding error
412  /// @return A vector containing 2 values indicating how much they could be rounded.
414  {
415  return Mezzanine::Vector2(std::numeric_limits<Mezzanine::Real>::round_error(),
416  std::numeric_limits<Mezzanine::Real>::round_error()
417  );
418  }
419 
420  /// @brief Get the special value "Positive infinity"
421  /// @return A vector containing 2 values.
423  {
424  return Mezzanine::Vector2(std::numeric_limits<Mezzanine::Real>::infinity(),
425  std::numeric_limits<Mezzanine::Real>::infinity()
426  );
427  }
428 
429  /// @brief Get the special value "Quiet Not actual Number"
430  /// @return A vector containing 2 values.
432  {
433  return Mezzanine::Vector2(std::numeric_limits<Mezzanine::Real>::quiet_NaN(),
434  std::numeric_limits<Mezzanine::Real>::quiet_NaN()
435  );
436  }
437 
438  /// @brief Get the special value "Signaling Not actual Number"
439  /// @return A vector containing 2 values.
441  {
442  return Mezzanine::Vector2(std::numeric_limits<Mezzanine::Real>::signaling_NaN(),
443  std::numeric_limits<Mezzanine::Real>::signaling_NaN()
444  );
445  }
446 
447  /// @brief Get the closest value to 0 that is not 0 this can represent, including extra precision for being close to 0 if supported.
448  /// @return A vector containing 2 very small values.
450  {
451  return Mezzanine::Vector2(std::numeric_limits<Mezzanine::Real>::denorm_min(),
452  std::numeric_limits<Mezzanine::Real>::denorm_min()
453  );
454  }
455  }; //Numeric Limits
456  #endif //SWIG
457 
458 } // std
459 
460 
461 
462 #endif
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
static Mezzanine::Vector2 signaling_NaN()
Get the special value "Signaling Not actual Number".
Definition: vector2.h:440
bool Boole
Generally acts a single bit, true or false.
Definition: datatypes.h:173
This file is used on some platforms to determine what data should be read and written to and from a s...
static Mezzanine::Vector2 quiet_NaN()
Get the special value "Quiet Not actual Number".
Definition: vector2.h:431
static Mezzanine::Vector2 infinity()
Get the special value "Positive infinity".
Definition: vector2.h:422
static Mezzanine::Vector2 denorm_min()
Get the closest value to 0 that is not 0 this can represent, including extra precision for being clos...
Definition: vector2.h:449
All the definitions for datatypes as well as some basic conversion functions are defined here...
STL namespace.
SmoothTrackIterator< InterpolatableType > & operator+(Integer Steps, SmoothTrackIterator< InterpolatableType > &Iter)
This allows for addition with and an Integer on the Left hand side, such as: 2 + Iter.
Mezzanine::Vector3 operator/(const btVector3 &Vec, const Mezzanine::Vector3 &lhs)
Right Hand Division Operator for Bullet Vectors with a Mezzanine::Vector3.
Definition: vector3.cpp:653
static Mezzanine::Vector2 max()
Get the highest positive finite value this can represent.
Definition: vector2.h:395
float Real
A Datatype used to represent a real floating point number.
Definition: datatypes.h:141
Real Y
Coordinate on the Y vector.
Definition: vector2.h:69
SmoothTrackIterator< InterpolatableType > & operator-(Integer Steps, SmoothTrackIterator< InterpolatableType > &Iter)
This allows for subtraction with and an Integer on the Left hand side, such as: 2 + Iter...
A light-weight handle for manipulating nodes in DOM tree.
Definition: node.h:89
Mezzanine::Vector3 operator*(const btVector3 &Vec, const Mezzanine::Vector3 &lhs)
Right Hand Multiplication Operator for Bullet Vectors with a Mezzanine::Vector3.
Definition: vector3.cpp:651
Real X
Coordinate on the X vector.
Definition: vector2.h:67
This is used to represent a point on a 2 dimentional area, such as a screen.
Definition: vector2.h:63
static Mezzanine::Vector2 epsilon()
The smallest value representable from 1.0,1.0 to the next value.
Definition: vector2.h:404
static Mezzanine::Vector2 round_error()
Get the largest possible rounding error.
Definition: vector2.h:413
#define MEZZ_LIB
Some platforms require special decorations to denote what is exported/imported in a share library...
The bulk of the engine components go in this namspace.
Definition: actor.cpp:56
std::istream & operator>>(std::istream &stream, Mezzanine::LinearInterpolator< T > &Lint)
Used to de-serialize an Mezzanine::LinearInterpolator from a stream.
Definition: interpolator.h:448
static Mezzanine::Vector2 min()
Get the lowest positive finite value this can represent.
Definition: vector2.h:386
A compare fuctor that uses vector length.
Definition: vector2.h:288
std::string String
A datatype used to a series of characters.
Definition: datatypes.h:159