|
@@ -30,29 +30,82 @@
|
|
|
|
|
|
#include <godot_cpp/variant/vector4.hpp>
|
|
#include <godot_cpp/variant/vector4.hpp>
|
|
|
|
|
|
-#include <godot_cpp/variant/basis.hpp>
|
|
|
|
|
|
+#include <godot_cpp/variant/string.hpp>
|
|
#include <godot_cpp/variant/vector4i.hpp>
|
|
#include <godot_cpp/variant/vector4i.hpp>
|
|
|
|
|
|
namespace godot {
|
|
namespace godot {
|
|
|
|
|
|
|
|
+Vector4::Axis Vector4::min_axis_index() const {
|
|
|
|
+ uint32_t min_index = 0;
|
|
|
|
+ real_t min_value = x;
|
|
|
|
+ for (uint32_t i = 1; i < 4; i++) {
|
|
|
|
+ if (operator[](i) <= min_value) {
|
|
|
|
+ min_index = i;
|
|
|
|
+ min_value = operator[](i);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ return Vector4::Axis(min_index);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+Vector4::Axis Vector4::max_axis_index() const {
|
|
|
|
+ uint32_t max_index = 0;
|
|
|
|
+ real_t max_value = x;
|
|
|
|
+ for (uint32_t i = 1; i < 4; i++) {
|
|
|
|
+ if (operator[](i) > max_value) {
|
|
|
|
+ max_index = i;
|
|
|
|
+ max_value = operator[](i);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ return Vector4::Axis(max_index);
|
|
|
|
+}
|
|
|
|
+
|
|
bool Vector4::is_equal_approx(const Vector4 &p_vec4) const {
|
|
bool Vector4::is_equal_approx(const Vector4 &p_vec4) const {
|
|
return Math::is_equal_approx(x, p_vec4.x) && Math::is_equal_approx(y, p_vec4.y) && Math::is_equal_approx(z, p_vec4.z) && Math::is_equal_approx(w, p_vec4.w);
|
|
return Math::is_equal_approx(x, p_vec4.x) && Math::is_equal_approx(y, p_vec4.y) && Math::is_equal_approx(z, p_vec4.z) && Math::is_equal_approx(w, p_vec4.w);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+bool Vector4::is_zero_approx() const {
|
|
|
|
+ return Math::is_zero_approx(x) && Math::is_zero_approx(y) && Math::is_zero_approx(z) && Math::is_zero_approx(w);
|
|
|
|
+}
|
|
|
|
+
|
|
real_t Vector4::length() const {
|
|
real_t Vector4::length() const {
|
|
return Math::sqrt(length_squared());
|
|
return Math::sqrt(length_squared());
|
|
}
|
|
}
|
|
|
|
|
|
void Vector4::normalize() {
|
|
void Vector4::normalize() {
|
|
- *this /= length();
|
|
|
|
|
|
+ real_t lengthsq = length_squared();
|
|
|
|
+ if (lengthsq == 0) {
|
|
|
|
+ x = y = z = w = 0;
|
|
|
|
+ } else {
|
|
|
|
+ real_t length = Math::sqrt(lengthsq);
|
|
|
|
+ x /= length;
|
|
|
|
+ y /= length;
|
|
|
|
+ z /= length;
|
|
|
|
+ w /= length;
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
|
|
Vector4 Vector4::normalized() const {
|
|
Vector4 Vector4::normalized() const {
|
|
- return *this / length();
|
|
|
|
|
|
+ Vector4 v = *this;
|
|
|
|
+ v.normalize();
|
|
|
|
+ return v;
|
|
}
|
|
}
|
|
|
|
|
|
bool Vector4::is_normalized() const {
|
|
bool Vector4::is_normalized() const {
|
|
- return Math::is_equal_approx(length_squared(), 1, (real_t)UNIT_EPSILON); // use less epsilon
|
|
|
|
|
|
+ return Math::is_equal_approx(length_squared(), (real_t)1, (real_t)UNIT_EPSILON);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+real_t Vector4::distance_to(const Vector4 &p_to) const {
|
|
|
|
+ return (p_to - *this).length();
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+real_t Vector4::distance_squared_to(const Vector4 &p_to) const {
|
|
|
|
+ return (p_to - *this).length_squared();
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+Vector4 Vector4::direction_to(const Vector4 &p_to) const {
|
|
|
|
+ Vector4 ret(p_to.x - x, p_to.y - y, p_to.z - z, p_to.w - w);
|
|
|
|
+ ret.normalize();
|
|
|
|
+ return ret;
|
|
}
|
|
}
|
|
|
|
|
|
Vector4 Vector4::abs() const {
|
|
Vector4 Vector4::abs() const {
|
|
@@ -75,10 +128,6 @@ Vector4 Vector4::round() const {
|
|
return Vector4(Math::round(x), Math::round(y), Math::round(z), Math::round(w));
|
|
return Vector4(Math::round(x), Math::round(y), Math::round(z), Math::round(w));
|
|
}
|
|
}
|
|
|
|
|
|
-Vector4 Vector4::inverse() const {
|
|
|
|
- return Vector4(1.0f / x, 1.0f / y, 1.0f / z, 1.0f / w);
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
Vector4 Vector4::lerp(const Vector4 &p_to, const real_t p_weight) const {
|
|
Vector4 Vector4::lerp(const Vector4 &p_to, const real_t p_weight) const {
|
|
return Vector4(
|
|
return Vector4(
|
|
x + (p_weight * (p_to.x - x)),
|
|
x + (p_weight * (p_to.x - x)),
|
|
@@ -87,28 +136,47 @@ Vector4 Vector4::lerp(const Vector4 &p_to, const real_t p_weight) const {
|
|
w + (p_weight * (p_to.w - w)));
|
|
w + (p_weight * (p_to.w - w)));
|
|
}
|
|
}
|
|
|
|
|
|
-Vector4::Axis Vector4::min_axis_index() const {
|
|
|
|
- uint32_t min_index = 0;
|
|
|
|
- real_t min_value = x;
|
|
|
|
- for (uint32_t i = 1; i < 4; i++) {
|
|
|
|
- if (operator[](i) < min_value) {
|
|
|
|
- min_index = i;
|
|
|
|
- min_value = operator[](i);
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- return Vector4::Axis(min_index);
|
|
|
|
|
|
+Vector4 Vector4::cubic_interpolate(const Vector4 &p_b, const Vector4 &p_pre_a, const Vector4 &p_post_b, const real_t p_weight) const {
|
|
|
|
+ Vector4 res = *this;
|
|
|
|
+ res.x = Math::cubic_interpolate(res.x, p_b.x, p_pre_a.x, p_post_b.x, p_weight);
|
|
|
|
+ res.y = Math::cubic_interpolate(res.y, p_b.y, p_pre_a.y, p_post_b.y, p_weight);
|
|
|
|
+ res.z = Math::cubic_interpolate(res.z, p_b.z, p_pre_a.z, p_post_b.z, p_weight);
|
|
|
|
+ res.w = Math::cubic_interpolate(res.w, p_b.w, p_pre_a.w, p_post_b.w, p_weight);
|
|
|
|
+ return res;
|
|
}
|
|
}
|
|
|
|
|
|
-Vector4::Axis Vector4::max_axis_index() const {
|
|
|
|
- uint32_t max_index = 0;
|
|
|
|
- real_t max_value = x;
|
|
|
|
- for (uint32_t i = 1; i < 4; i++) {
|
|
|
|
- if (operator[](i) > max_value) {
|
|
|
|
- max_index = i;
|
|
|
|
- max_value = operator[](i);
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- return Vector4::Axis(max_index);
|
|
|
|
|
|
+Vector4 Vector4::cubic_interpolate_in_time(const Vector4 &p_b, const Vector4 &p_pre_a, const Vector4 &p_post_b, const real_t p_weight, const real_t &p_b_t, const real_t &p_pre_a_t, const real_t &p_post_b_t) const {
|
|
|
|
+ Vector4 res = *this;
|
|
|
|
+ res.x = Math::cubic_interpolate_in_time(res.x, p_b.x, p_pre_a.x, p_post_b.x, p_weight, p_b_t, p_pre_a_t, p_post_b_t);
|
|
|
|
+ res.y = Math::cubic_interpolate_in_time(res.y, p_b.y, p_pre_a.y, p_post_b.y, p_weight, p_b_t, p_pre_a_t, p_post_b_t);
|
|
|
|
+ res.z = Math::cubic_interpolate_in_time(res.z, p_b.z, p_pre_a.z, p_post_b.z, p_weight, p_b_t, p_pre_a_t, p_post_b_t);
|
|
|
|
+ res.w = Math::cubic_interpolate_in_time(res.w, p_b.w, p_pre_a.w, p_post_b.w, p_weight, p_b_t, p_pre_a_t, p_post_b_t);
|
|
|
|
+ return res;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+Vector4 Vector4::posmod(const real_t p_mod) const {
|
|
|
|
+ return Vector4(Math::fposmod(x, p_mod), Math::fposmod(y, p_mod), Math::fposmod(z, p_mod), Math::fposmod(w, p_mod));
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+Vector4 Vector4::posmodv(const Vector4 &p_modv) const {
|
|
|
|
+ return Vector4(Math::fposmod(x, p_modv.x), Math::fposmod(y, p_modv.y), Math::fposmod(z, p_modv.z), Math::fposmod(w, p_modv.w));
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+void Vector4::snap(const Vector4 &p_step) {
|
|
|
|
+ x = Math::snapped(x, p_step.x);
|
|
|
|
+ y = Math::snapped(y, p_step.y);
|
|
|
|
+ z = Math::snapped(z, p_step.z);
|
|
|
|
+ w = Math::snapped(w, p_step.w);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+Vector4 Vector4::snapped(const Vector4 &p_step) const {
|
|
|
|
+ Vector4 v = *this;
|
|
|
|
+ v.snap(p_step);
|
|
|
|
+ return v;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+Vector4 Vector4::inverse() const {
|
|
|
|
+ return Vector4(1.0f / x, 1.0f / y, 1.0f / z, 1.0f / w);
|
|
}
|
|
}
|
|
|
|
|
|
Vector4 Vector4::clamp(const Vector4 &p_min, const Vector4 &p_max) const {
|
|
Vector4 Vector4::clamp(const Vector4 &p_min, const Vector4 &p_max) const {
|
|
@@ -123,4 +191,6 @@ Vector4::operator String() const {
|
|
return "(" + String::num_real(x, false) + ", " + String::num_real(y, false) + ", " + String::num_real(z, false) + ", " + String::num_real(w, false) + ")";
|
|
return "(" + String::num_real(x, false) + ", " + String::num_real(y, false) + ", " + String::num_real(z, false) + ", " + String::num_real(w, false) + ")";
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+static_assert(sizeof(Vector4) == 4 * sizeof(real_t));
|
|
|
|
+
|
|
} // namespace godot
|
|
} // namespace godot
|