diff options
Diffstat (limited to 'core/variant')
-rw-r--r-- | core/variant/typed_array.h | 2 | ||||
-rw-r--r-- | core/variant/variant.cpp | 7 | ||||
-rw-r--r-- | core/variant/variant.h | 1 | ||||
-rw-r--r-- | core/variant/variant_internal.h | 17 | ||||
-rw-r--r-- | core/variant/variant_utility.cpp | 5 |
5 files changed, 28 insertions, 4 deletions
diff --git a/core/variant/typed_array.h b/core/variant/typed_array.h index 50411121bc..aadd6fee89 100644 --- a/core/variant/typed_array.h +++ b/core/variant/typed_array.h @@ -31,8 +31,10 @@ #ifndef TYPED_ARRAY_H #define TYPED_ARRAY_H +#include "core/object/object.h" #include "core/variant/array.h" #include "core/variant/method_ptrcall.h" +#include "core/variant/type_info.h" #include "core/variant/variant.h" template <class T> diff --git a/core/variant/variant.cpp b/core/variant/variant.cpp index fcfa530388..3d11ed6303 100644 --- a/core/variant/variant.cpp +++ b/core/variant/variant.cpp @@ -1023,6 +1023,13 @@ bool Variant::is_null() const { } } +bool Variant::initialize_ref(Object *p_object) { + RefCounted *ref_counted = const_cast<RefCounted *>(static_cast<const RefCounted *>(p_object)); + if (!ref_counted->init_ref()) { + return false; + } + return true; +} void Variant::reference(const Variant &p_variant) { switch (type) { case NIL: diff --git a/core/variant/variant.h b/core/variant/variant.h index b75882a87c..836a67d942 100644 --- a/core/variant/variant.h +++ b/core/variant/variant.h @@ -216,6 +216,7 @@ private: } _data alignas(8); void reference(const Variant &p_variant); + static bool initialize_ref(Object *p_object); void _clear_internal(); diff --git a/core/variant/variant_internal.h b/core/variant/variant_internal.h index aaafa2f6b6..3696ffae60 100644 --- a/core/variant/variant_internal.h +++ b/core/variant/variant_internal.h @@ -111,6 +111,10 @@ public: } } + _FORCE_INLINE_ static bool initialize_ref(Object *object) { + return Variant::initialize_ref(object); + } + // Atomic types. _FORCE_INLINE_ static bool *get_bool(Variant *v) { return &v->_data._bool; } _FORCE_INLINE_ static const bool *get_bool(const Variant *v) { return &v->_data._bool; } @@ -1430,10 +1434,15 @@ struct VariantTypeConstructor<Object *> { _FORCE_INLINE_ static void variant_from_type(void *p_variant, void *p_value) { Variant *variant = reinterpret_cast<Variant *>(p_variant); VariantInitializer<Object *>::init(variant); - Object *value = *(reinterpret_cast<Object **>(p_value)); - if (value) { - VariantInternalAccessor<Object *>::set(variant, value); - VariantInternalAccessor<ObjectID>::set(variant, value->get_instance_id()); + Object *object = *(reinterpret_cast<Object **>(p_value)); + if (object) { + if (object->is_ref_counted()) { + if (!VariantInternal::initialize_ref(object)) { + return; + } + } + VariantInternalAccessor<Object *>::set(variant, object); + VariantInternalAccessor<ObjectID>::set(variant, object->get_instance_id()); } } diff --git a/core/variant/variant_utility.cpp b/core/variant/variant_utility.cpp index 60950099d2..e83c71098d 100644 --- a/core/variant/variant_utility.cpp +++ b/core/variant/variant_utility.cpp @@ -231,6 +231,10 @@ struct VariantUtilityFunctions { return Math::lerp(from, to, weight); } + static inline double cubic_interpolate(double from, double to, double pre, double post, double weight) { + return Math::cubic_interpolate(from, to, pre, post, weight); + } + static inline double lerp_angle(double from, double to, double weight) { return Math::lerp_angle(from, to, weight); } @@ -1204,6 +1208,7 @@ void Variant::_register_variant_utility_functions() { FUNCBINDR(snapped, sarray("x", "step"), Variant::UTILITY_FUNC_TYPE_MATH); FUNCBINDR(lerp, sarray("from", "to", "weight"), Variant::UTILITY_FUNC_TYPE_MATH); + FUNCBINDR(cubic_interpolate, sarray("from", "to", "pre", "post", "weight"), Variant::UTILITY_FUNC_TYPE_MATH); FUNCBINDR(lerp_angle, sarray("from", "to", "weight"), Variant::UTILITY_FUNC_TYPE_MATH); FUNCBINDR(inverse_lerp, sarray("from", "to", "weight"), Variant::UTILITY_FUNC_TYPE_MATH); FUNCBINDR(range_lerp, sarray("value", "istart", "istop", "ostart", "ostop"), Variant::UTILITY_FUNC_TYPE_MATH); |