summaryrefslogtreecommitdiffstats
path: root/core/io/resource_format_binary.cpp
diff options
context:
space:
mode:
authorRémi Verschelde <rverschelde@gmail.com>2024-05-03 12:25:26 +0200
committerRémi Verschelde <rverschelde@gmail.com>2024-05-03 12:25:26 +0200
commit03e6fbb010c3546593bd91a0dabc045a9882705a (patch)
tree3fecc6c86700d555245a71ac2b6421c5296a3132 /core/io/resource_format_binary.cpp
parentd898f37e35ac4966fc7d54a009d05181fd3b232e (diff)
parentf9b488508ccc294db03d427c15c182864fae74de (diff)
downloadredot-engine-03e6fbb010c3546593bd91a0dabc045a9882705a.tar.gz
Merge pull request #85474 from fire/packedvector4array
Add `PackedVector4Array` Variant type
Diffstat (limited to 'core/io/resource_format_binary.cpp')
-rw-r--r--core/io/resource_format_binary.cpp61
1 files changed, 45 insertions, 16 deletions
diff --git a/core/io/resource_format_binary.cpp b/core/io/resource_format_binary.cpp
index d0a8200546..ab460c5f4c 100644
--- a/core/io/resource_format_binary.cpp
+++ b/core/io/resource_format_binary.cpp
@@ -85,15 +85,17 @@ enum {
VARIANT_VECTOR4 = 50,
VARIANT_VECTOR4I = 51,
VARIANT_PROJECTION = 52,
+ VARIANT_PACKED_VECTOR4_ARRAY = 53,
OBJECT_EMPTY = 0,
OBJECT_EXTERNAL_RESOURCE = 1,
OBJECT_INTERNAL_RESOURCE = 2,
OBJECT_EXTERNAL_RESOURCE_INDEX = 3,
- // Version 2: added 64 bits support for float and int.
- // Version 3: changed nodepath encoding.
- // Version 4: new string ID for ext/subresources, breaks forward compat.
+ // Version 2: Added 64-bit support for float and int.
+ // Version 3: Changed NodePath encoding.
+ // Version 4: New string ID for ext/subresources, breaks forward compat.
// Version 5: Ability to store script class in the header.
- FORMAT_VERSION = 5,
+ // Version 6: Added PackedVector4Array Variant type.
+ FORMAT_VERSION = 6,
FORMAT_VERSION_CAN_RENAME_DEPS = 1,
FORMAT_VERSION_NO_NODEPATH_PROPERTY = 3,
};
@@ -653,6 +655,19 @@ Error ResourceLoaderBinary::parse_variant(Variant &r_v) {
r_v = array;
} break;
+ case VARIANT_PACKED_VECTOR4_ARRAY: {
+ uint32_t len = f->get_32();
+
+ Vector<Vector4> array;
+ array.resize(len);
+ Vector4 *w = array.ptrw();
+ static_assert(sizeof(Vector4) == 4 * sizeof(real_t));
+ const Error err = read_reals(reinterpret_cast<real_t *>(w), f, len * 4);
+ ERR_FAIL_COND_V(err != OK, err);
+
+ r_v = array;
+
+ } break;
default: {
ERR_FAIL_V(ERR_FILE_CORRUPT);
} break;
@@ -1912,33 +1927,33 @@ void ResourceFormatSaverBinaryInstance::write_variant(Ref<FileAccess> f, const V
for (int i = 0; i < len; i++) {
save_unicode_string(f, r[i]);
}
-
} break;
- case Variant::PACKED_VECTOR3_ARRAY: {
- f->store_32(VARIANT_PACKED_VECTOR3_ARRAY);
- Vector<Vector3> arr = p_property;
+
+ case Variant::PACKED_VECTOR2_ARRAY: {
+ f->store_32(VARIANT_PACKED_VECTOR2_ARRAY);
+ Vector<Vector2> arr = p_property;
int len = arr.size();
f->store_32(len);
- const Vector3 *r = arr.ptr();
+ const Vector2 *r = arr.ptr();
for (int i = 0; i < len; i++) {
f->store_real(r[i].x);
f->store_real(r[i].y);
- f->store_real(r[i].z);
}
-
} break;
- case Variant::PACKED_VECTOR2_ARRAY: {
- f->store_32(VARIANT_PACKED_VECTOR2_ARRAY);
- Vector<Vector2> arr = p_property;
+
+ case Variant::PACKED_VECTOR3_ARRAY: {
+ f->store_32(VARIANT_PACKED_VECTOR3_ARRAY);
+ Vector<Vector3> arr = p_property;
int len = arr.size();
f->store_32(len);
- const Vector2 *r = arr.ptr();
+ const Vector3 *r = arr.ptr();
for (int i = 0; i < len; i++) {
f->store_real(r[i].x);
f->store_real(r[i].y);
+ f->store_real(r[i].z);
}
-
} break;
+
case Variant::PACKED_COLOR_ARRAY: {
f->store_32(VARIANT_PACKED_COLOR_ARRAY);
Vector<Color> arr = p_property;
@@ -1953,6 +1968,20 @@ void ResourceFormatSaverBinaryInstance::write_variant(Ref<FileAccess> f, const V
}
} break;
+ case Variant::PACKED_VECTOR4_ARRAY: {
+ f->store_32(VARIANT_PACKED_VECTOR4_ARRAY);
+ Vector<Vector4> arr = p_property;
+ int len = arr.size();
+ f->store_32(len);
+ const Vector4 *r = arr.ptr();
+ for (int i = 0; i < len; i++) {
+ f->store_real(r[i].x);
+ f->store_real(r[i].y);
+ f->store_real(r[i].z);
+ f->store_real(r[i].w);
+ }
+
+ } break;
default: {
ERR_FAIL_MSG("Invalid variant.");
}