Compare commits
1 Commits
0c3a8220cf
...
95aa0be56c
Author | SHA1 | Date |
---|---|---|
Lukas Tenbrink | 95aa0be56c |
|
@ -61,10 +61,6 @@ class Wrapped {
|
||||||
thread_local static const StringName *_constructing_extension_class_name;
|
thread_local static const StringName *_constructing_extension_class_name;
|
||||||
thread_local static const GDExtensionInstanceBindingCallbacks *_constructing_class_binding_callbacks;
|
thread_local static const GDExtensionInstanceBindingCallbacks *_constructing_class_binding_callbacks;
|
||||||
|
|
||||||
#ifdef HOT_RELOAD_ENABLED
|
|
||||||
thread_local static GDExtensionObjectPtr _constructing_recreate_owner;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
_ALWAYS_INLINE_ static void _set_construct_info() {
|
_ALWAYS_INLINE_ static void _set_construct_info() {
|
||||||
_constructing_extension_class_name = T::_get_extension_class_name();
|
_constructing_extension_class_name = T::_get_extension_class_name();
|
||||||
|
@ -75,6 +71,15 @@ protected:
|
||||||
virtual bool _is_extension_class() const { return false; }
|
virtual bool _is_extension_class() const { return false; }
|
||||||
static const StringName *_get_extension_class_name(); // This is needed to retrieve the class name before the godot object has its _extension and _extension_instance members assigned.
|
static const StringName *_get_extension_class_name(); // This is needed to retrieve the class name before the godot object has its _extension and _extension_instance members assigned.
|
||||||
|
|
||||||
|
#ifdef HOT_RELOAD_ENABLED
|
||||||
|
struct RecreateInstance {
|
||||||
|
GDExtensionClassInstancePtr wrapper;
|
||||||
|
GDExtensionObjectPtr owner;
|
||||||
|
RecreateInstance *next;
|
||||||
|
};
|
||||||
|
inline static RecreateInstance *recreate_instance = nullptr;
|
||||||
|
#endif
|
||||||
|
|
||||||
void _notification(int p_what) {}
|
void _notification(int p_what) {}
|
||||||
bool _set(const StringName &p_name, const Variant &p_property) { return false; }
|
bool _set(const StringName &p_name, const Variant &p_property) { return false; }
|
||||||
bool _get(const StringName &p_name, Variant &r_property) const { return false; }
|
bool _get(const StringName &p_name, Variant &r_property) const { return false; }
|
||||||
|
|
|
@ -129,8 +129,9 @@ private:
|
||||||
static GDExtensionClassInstancePtr _recreate_instance_func(void *data, GDExtensionObjectPtr obj) {
|
static GDExtensionClassInstancePtr _recreate_instance_func(void *data, GDExtensionObjectPtr obj) {
|
||||||
if constexpr (!std::is_abstract_v<T>) {
|
if constexpr (!std::is_abstract_v<T>) {
|
||||||
#ifdef HOT_RELOAD_ENABLED
|
#ifdef HOT_RELOAD_ENABLED
|
||||||
Wrapped::_constructing_recreate_owner = obj;
|
|
||||||
T *new_instance = (T *)memalloc(sizeof(T));
|
T *new_instance = (T *)memalloc(sizeof(T));
|
||||||
|
Wrapped::RecreateInstance recreate_data = { new_instance, obj, Wrapped::recreate_instance };
|
||||||
|
Wrapped::recreate_instance = &recreate_data;
|
||||||
memnew_placement(new_instance, T);
|
memnew_placement(new_instance, T);
|
||||||
return new_instance;
|
return new_instance;
|
||||||
#else
|
#else
|
||||||
|
|
|
@ -224,7 +224,7 @@ struct _NO_DISCARD_ Basis {
|
||||||
|
|
||||||
operator Quaternion() const { return get_quaternion(); }
|
operator Quaternion() const { return get_quaternion(); }
|
||||||
|
|
||||||
static Basis looking_at(const Vector3 &p_target, const Vector3 &p_up = Vector3(0, 1, 0), bool p_use_model_front = false);
|
static Basis looking_at(const Vector3 &p_target, const Vector3 &p_up = Vector3(0, 1, 0));
|
||||||
|
|
||||||
Basis(const Quaternion &p_quaternion) { set_quaternion(p_quaternion); }
|
Basis(const Quaternion &p_quaternion) { set_quaternion(p_quaternion); }
|
||||||
Basis(const Quaternion &p_quaternion, const Vector3 &p_scale) { set_quaternion_scale(p_quaternion, p_scale); }
|
Basis(const Quaternion &p_quaternion, const Vector3 &p_scale) { set_quaternion_scale(p_quaternion, p_scale); }
|
||||||
|
|
|
@ -42,10 +42,6 @@ namespace godot {
|
||||||
thread_local const StringName *Wrapped::_constructing_extension_class_name = nullptr;
|
thread_local const StringName *Wrapped::_constructing_extension_class_name = nullptr;
|
||||||
thread_local const GDExtensionInstanceBindingCallbacks *Wrapped::_constructing_class_binding_callbacks = nullptr;
|
thread_local const GDExtensionInstanceBindingCallbacks *Wrapped::_constructing_class_binding_callbacks = nullptr;
|
||||||
|
|
||||||
#ifdef HOT_RELOAD_ENABLED
|
|
||||||
thread_local GDExtensionObjectPtr Wrapped::_constructing_recreate_owner = nullptr;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
const StringName *Wrapped::_get_extension_class_name() {
|
const StringName *Wrapped::_get_extension_class_name() {
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
@ -59,14 +55,25 @@ void Wrapped::_postinitialize() {
|
||||||
|
|
||||||
Wrapped::Wrapped(const StringName p_godot_class) {
|
Wrapped::Wrapped(const StringName p_godot_class) {
|
||||||
#ifdef HOT_RELOAD_ENABLED
|
#ifdef HOT_RELOAD_ENABLED
|
||||||
if (unlikely(Wrapped::_constructing_recreate_owner)) {
|
if (unlikely(Wrapped::recreate_instance)) {
|
||||||
_owner = Wrapped::_constructing_recreate_owner;
|
RecreateInstance *recreate_data = Wrapped::recreate_instance;
|
||||||
Wrapped::_constructing_recreate_owner = nullptr;
|
RecreateInstance *previous = nullptr;
|
||||||
} else
|
while (recreate_data) {
|
||||||
#endif
|
if (recreate_data->wrapper == this) {
|
||||||
{
|
_owner = recreate_data->owner;
|
||||||
_owner = godot::internal::gdextension_interface_classdb_construct_object(reinterpret_cast<GDExtensionConstStringNamePtr>(p_godot_class._native_ptr()));
|
if (previous) {
|
||||||
|
previous->next = recreate_data->next;
|
||||||
|
} else {
|
||||||
|
Wrapped::recreate_instance = recreate_data->next;
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
previous = recreate_data;
|
||||||
|
recreate_data = recreate_data->next;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
_owner = godot::internal::gdextension_interface_classdb_construct_object(reinterpret_cast<GDExtensionConstStringNamePtr>(p_godot_class._native_ptr()));
|
||||||
|
|
||||||
if (_constructing_extension_class_name) {
|
if (_constructing_extension_class_name) {
|
||||||
godot::internal::gdextension_interface_object_set_instance(_owner, reinterpret_cast<GDExtensionConstStringNamePtr>(_constructing_extension_class_name), this);
|
godot::internal::gdextension_interface_object_set_instance(_owner, reinterpret_cast<GDExtensionConstStringNamePtr>(_constructing_extension_class_name), this);
|
||||||
|
|
|
@ -1037,15 +1037,12 @@ void Basis::rotate_sh(real_t *p_values) {
|
||||||
p_values[8] = d4 * s_scale_dst4;
|
p_values[8] = d4 * s_scale_dst4;
|
||||||
}
|
}
|
||||||
|
|
||||||
Basis Basis::looking_at(const Vector3 &p_target, const Vector3 &p_up, bool p_use_model_front) {
|
Basis Basis::looking_at(const Vector3 &p_target, const Vector3 &p_up) {
|
||||||
#ifdef MATH_CHECKS
|
#ifdef MATH_CHECKS
|
||||||
ERR_FAIL_COND_V_MSG(p_target.is_zero_approx(), Basis(), "The target vector can't be zero.");
|
ERR_FAIL_COND_V_MSG(p_target.is_zero_approx(), Basis(), "The target vector can't be zero.");
|
||||||
ERR_FAIL_COND_V_MSG(p_up.is_zero_approx(), Basis(), "The up vector can't be zero.");
|
ERR_FAIL_COND_V_MSG(p_up.is_zero_approx(), Basis(), "The up vector can't be zero.");
|
||||||
#endif
|
#endif
|
||||||
Vector3 v_z = p_target.normalized();
|
Vector3 v_z = -p_target.normalized();
|
||||||
if (!p_use_model_front) {
|
|
||||||
v_z = -v_z;
|
|
||||||
}
|
|
||||||
Vector3 v_x = p_up.cross(v_z);
|
Vector3 v_x = p_up.cross(v_z);
|
||||||
#ifdef MATH_CHECKS
|
#ifdef MATH_CHECKS
|
||||||
ERR_FAIL_COND_V_MSG(v_x.is_zero_approx(), Basis(), "The target vector and up vector can't be parallel to each other.");
|
ERR_FAIL_COND_V_MSG(v_x.is_zero_approx(), Basis(), "The target vector and up vector can't be parallel to each other.");
|
||||||
|
|
Loading…
Reference in New Issue