Add PackedVector4Array Variant type
Co-authored-by: A Thousand Ships <96648715+AThousandShips@users.noreply.github.com> Co-authored-by: Rémi Verschelde <rverschelde@gmail.com>
This commit is contained in:
committed by
Rémi Verschelde
parent
b9e022302a
commit
f9b488508c
@@ -1178,6 +1178,73 @@ Error decode_variant(Variant &r_variant, const uint8_t *p_buffer, int p_len, int
|
||||
|
||||
r_variant = carray;
|
||||
|
||||
} break;
|
||||
|
||||
case Variant::PACKED_VECTOR4_ARRAY: {
|
||||
ERR_FAIL_COND_V(len < 4, ERR_INVALID_DATA);
|
||||
int32_t count = decode_uint32(buf);
|
||||
buf += 4;
|
||||
len -= 4;
|
||||
|
||||
Vector<Vector4> varray;
|
||||
|
||||
if (header & HEADER_DATA_FLAG_64) {
|
||||
ERR_FAIL_MUL_OF(count, sizeof(double) * 4, ERR_INVALID_DATA);
|
||||
ERR_FAIL_COND_V(count < 0 || count * sizeof(double) * 4 > (size_t)len, ERR_INVALID_DATA);
|
||||
|
||||
if (r_len) {
|
||||
(*r_len) += 4; // Size of count number.
|
||||
}
|
||||
|
||||
if (count) {
|
||||
varray.resize(count);
|
||||
Vector4 *w = varray.ptrw();
|
||||
|
||||
for (int32_t i = 0; i < count; i++) {
|
||||
w[i].x = decode_double(buf + i * sizeof(double) * 4 + sizeof(double) * 0);
|
||||
w[i].y = decode_double(buf + i * sizeof(double) * 4 + sizeof(double) * 1);
|
||||
w[i].z = decode_double(buf + i * sizeof(double) * 4 + sizeof(double) * 2);
|
||||
w[i].w = decode_double(buf + i * sizeof(double) * 4 + sizeof(double) * 3);
|
||||
}
|
||||
|
||||
int adv = sizeof(double) * 4 * count;
|
||||
|
||||
if (r_len) {
|
||||
(*r_len) += adv;
|
||||
}
|
||||
len -= adv;
|
||||
buf += adv;
|
||||
}
|
||||
} else {
|
||||
ERR_FAIL_MUL_OF(count, sizeof(float) * 4, ERR_INVALID_DATA);
|
||||
ERR_FAIL_COND_V(count < 0 || count * sizeof(float) * 4 > (size_t)len, ERR_INVALID_DATA);
|
||||
|
||||
if (r_len) {
|
||||
(*r_len) += 4; // Size of count number.
|
||||
}
|
||||
|
||||
if (count) {
|
||||
varray.resize(count);
|
||||
Vector4 *w = varray.ptrw();
|
||||
|
||||
for (int32_t i = 0; i < count; i++) {
|
||||
w[i].x = decode_float(buf + i * sizeof(float) * 4 + sizeof(float) * 0);
|
||||
w[i].y = decode_float(buf + i * sizeof(float) * 4 + sizeof(float) * 1);
|
||||
w[i].z = decode_float(buf + i * sizeof(float) * 4 + sizeof(float) * 2);
|
||||
w[i].w = decode_float(buf + i * sizeof(float) * 4 + sizeof(float) * 3);
|
||||
}
|
||||
|
||||
int adv = sizeof(float) * 4 * count;
|
||||
|
||||
if (r_len) {
|
||||
(*r_len) += adv;
|
||||
}
|
||||
len -= adv;
|
||||
buf += adv;
|
||||
}
|
||||
}
|
||||
r_variant = varray;
|
||||
|
||||
} break;
|
||||
default: {
|
||||
ERR_FAIL_V(ERR_BUG);
|
||||
@@ -1263,6 +1330,7 @@ Error encode_variant(const Variant &p_variant, uint8_t *r_buffer, int &r_len, bo
|
||||
case Variant::VECTOR4:
|
||||
case Variant::PACKED_VECTOR2_ARRAY:
|
||||
case Variant::PACKED_VECTOR3_ARRAY:
|
||||
case Variant::PACKED_VECTOR4_ARRAY:
|
||||
case Variant::TRANSFORM2D:
|
||||
case Variant::TRANSFORM3D:
|
||||
case Variant::PROJECTION:
|
||||
@@ -1946,6 +2014,32 @@ Error encode_variant(const Variant &p_variant, uint8_t *r_buffer, int &r_len, bo
|
||||
|
||||
r_len += 4 * 4 * len;
|
||||
|
||||
} break;
|
||||
case Variant::PACKED_VECTOR4_ARRAY: {
|
||||
Vector<Vector4> data = p_variant;
|
||||
int len = data.size();
|
||||
|
||||
if (buf) {
|
||||
encode_uint32(len, buf);
|
||||
buf += 4;
|
||||
}
|
||||
|
||||
r_len += 4;
|
||||
|
||||
if (buf) {
|
||||
for (int i = 0; i < len; i++) {
|
||||
Vector4 v = data.get(i);
|
||||
|
||||
encode_real(v.x, &buf[0]);
|
||||
encode_real(v.y, &buf[sizeof(real_t)]);
|
||||
encode_real(v.z, &buf[sizeof(real_t) * 2]);
|
||||
encode_real(v.w, &buf[sizeof(real_t) * 3]);
|
||||
buf += sizeof(real_t) * 4;
|
||||
}
|
||||
}
|
||||
|
||||
r_len += sizeof(real_t) * 4 * len;
|
||||
|
||||
} break;
|
||||
default: {
|
||||
ERR_FAIL_V(ERR_BUG);
|
||||
|
||||
@@ -244,6 +244,7 @@ uint32_t PackedDataContainer::_pack(const Variant &p_data, Vector<uint8_t> &tmpd
|
||||
case Variant::PACKED_VECTOR2_ARRAY:
|
||||
case Variant::PACKED_VECTOR3_ARRAY:
|
||||
case Variant::PACKED_COLOR_ARRAY:
|
||||
case Variant::PACKED_VECTOR4_ARRAY:
|
||||
case Variant::STRING_NAME:
|
||||
case Variant::NODE_PATH: {
|
||||
uint32_t pos = tmpdata.size();
|
||||
|
||||
@@ -383,7 +383,8 @@ Ref<Resource> Resource::duplicate(bool p_subresources) const {
|
||||
case Variant::Type::PACKED_FLOAT64_ARRAY:
|
||||
case Variant::Type::PACKED_STRING_ARRAY:
|
||||
case Variant::Type::PACKED_VECTOR2_ARRAY:
|
||||
case Variant::Type::PACKED_VECTOR3_ARRAY: {
|
||||
case Variant::Type::PACKED_VECTOR3_ARRAY:
|
||||
case Variant::Type::PACKED_VECTOR4_ARRAY: {
|
||||
r->set(E.name, p.duplicate(p_subresources));
|
||||
} break;
|
||||
|
||||
|
||||
@@ -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,8 +1927,20 @@ 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_VECTOR2_ARRAY: {
|
||||
f->store_32(VARIANT_PACKED_VECTOR2_ARRAY);
|
||||
Vector<Vector2> arr = p_property;
|
||||
int len = arr.size();
|
||||
f->store_32(len);
|
||||
const Vector2 *r = arr.ptr();
|
||||
for (int i = 0; i < len; i++) {
|
||||
f->store_real(r[i].x);
|
||||
f->store_real(r[i].y);
|
||||
}
|
||||
} break;
|
||||
|
||||
case Variant::PACKED_VECTOR3_ARRAY: {
|
||||
f->store_32(VARIANT_PACKED_VECTOR3_ARRAY);
|
||||
Vector<Vector3> arr = p_property;
|
||||
@@ -1925,20 +1952,8 @@ void ResourceFormatSaverBinaryInstance::write_variant(Ref<FileAccess> f, const V
|
||||
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;
|
||||
int len = arr.size();
|
||||
f->store_32(len);
|
||||
const Vector2 *r = arr.ptr();
|
||||
for (int i = 0; i < len; i++) {
|
||||
f->store_real(r[i].x);
|
||||
f->store_real(r[i].y);
|
||||
}
|
||||
|
||||
} break;
|
||||
case Variant::PACKED_COLOR_ARRAY: {
|
||||
f->store_32(VARIANT_PACKED_COLOR_ARRAY);
|
||||
Vector<Color> arr = p_property;
|
||||
@@ -1952,6 +1967,20 @@ void ResourceFormatSaverBinaryInstance::write_variant(Ref<FileAccess> f, const V
|
||||
f->store_float(r[i].a);
|
||||
}
|
||||
|
||||
} 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.");
|
||||
|
||||
Reference in New Issue
Block a user