#include "Vector3.hpp" #include "String.hpp" #include #include #include "Basis.hpp" namespace godot { Vector3::Vector3(real_t x, real_t y, real_t z) { this->x = x; this->y = y; this->z = z; } Vector3::Vector3() { this->x = 0; this->y = 0; this->z = 0; } Vector3::Vector3(const Vector3& b) { this->x = b.x; this->y = b.y; this->z = b.z; } const real_t& Vector3::operator[](int p_axis) const { return coord[p_axis]; } real_t& Vector3::operator[](int p_axis) { return coord[p_axis]; } Vector3& Vector3::operator+=(const Vector3& p_v) { x += p_v.x; y += p_v.y; z += p_v.z; return *this; } Vector3 Vector3::operator+(const Vector3& p_v) const { Vector3 v = *this; v += p_v; return v; } Vector3& Vector3::operator-=(const Vector3& p_v) { x -= p_v.x; y -= p_v.y; z -= p_v.z; return *this; } Vector3 Vector3::operator-(const Vector3& p_v) const { Vector3 v = *this; v -= p_v; return v; } Vector3& Vector3::operator*=(const Vector3& p_v) { x *= p_v.x; y *= p_v.y; z *= p_v.z; return *this; } Vector3 Vector3::operator*(const Vector3& p_v) const { Vector3 v = *this; v *= p_v; return v; } Vector3& Vector3::operator/=(const Vector3& p_v) { x /= p_v.x; y /= p_v.y; z /= p_v.z; return *this; } Vector3 Vector3::operator/(const Vector3& p_v) const { Vector3 v = *this; v /= p_v; return v; } Vector3& Vector3::operator*=(real_t p_scalar) { *this *= Vector3(p_scalar, p_scalar, p_scalar); return *this; } Vector3 Vector3::operator*(real_t p_scalar) const { Vector3 v = *this; v *= p_scalar; return v; } Vector3& Vector3::operator/=(real_t p_scalar) { *this /= Vector3(p_scalar, p_scalar, p_scalar); return *this; } Vector3 Vector3::operator/(real_t p_scalar) const { Vector3 v = *this; v /= p_scalar; return v; } Vector3 Vector3::operator-() const { return Vector3(-x, -y, -z); } bool Vector3::operator==(const Vector3& p_v) const { return (x==p_v.x && y==p_v.y && z==p_v.z); } bool Vector3::operator!=(const Vector3& p_v) const { return (x!=p_v.x || y!=p_v.y || z!=p_v.z); } bool Vector3::operator<(const Vector3& p_v) const { if (x==p_v.x) { if (y==p_v.y) return zdot(by) * 2.0; } Vector3 Vector3::rotated(const Vector3& axis, const real_t phi) const { Vector3 v = *this; v.rotate(axis, phi); return v; } void Vector3::rotate(const Vector3& p_axis,real_t p_phi) { *this=Basis(p_axis,p_phi).xform(*this); } Vector3 Vector3::slide(const Vector3& by) const { return by - *this * this->dot(by); } // this is ugly as well, but hey, I'm a simple man #define _ugly_stepify(val, step) (step != 0 ? ::floor(val / step + 0.5) * step : val) void Vector3::snap(real_t p_val) { x = _ugly_stepify(x,p_val); y = _ugly_stepify(y,p_val); z = _ugly_stepify(z,p_val); } #undef _ugly_stepify Vector3 Vector3::snapped(const float by) { Vector3 v = *this; v.snap(by); return v; } Vector3::operator String() const { return String(); // @Todo } }