//////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library // Copyright (C) 2007-2017 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. // // Permission is granted to anyone to use this software for any purpose, // including commercial applications, and to alter it and redistribute it freely, // subject to the following restrictions: // // 1. The origin of this software must not be misrepresented; // you must not claim that you wrote the original software. // If you use this software in a product, an acknowledgment // in the product documentation would be appreciated but is not required. // // 2. Altered source versions must be plainly marked as such, // and must not be misrepresented as being the original software. // // 3. This notice may not be removed or altered from any source distribution. // //////////////////////////////////////////////////////////// #ifndef SFML_VECTOR3_HPP #define SFML_VECTOR3_HPP namespace sf { //////////////////////////////////////////////////////////// /// \brief Utility template class for manipulating /// 3-dimensional vectors /// //////////////////////////////////////////////////////////// template class Vector3 { public: //////////////////////////////////////////////////////////// /// \brief Default constructor /// /// Creates a Vector3(0, 0, 0). /// //////////////////////////////////////////////////////////// Vector3(); //////////////////////////////////////////////////////////// /// \brief Construct the vector from its coordinates /// /// \param X X coordinate /// \param Y Y coordinate /// \param Z Z coordinate /// //////////////////////////////////////////////////////////// Vector3(T X, T Y, T Z); //////////////////////////////////////////////////////////// /// \brief Construct the vector from another type of vector /// /// This constructor doesn't replace the copy constructor, /// it's called only when U != T. /// A call to this constructor will fail to compile if U /// is not convertible to T. /// /// \param vector Vector to convert /// //////////////////////////////////////////////////////////// template explicit Vector3(const Vector3& vector); //////////////////////////////////////////////////////////// // Member data //////////////////////////////////////////////////////////// T x; ///< X coordinate of the vector T y; ///< Y coordinate of the vector T z; ///< Z coordinate of the vector }; //////////////////////////////////////////////////////////// /// \relates Vector3 /// \brief Overload of unary operator - /// /// \param left Vector to negate /// /// \return Memberwise opposite of the vector /// //////////////////////////////////////////////////////////// template Vector3 operator -(const Vector3& left); //////////////////////////////////////////////////////////// /// \relates Vector3 /// \brief Overload of binary operator += /// /// This operator performs a memberwise addition of both vectors, /// and assigns the result to \a left. /// /// \param left Left operand (a vector) /// \param right Right operand (a vector) /// /// \return Reference to \a left /// //////////////////////////////////////////////////////////// template Vector3& operator +=(Vector3& left, const Vector3& right); //////////////////////////////////////////////////////////// /// \relates Vector3 /// \brief Overload of binary operator -= /// /// This operator performs a memberwise subtraction of both vectors, /// and assigns the result to \a left. /// /// \param left Left operand (a vector) /// \param right Right operand (a vector) /// /// \return Reference to \a left /// //////////////////////////////////////////////////////////// template Vector3& operator -=(Vector3& left, const Vector3& right); //////////////////////////////////////////////////////////// /// \relates Vector3 /// \brief Overload of binary operator + /// /// \param left Left operand (a vector) /// \param right Right operand (a vector) /// /// \return Memberwise addition of both vectors /// //////////////////////////////////////////////////////////// template Vector3 operator +(const Vector3& left, const Vector3& right); //////////////////////////////////////////////////////////// /// \relates Vector3 /// \brief Overload of binary operator - /// /// \param left Left operand (a vector) /// \param right Right operand (a vector) /// /// \return Memberwise subtraction of both vectors /// //////////////////////////////////////////////////////////// template Vector3 operator -(const Vector3& left, const Vector3& right); //////////////////////////////////////////////////////////// /// \relates Vector3 /// \brief Overload of binary operator * /// /// \param left Left operand (a vector) /// \param right Right operand (a scalar value) /// /// \return Memberwise multiplication by \a right /// //////////////////////////////////////////////////////////// template Vector3 operator *(const Vector3& left, T right); //////////////////////////////////////////////////////////// /// \relates Vector3 /// \brief Overload of binary operator * /// /// \param left Left operand (a scalar value) /// \param right Right operand (a vector) /// /// \return Memberwise multiplication by \a left /// //////////////////////////////////////////////////////////// template Vector3 operator *(T left, const Vector3& right); //////////////////////////////////////////////////////////// /// \relates Vector3 /// \brief Overload of binary operator *= /// /// This operator performs a memberwise multiplication by \a right, /// and assigns the result to \a left. /// /// \param left Left operand (a vector) /// \param right Right operand (a scalar value) /// /// \return Reference to \a left /// //////////////////////////////////////////////////////////// template Vector3& operator *=(Vector3& left, T right); //////////////////////////////////////////////////////////// /// \relates Vector3 /// \brief Overload of binary operator / /// /// \param left Left operand (a vector) /// \param right Right operand (a scalar value) /// /// \return Memberwise division by \a right /// //////////////////////////////////////////////////////////// template Vector3 operator /(const Vector3& left, T right); //////////////////////////////////////////////////////////// /// \relates Vector3 /// \brief Overload of binary operator /= /// /// This operator performs a memberwise division by \a right, /// and assigns the result to \a left. /// /// \param left Left operand (a vector) /// \param right Right operand (a scalar value) /// /// \return Reference to \a left /// //////////////////////////////////////////////////////////// template Vector3& operator /=(Vector3& left, T right); //////////////////////////////////////////////////////////// /// \relates Vector3 /// \brief Overload of binary operator == /// /// This operator compares strict equality between two vectors. /// /// \param left Left operand (a vector) /// \param right Right operand (a vector) /// /// \return True if \a left is equal to \a right /// //////////////////////////////////////////////////////////// template bool operator ==(const Vector3& left, const Vector3& right); //////////////////////////////////////////////////////////// /// \relates Vector3 /// \brief Overload of binary operator != /// /// This operator compares strict difference between two vectors. /// /// \param left Left operand (a vector) /// \param right Right operand (a vector) /// /// \return True if \a left is not equal to \a right /// //////////////////////////////////////////////////////////// template bool operator !=(const Vector3& left, const Vector3& right); #include // Define the most common types typedef Vector3 Vector3i; typedef Vector3 Vector3f; } // namespace sf #endif // SFML_VECTOR3_HPP //////////////////////////////////////////////////////////// /// \class sf::Vector3 /// \ingroup system /// /// sf::Vector3 is a simple class that defines a mathematical /// vector with three coordinates (x, y and z). It can be used to /// represent anything that has three dimensions: a size, a point, /// a velocity, etc. /// /// The template parameter T is the type of the coordinates. It /// can be any type that supports arithmetic operations (+, -, /, *) /// and comparisons (==, !=), for example int or float. /// /// You generally don't have to care about the templated form (sf::Vector3), /// the most common specializations have special typedefs: /// \li sf::Vector3 is sf::Vector3f /// \li sf::Vector3 is sf::Vector3i /// /// The sf::Vector3 class has a small and simple interface, its x and y members /// can be accessed directly (there are no accessors like setX(), getX()) and it /// contains no mathematical function like dot product, cross product, length, etc. /// /// Usage example: /// \code /// sf::Vector3f v1(16.5f, 24.f, -8.2f); /// v1.x = 18.2f; /// float y = v1.y; /// float z = v1.z; /// /// sf::Vector3f v2 = v1 * 5.f; /// sf::Vector3f v3; /// v3 = v1 + v2; /// /// bool different = (v2 != v3); /// \endcode /// /// Note: for 2-dimensional vectors, see sf::Vector2. /// ////////////////////////////////////////////////////////////