commit
c2ec46f64a
|
@ -133,6 +133,19 @@ public:
|
||||||
|
|
||||||
void sort_custom(Object *obj, const String &func);
|
void sort_custom(Object *obj, const String &func);
|
||||||
|
|
||||||
|
int bsearch(const Variant &value, const bool before = true);
|
||||||
|
|
||||||
|
int bsearch_custom(const Variant &value, const Object *obj,
|
||||||
|
const String &func, const bool before = true);
|
||||||
|
|
||||||
|
Array duplicate(const bool deep = false) const;
|
||||||
|
|
||||||
|
Variant max() const;
|
||||||
|
|
||||||
|
Variant min() const;
|
||||||
|
|
||||||
|
void shuffle();
|
||||||
|
|
||||||
~Array();
|
~Array();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -348,6 +348,8 @@ public:
|
||||||
|
|
||||||
Vector3 get_scale() const;
|
Vector3 get_scale() const;
|
||||||
|
|
||||||
|
Basis slerp(Basis b, float t) const;
|
||||||
|
|
||||||
Vector3 get_euler_xyz() const;
|
Vector3 get_euler_xyz() const;
|
||||||
void set_euler_xyz(const Vector3 &p_euler);
|
void set_euler_xyz(const Vector3 &p_euler);
|
||||||
Vector3 get_euler_yxz() const;
|
Vector3 get_euler_yxz() const;
|
||||||
|
|
|
@ -32,8 +32,26 @@ public:
|
||||||
|
|
||||||
uint32_t to_ARGB32() const;
|
uint32_t to_ARGB32() const;
|
||||||
|
|
||||||
|
uint32_t to_ABGR32() const;
|
||||||
|
|
||||||
|
uint64_t to_ABGR64() const;
|
||||||
|
|
||||||
|
uint64_t to_ARGB64() const;
|
||||||
|
|
||||||
|
uint32_t to_RGBA32() const;
|
||||||
|
|
||||||
|
uint64_t to_RGBA64() const;
|
||||||
|
|
||||||
float gray() const;
|
float gray() const;
|
||||||
|
|
||||||
|
uint8_t get_r8() const;
|
||||||
|
|
||||||
|
uint8_t get_g8() const;
|
||||||
|
|
||||||
|
uint8_t get_b8() const;
|
||||||
|
|
||||||
|
uint8_t get_a8() const;
|
||||||
|
|
||||||
float get_h() const;
|
float get_h() const;
|
||||||
|
|
||||||
float get_s() const;
|
float get_s() const;
|
||||||
|
@ -42,6 +60,12 @@ public:
|
||||||
|
|
||||||
void set_hsv(float p_h, float p_s, float p_v, float p_alpha = 1.0);
|
void set_hsv(float p_h, float p_s, float p_v, float p_alpha = 1.0);
|
||||||
|
|
||||||
|
Color darkened(const float amount) const;
|
||||||
|
|
||||||
|
Color lightened(const float amount) const;
|
||||||
|
|
||||||
|
Color from_hsv(float p_h, float p_s, float p_v, float p_a = 1.0) const;
|
||||||
|
|
||||||
inline float &operator[](int idx) {
|
inline float &operator[](int idx) {
|
||||||
return components[idx];
|
return components[idx];
|
||||||
}
|
}
|
||||||
|
|
|
@ -8,6 +8,7 @@
|
||||||
namespace godot {
|
namespace godot {
|
||||||
|
|
||||||
extern "C" const godot_gdnative_core_api_struct *api;
|
extern "C" const godot_gdnative_core_api_struct *api;
|
||||||
|
extern "C" const godot_gdnative_core_1_1_api_struct *core_1_1_api;
|
||||||
extern "C" const godot_gdnative_ext_nativescript_api_struct *nativescript_api;
|
extern "C" const godot_gdnative_ext_nativescript_api_struct *nativescript_api;
|
||||||
extern "C" const godot_gdnative_ext_nativescript_1_1_api_struct *nativescript_1_1_api;
|
extern "C" const godot_gdnative_ext_nativescript_1_1_api_struct *nativescript_1_1_api;
|
||||||
|
|
||||||
|
|
|
@ -31,6 +31,10 @@ public:
|
||||||
|
|
||||||
bool is_empty() const;
|
bool is_empty() const;
|
||||||
|
|
||||||
|
NodePath get_as_property_path() const;
|
||||||
|
|
||||||
|
String get_concatenated_subnames() const;
|
||||||
|
|
||||||
operator String() const;
|
operator String() const;
|
||||||
|
|
||||||
void operator=(const NodePath &other);
|
void operator=(const NodePath &other);
|
||||||
|
|
|
@ -20,6 +20,8 @@ public:
|
||||||
|
|
||||||
Quat normalized() const;
|
Quat normalized() const;
|
||||||
|
|
||||||
|
bool is_normalized() const;
|
||||||
|
|
||||||
Quat inverse() const;
|
Quat inverse() const;
|
||||||
|
|
||||||
void set_euler_xyz(const Vector3 &p_euler);
|
void set_euler_xyz(const Vector3 &p_euler);
|
||||||
|
@ -40,6 +42,8 @@ public:
|
||||||
|
|
||||||
void get_axis_and_angle(Vector3 &r_axis, real_t &r_angle) const;
|
void get_axis_and_angle(Vector3 &r_axis, real_t &r_angle) const;
|
||||||
|
|
||||||
|
void set_axis_angle(const Vector3 &axis, const float angle);
|
||||||
|
|
||||||
void operator*=(const Quat &q);
|
void operator*=(const Quat &q);
|
||||||
Quat operator*(const Quat &q) const;
|
Quat operator*(const Quat &q) const;
|
||||||
|
|
||||||
|
|
|
@ -132,6 +132,11 @@ public:
|
||||||
signed char casecmp_to(String p_str) const;
|
signed char casecmp_to(String p_str) const;
|
||||||
signed char nocasecmp_to(String p_str) const;
|
signed char nocasecmp_to(String p_str) const;
|
||||||
signed char naturalnocasecmp_to(String p_str) const;
|
signed char naturalnocasecmp_to(String p_str) const;
|
||||||
|
String dedent() const;
|
||||||
|
PoolStringArray rsplit(const String &divisor, const bool allow_empty = true, const int maxsplit = 0) const;
|
||||||
|
String rstrip(const String &chars) const;
|
||||||
|
String trim_prefix(const String &prefix) const;
|
||||||
|
String trim_suffix(const String &suffix) const;
|
||||||
};
|
};
|
||||||
|
|
||||||
String operator+(const char *a, const String &b);
|
String operator+(const char *a, const String &b);
|
||||||
|
|
|
@ -158,6 +158,35 @@ void Array::sort_custom(Object *obj, const String &func) {
|
||||||
godot::api->godot_array_sort_custom(&_godot_array, (godot_object *)obj, (godot_string *)&func);
|
godot::api->godot_array_sort_custom(&_godot_array, (godot_object *)obj, (godot_string *)&func);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int Array::bsearch(const Variant &value, const bool before) {
|
||||||
|
return godot::api->godot_array_bsearch(&_godot_array, (godot_variant *)&value, before);
|
||||||
|
}
|
||||||
|
|
||||||
|
int Array::bsearch_custom(const Variant &value, const Object *obj,
|
||||||
|
const String &func, const bool before) {
|
||||||
|
return godot::api->godot_array_bsearch_custom(&_godot_array, (godot_variant *)&value,
|
||||||
|
(godot_object *)obj, (godot_string *)&func, before);
|
||||||
|
}
|
||||||
|
|
||||||
|
Array Array::duplicate(const bool deep) const {
|
||||||
|
godot_array arr = godot::core_1_1_api->godot_array_duplicate(&_godot_array, deep);
|
||||||
|
return *(Array *)&arr;
|
||||||
|
}
|
||||||
|
|
||||||
|
Variant Array::max() const {
|
||||||
|
godot_variant v = godot::core_1_1_api->godot_array_max(&_godot_array);
|
||||||
|
return *(Variant *)&v;
|
||||||
|
}
|
||||||
|
|
||||||
|
Variant Array::min() const {
|
||||||
|
godot_variant v = godot::core_1_1_api->godot_array_min(&_godot_array);
|
||||||
|
return *(Variant *)&v;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Array::shuffle() {
|
||||||
|
godot::core_1_1_api->godot_array_shuffle(&_godot_array);
|
||||||
|
}
|
||||||
|
|
||||||
Array::~Array() {
|
Array::~Array() {
|
||||||
godot::api->godot_array_destroy(&_godot_array);
|
godot::api->godot_array_destroy(&_godot_array);
|
||||||
}
|
}
|
||||||
|
|
|
@ -149,6 +149,15 @@ Vector3 Basis::get_scale() const {
|
||||||
Vector3(elements[0][2], elements[1][2], elements[2][2]).length());
|
Vector3(elements[0][2], elements[1][2], elements[2][2]).length());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO: implement this directly without using quaternions to make it more efficient
|
||||||
|
Basis Basis::slerp(Basis b, float t) const {
|
||||||
|
ERR_FAIL_COND_V(!is_rotation(), Basis());
|
||||||
|
ERR_FAIL_COND_V(!b.is_rotation(), Basis());
|
||||||
|
Quat from(*this);
|
||||||
|
Quat to(b);
|
||||||
|
return Basis(from.slerp(to, t));
|
||||||
|
}
|
||||||
|
|
||||||
// get_euler_xyz returns a vector containing the Euler angles in the format
|
// get_euler_xyz returns a vector containing the Euler angles in the format
|
||||||
// (a1,a2,a3), where a3 is the angle of the first rotation, and a1 is the last
|
// (a1,a2,a3), where a3 is the angle of the first rotation, and a1 is the last
|
||||||
// (following the convention they are commonly defined in the literature).
|
// (following the convention they are commonly defined in the literature).
|
||||||
|
|
|
@ -67,10 +67,86 @@ uint32_t Color::to_ARGB32() const {
|
||||||
return c;
|
return c;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint32_t Color::to_ABGR32() const {
|
||||||
|
uint32_t c = (uint8_t)(a * 255);
|
||||||
|
c <<= 8;
|
||||||
|
c |= (uint8_t)(b * 255);
|
||||||
|
c <<= 8;
|
||||||
|
c |= (uint8_t)(g * 255);
|
||||||
|
c <<= 8;
|
||||||
|
c |= (uint8_t)(r * 255);
|
||||||
|
|
||||||
|
return c;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint64_t Color::to_ABGR64() const {
|
||||||
|
uint64_t c = (uint16_t)(a * 65535);
|
||||||
|
c <<= 16;
|
||||||
|
c |= (uint16_t)(b * 65535);
|
||||||
|
c <<= 16;
|
||||||
|
c |= (uint16_t)(g * 65535);
|
||||||
|
c <<= 16;
|
||||||
|
c |= (uint16_t)(r * 65535);
|
||||||
|
|
||||||
|
return c;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint64_t Color::to_ARGB64() const {
|
||||||
|
uint64_t c = (uint16_t)(a * 65535);
|
||||||
|
c <<= 16;
|
||||||
|
c |= (uint16_t)(r * 65535);
|
||||||
|
c <<= 16;
|
||||||
|
c |= (uint16_t)(g * 65535);
|
||||||
|
c <<= 16;
|
||||||
|
c |= (uint16_t)(b * 65535);
|
||||||
|
|
||||||
|
return c;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t Color::to_RGBA32() const {
|
||||||
|
uint32_t c = (uint8_t)(r * 255);
|
||||||
|
c <<= 8;
|
||||||
|
c |= (uint8_t)(g * 255);
|
||||||
|
c <<= 8;
|
||||||
|
c |= (uint8_t)(b * 255);
|
||||||
|
c <<= 8;
|
||||||
|
c |= (uint8_t)(a * 255);
|
||||||
|
|
||||||
|
return c;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint64_t Color::to_RGBA64() const {
|
||||||
|
uint64_t c = (uint16_t)(r * 65535);
|
||||||
|
c <<= 16;
|
||||||
|
c |= (uint16_t)(g * 65535);
|
||||||
|
c <<= 16;
|
||||||
|
c |= (uint16_t)(b * 65535);
|
||||||
|
c <<= 16;
|
||||||
|
c |= (uint16_t)(a * 65535);
|
||||||
|
|
||||||
|
return c;
|
||||||
|
}
|
||||||
|
|
||||||
float Color::gray() const {
|
float Color::gray() const {
|
||||||
return (r + g + b) / 3.0;
|
return (r + g + b) / 3.0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint8_t Color::get_r8() const {
|
||||||
|
return (uint8_t)(r * 255.0);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t Color::get_g8() const {
|
||||||
|
return (uint8_t)(g * 255.0);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t Color::get_b8() const {
|
||||||
|
return (uint8_t)(b * 255.0);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t Color::get_a8() const {
|
||||||
|
return (uint8_t)(a * 255.0);
|
||||||
|
}
|
||||||
|
|
||||||
float Color::get_h() const {
|
float Color::get_h() const {
|
||||||
|
|
||||||
float min = MIN(r, g);
|
float min = MIN(r, g);
|
||||||
|
@ -167,6 +243,74 @@ void Color::set_hsv(float p_h, float p_s, float p_v, float p_alpha) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Color Color::darkened(const float p_amount) const {
|
||||||
|
Color res = *this;
|
||||||
|
res.r = res.r * (1.0f - p_amount);
|
||||||
|
res.g = res.g * (1.0f - p_amount);
|
||||||
|
res.b = res.b * (1.0f - p_amount);
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
Color Color::lightened(const float p_amount) const {
|
||||||
|
Color res = *this;
|
||||||
|
res.r = res.r + (1.0f - res.r) * p_amount;
|
||||||
|
res.g = res.g + (1.0f - res.g) * p_amount;
|
||||||
|
res.b = res.b + (1.0f - res.b) * p_amount;
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
Color Color::from_hsv(float p_h, float p_s, float p_v, float p_a) const {
|
||||||
|
p_h = ::fmod(p_h * 360.0f, 360.0f);
|
||||||
|
if (p_h < 0.0)
|
||||||
|
p_h += 360.0f;
|
||||||
|
|
||||||
|
const float h_ = p_h / 60.0f;
|
||||||
|
const float c = p_v * p_s;
|
||||||
|
const float x = c * (1.0f - ::fabs(::fmod(h_, 2.0f) - 1.0f));
|
||||||
|
float r, g, b;
|
||||||
|
|
||||||
|
switch ((int)h_) {
|
||||||
|
case 0: {
|
||||||
|
r = c;
|
||||||
|
g = x;
|
||||||
|
b = 0;
|
||||||
|
} break;
|
||||||
|
case 1: {
|
||||||
|
r = x;
|
||||||
|
g = c;
|
||||||
|
b = 0;
|
||||||
|
} break;
|
||||||
|
case 2: {
|
||||||
|
r = 0;
|
||||||
|
g = c;
|
||||||
|
b = x;
|
||||||
|
} break;
|
||||||
|
case 3: {
|
||||||
|
r = 0;
|
||||||
|
g = x;
|
||||||
|
b = c;
|
||||||
|
} break;
|
||||||
|
case 4: {
|
||||||
|
r = x;
|
||||||
|
g = 0;
|
||||||
|
b = c;
|
||||||
|
} break;
|
||||||
|
case 5: {
|
||||||
|
r = c;
|
||||||
|
g = 0;
|
||||||
|
b = x;
|
||||||
|
} break;
|
||||||
|
default: {
|
||||||
|
r = 0;
|
||||||
|
g = 0;
|
||||||
|
b = 0;
|
||||||
|
} break;
|
||||||
|
}
|
||||||
|
|
||||||
|
const float m = p_v - c;
|
||||||
|
return Color(m + r, m + g, m + b, p_a);
|
||||||
|
}
|
||||||
|
|
||||||
void Color::invert() {
|
void Color::invert() {
|
||||||
r = 1.0 - r;
|
r = 1.0 - r;
|
||||||
g = 1.0 - g;
|
g = 1.0 - g;
|
||||||
|
|
|
@ -24,7 +24,10 @@ namespace godot {
|
||||||
|
|
||||||
void *_RegisterState::nativescript_handle;
|
void *_RegisterState::nativescript_handle;
|
||||||
int _RegisterState::language_index;
|
int _RegisterState::language_index;
|
||||||
|
|
||||||
const godot_gdnative_core_api_struct *api = nullptr;
|
const godot_gdnative_core_api_struct *api = nullptr;
|
||||||
|
const godot_gdnative_core_1_1_api_struct *core_1_1_api = nullptr;
|
||||||
|
|
||||||
const godot_gdnative_ext_nativescript_api_struct *nativescript_api = nullptr;
|
const godot_gdnative_ext_nativescript_api_struct *nativescript_api = nullptr;
|
||||||
const godot_gdnative_ext_nativescript_1_1_api_struct *nativescript_1_1_api = nullptr;
|
const godot_gdnative_ext_nativescript_1_1_api_struct *nativescript_1_1_api = nullptr;
|
||||||
|
|
||||||
|
@ -73,6 +76,15 @@ void Godot::gdnative_init(godot_gdnative_init_options *options) {
|
||||||
godot::api = options->api_struct;
|
godot::api = options->api_struct;
|
||||||
godot::gdnlib = options->gd_native_library;
|
godot::gdnlib = options->gd_native_library;
|
||||||
|
|
||||||
|
const godot_gdnative_api_struct *core_extension = godot::api->next;
|
||||||
|
|
||||||
|
while (core_extension) {
|
||||||
|
if (core_extension->version.major == 1 && core_extension->version.minor == 1) {
|
||||||
|
godot::core_1_1_api = (const godot_gdnative_core_1_1_api_struct *)core_extension;
|
||||||
|
}
|
||||||
|
core_extension = core_extension->next;
|
||||||
|
}
|
||||||
|
|
||||||
// now find our extensions
|
// now find our extensions
|
||||||
for (int i = 0; i < godot::api->num_extensions; i++) {
|
for (int i = 0; i < godot::api->num_extensions; i++) {
|
||||||
switch (godot::api->extensions[i]->type) {
|
switch (godot::api->extensions[i]->type) {
|
||||||
|
|
|
@ -52,6 +52,15 @@ bool NodePath::is_empty() const {
|
||||||
return godot::api->godot_node_path_is_empty(&_node_path);
|
return godot::api->godot_node_path_is_empty(&_node_path);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
NodePath NodePath::get_as_property_path() const {
|
||||||
|
godot_node_path path = godot::core_1_1_api->godot_node_path_get_as_property_path(&_node_path);
|
||||||
|
return *(NodePath *)&path;
|
||||||
|
}
|
||||||
|
String NodePath::get_concatenated_subnames() const {
|
||||||
|
godot_string str = godot::api->godot_node_path_get_concatenated_subnames(&_node_path);
|
||||||
|
return *(String *)&str;
|
||||||
|
}
|
||||||
|
|
||||||
NodePath::operator String() const {
|
NodePath::operator String() const {
|
||||||
godot_string str = godot::api->godot_node_path_as_string(&_node_path);
|
godot_string str = godot::api->godot_node_path_as_string(&_node_path);
|
||||||
|
|
||||||
|
|
|
@ -89,6 +89,10 @@ Quat Quat::normalized() const {
|
||||||
return *this / length();
|
return *this / length();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool Quat::is_normalized() const {
|
||||||
|
return std::abs(length_squared() - 1.0) < 0.00001;
|
||||||
|
}
|
||||||
|
|
||||||
Quat Quat::inverse() const {
|
Quat Quat::inverse() const {
|
||||||
return Quat(-x, -y, -z, w);
|
return Quat(-x, -y, -z, w);
|
||||||
}
|
}
|
||||||
|
@ -171,6 +175,21 @@ void Quat::get_axis_and_angle(Vector3 &r_axis, real_t &r_angle) const {
|
||||||
r_axis.z = z / ::sqrt(1 - w * w);
|
r_axis.z = z / ::sqrt(1 - w * w);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Quat::set_axis_angle(const Vector3 &axis, const float angle) {
|
||||||
|
ERR_FAIL_COND(!axis.is_normalized());
|
||||||
|
|
||||||
|
real_t d = axis.length();
|
||||||
|
if (d == 0)
|
||||||
|
set(0, 0, 0, 0);
|
||||||
|
else {
|
||||||
|
real_t sin_angle = ::sin(angle * 0.5);
|
||||||
|
real_t cos_angle = ::cos(angle * 0.5);
|
||||||
|
real_t s = sin_angle / d;
|
||||||
|
set(axis.x * s, axis.y * s, axis.z * s,
|
||||||
|
cos_angle);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Quat Quat::operator*(const Vector3 &v) const {
|
Quat Quat::operator*(const Vector3 &v) const {
|
||||||
return Quat(w * v.x + y * v.z - z * v.y,
|
return Quat(w * v.x + y * v.z - z * v.y,
|
||||||
w * v.y + z * v.x - x * v.z,
|
w * v.y + z * v.x - x * v.z,
|
||||||
|
|
|
@ -555,4 +555,34 @@ signed char String::naturalnocasecmp_to(String p_str) const {
|
||||||
return godot::api->godot_string_naturalnocasecmp_to(&_godot_string, &p_str._godot_string);
|
return godot::api->godot_string_naturalnocasecmp_to(&_godot_string, &p_str._godot_string);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
String String::dedent() const {
|
||||||
|
String new_string;
|
||||||
|
new_string._godot_string = godot::core_1_1_api->godot_string_dedent(&_godot_string);
|
||||||
|
return new_string;
|
||||||
|
}
|
||||||
|
|
||||||
|
PoolStringArray String::rsplit(const String &divisor, const bool allow_empty,
|
||||||
|
const int maxsplit) const {
|
||||||
|
godot_pool_string_array arr = godot::core_1_1_api->godot_string_rsplit(&_godot_string, &divisor._godot_string, allow_empty, maxsplit);
|
||||||
|
return *(PoolStringArray *)&arr;
|
||||||
|
}
|
||||||
|
|
||||||
|
String String::rstrip(const String &chars) const {
|
||||||
|
String new_string;
|
||||||
|
new_string._godot_string = godot::core_1_1_api->godot_string_rstrip(&_godot_string, &chars._godot_string);
|
||||||
|
return new_string;
|
||||||
|
}
|
||||||
|
|
||||||
|
String String::trim_prefix(const String &prefix) const {
|
||||||
|
String new_string;
|
||||||
|
new_string._godot_string = godot::core_1_1_api->godot_string_trim_prefix(&_godot_string, &prefix._godot_string);
|
||||||
|
return new_string;
|
||||||
|
}
|
||||||
|
|
||||||
|
String String::trim_suffix(const String &suffix) const {
|
||||||
|
String new_string;
|
||||||
|
new_string._godot_string = godot::core_1_1_api->godot_string_trim_suffix(&_godot_string, &suffix._godot_string);
|
||||||
|
return new_string;
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace godot
|
} // namespace godot
|
||||||
|
|
Loading…
Reference in New Issue