diff options
Diffstat (limited to 'core/variant/variant.h')
-rw-r--r-- | core/variant/variant.h | 38 |
1 files changed, 28 insertions, 10 deletions
diff --git a/core/variant/variant.h b/core/variant/variant.h index 10f8dc3c7f..821edcfedf 100644 --- a/core/variant/variant.h +++ b/core/variant/variant.h @@ -75,6 +75,7 @@ typedef Vector<String> PackedStringArray; typedef Vector<Vector2> PackedVector2Array; typedef Vector<Vector3> PackedVector3Array; typedef Vector<Color> PackedColorArray; +typedef Vector<Vector4> PackedVector4Array; class Variant { public: @@ -126,6 +127,7 @@ public: PACKED_VECTOR2_ARRAY, PACKED_VECTOR3_ARRAY, PACKED_COLOR_ARRAY, + PACKED_VECTOR4_ARRAY, VARIANT_MAX }; @@ -165,7 +167,7 @@ private: // Variant takes 20 bytes when real_t is float, and 36 if double // it only allocates extra memory for aabb/matrix. - Type type = NIL; + Type type; struct ObjData { ObjectID id; @@ -297,6 +299,7 @@ private: true, //PACKED_VECTOR2_ARRAY, true, //PACKED_VECTOR3_ARRAY, true, //PACKED_COLOR_ARRAY, + true, //PACKED_VECTOR4_ARRAY, }; if (unlikely(needs_deinit[type])) { // Make it fast for types that don't need deinit. @@ -349,6 +352,7 @@ public: bool is_zero() const; bool is_one() const; bool is_null() const; + bool is_read_only() const; // Make sure Variant is not implicitly cast when accessing it with bracket notation (GH-49469). Variant &operator[](const Variant &p_key) = delete; @@ -408,6 +412,7 @@ public: operator PackedVector3Array() const; operator PackedVector2Array() const; operator PackedColorArray() const; + operator PackedVector4Array() const; operator Vector<::RID>() const; operator Vector<Plane>() const; @@ -473,6 +478,7 @@ public: Variant(const PackedVector2Array &p_vector2_array); Variant(const PackedVector3Array &p_vector3_array); Variant(const PackedColorArray &p_color_array); + Variant(const PackedVector4Array &p_vector4_array); Variant(const Vector<::RID> &p_array); // helper Variant(const Vector<Plane> &p_array); // helper @@ -483,8 +489,8 @@ public: Variant(const IPAddress &p_address); #define VARIANT_ENUM_CLASS_CONSTRUCTOR(m_enum) \ - Variant(m_enum p_value) { \ - type = INT; \ + Variant(m_enum p_value) : \ + type(INT) { \ _data._int = (int64_t)p_value; \ } @@ -788,7 +794,8 @@ public: static void unregister_types(); Variant(const Variant &p_variant); - _FORCE_INLINE_ Variant() {} + _FORCE_INLINE_ Variant() : + type(NIL) {} _FORCE_INLINE_ ~Variant() { clear(); } @@ -797,12 +804,23 @@ public: //typedef Dictionary Dictionary; no //typedef Array Array; -Vector<Variant> varray(); -Vector<Variant> varray(const Variant &p_arg1); -Vector<Variant> varray(const Variant &p_arg1, const Variant &p_arg2); -Vector<Variant> varray(const Variant &p_arg1, const Variant &p_arg2, const Variant &p_arg3); -Vector<Variant> varray(const Variant &p_arg1, const Variant &p_arg2, const Variant &p_arg3, const Variant &p_arg4); -Vector<Variant> varray(const Variant &p_arg1, const Variant &p_arg2, const Variant &p_arg3, const Variant &p_arg4, const Variant &p_arg5); +template <typename... VarArgs> +Vector<Variant> varray(VarArgs... p_args) { + Vector<Variant> v; + + Variant args[sizeof...(p_args) + 1] = { p_args..., Variant() }; // +1 makes sure zero sized arrays are also supported. + uint32_t argc = sizeof...(p_args); + + if (argc > 0) { + v.resize(argc); + Variant *vw = v.ptrw(); + + for (uint32_t i = 0; i < argc; i++) { + vw[i] = args[i]; + } + } + return v; +} struct VariantHasher { static _FORCE_INLINE_ uint32_t hash(const Variant &p_variant) { return p_variant.hash(); } |