//////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library // Copyright (C) 2007-2025 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. // //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// // Headers //////////////////////////////////////////////////////////// #include "../../SFML/System/Vector3.hpp" // NOLINT(misc-header-include-cycle) #include namespace sf { //////////////////////////////////////////////////////////// #if defined(__GNUC__) #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wshadow" #endif template constexpr Vector3::Vector3(T x, T y, T z) : x(x), y(y), z(z) { } #if defined(__GNUC__) #pragma GCC diagnostic pop #endif //////////////////////////////////////////////////////////// template template constexpr Vector3::operator Vector3() const { return Vector3(static_cast(x), static_cast(y), static_cast(z)); } //////////////////////////////////////////////////////////// template constexpr T Vector3::lengthSquared() const { return dot(*this); } //////////////////////////////////////////////////////////// template constexpr T Vector3::dot(const Vector3& rhs) const { return x * rhs.x + y * rhs.y + z * rhs.z; } //////////////////////////////////////////////////////////// template constexpr Vector3 Vector3::cross(const Vector3& rhs) const { return Vector3((y * rhs.z) - (z * rhs.y), (z * rhs.x) - (x * rhs.z), (x * rhs.y) - (y * rhs.x)); } //////////////////////////////////////////////////////////// template constexpr Vector3 Vector3::componentWiseMul(const Vector3& rhs) const { return Vector3(x * rhs.x, y * rhs.y, z * rhs.z); } //////////////////////////////////////////////////////////// template constexpr Vector3 Vector3::componentWiseDiv(const Vector3& rhs) const { assert(rhs.x != 0 && "Vector3::componentWiseDiv() cannot divide by 0"); assert(rhs.y != 0 && "Vector3::componentWiseDiv() cannot divide by 0"); assert(rhs.z != 0 && "Vector3::componentWiseDiv() cannot divide by 0"); return Vector3(x / rhs.x, y / rhs.y, z / rhs.z); } //////////////////////////////////////////////////////////// template constexpr Vector3 operator-(const Vector3& left) { return Vector3(-left.x, -left.y, -left.z); } //////////////////////////////////////////////////////////// template constexpr Vector3& operator+=(Vector3& left, const Vector3& right) { left.x += right.x; left.y += right.y; left.z += right.z; return left; } //////////////////////////////////////////////////////////// template constexpr Vector3& operator-=(Vector3& left, const Vector3& right) { left.x -= right.x; left.y -= right.y; left.z -= right.z; return left; } //////////////////////////////////////////////////////////// template constexpr Vector3 operator+(const Vector3& left, const Vector3& right) { return Vector3(left.x + right.x, left.y + right.y, left.z + right.z); } //////////////////////////////////////////////////////////// template constexpr Vector3 operator-(const Vector3& left, const Vector3& right) { return Vector3(left.x - right.x, left.y - right.y, left.z - right.z); } //////////////////////////////////////////////////////////// template constexpr Vector3 operator*(const Vector3& left, T right) { return Vector3(left.x * right, left.y * right, left.z * right); } //////////////////////////////////////////////////////////// template constexpr Vector3 operator*(T left, const Vector3& right) { return Vector3(right.x * left, right.y * left, right.z * left); } //////////////////////////////////////////////////////////// template constexpr Vector3& operator*=(Vector3& left, T right) { left.x *= right; left.y *= right; left.z *= right; return left; } //////////////////////////////////////////////////////////// template constexpr Vector3 operator/(const Vector3& left, T right) { assert(right != 0 && "Vector3::operator/ cannot divide by 0"); return Vector3(left.x / right, left.y / right, left.z / right); } //////////////////////////////////////////////////////////// template constexpr Vector3& operator/=(Vector3& left, T right) { assert(right != 0 && "Vector3::operator/= cannot divide by 0"); left.x /= right; left.y /= right; left.z /= right; return left; } //////////////////////////////////////////////////////////// template constexpr bool operator==(const Vector3& left, const Vector3& right) { return (left.x == right.x) && (left.y == right.y) && (left.z == right.z); } //////////////////////////////////////////////////////////// template constexpr bool operator!=(const Vector3& left, const Vector3& right) { return !(left == right); } } // namespace sf