Skip to content

Commit f9b4885

Browse files
fireAThousandShipsakien-mga
committed
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>
1 parent b9e0223 commit f9b4885

File tree

79 files changed

+1036
-88
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

79 files changed

+1036
-88
lines changed

core/core_constants.cpp

+1
Original file line numberDiff line numberDiff line change
@@ -761,6 +761,7 @@ void register_global_constants() {
761761
BIND_CORE_ENUM_CONSTANT_CUSTOM("TYPE_PACKED_VECTOR2_ARRAY", Variant::PACKED_VECTOR2_ARRAY);
762762
BIND_CORE_ENUM_CONSTANT_CUSTOM("TYPE_PACKED_VECTOR3_ARRAY", Variant::PACKED_VECTOR3_ARRAY);
763763
BIND_CORE_ENUM_CONSTANT_CUSTOM("TYPE_PACKED_COLOR_ARRAY", Variant::PACKED_COLOR_ARRAY);
764+
BIND_CORE_ENUM_CONSTANT_CUSTOM("TYPE_PACKED_VECTOR4_ARRAY", Variant::PACKED_VECTOR4_ARRAY);
764765
BIND_CORE_ENUM_CONSTANT_CUSTOM("TYPE_MAX", Variant::VARIANT_MAX);
765766

766767
//comparison

core/extension/extension_api_dump.cpp

+2
Original file line numberDiff line numberDiff line change
@@ -189,6 +189,7 @@ Dictionary GDExtensionAPIDump::generate_extension_api(bool p_include_docs) {
189189
{ Variant::PACKED_VECTOR2_ARRAY, ptrsize_32 * 2, ptrsize_64 * 2, ptrsize_32 * 2, ptrsize_64 * 2 },
190190
{ Variant::PACKED_VECTOR3_ARRAY, ptrsize_32 * 2, ptrsize_64 * 2, ptrsize_32 * 2, ptrsize_64 * 2 },
191191
{ Variant::PACKED_COLOR_ARRAY, ptrsize_32 * 2, ptrsize_64 * 2, ptrsize_32 * 2, ptrsize_64 * 2 },
192+
{ Variant::PACKED_VECTOR4_ARRAY, ptrsize_32 * 2, ptrsize_64 * 2, ptrsize_32 * 2, ptrsize_64 * 2 },
192193
{ Variant::VARIANT_MAX, sizeof(uint64_t) + sizeof(float) * 4, sizeof(uint64_t) + sizeof(float) * 4, sizeof(uint64_t) + sizeof(double) * 4, sizeof(uint64_t) + sizeof(double) * 4 },
193194
};
194195

@@ -230,6 +231,7 @@ Dictionary GDExtensionAPIDump::generate_extension_api(bool p_include_docs) {
230231
static_assert(type_size_array[Variant::PACKED_VECTOR2_ARRAY][sizeof(void *)] == sizeof(PackedVector2Array), "Size of PackedVector2Array mismatch");
231232
static_assert(type_size_array[Variant::PACKED_VECTOR3_ARRAY][sizeof(void *)] == sizeof(PackedVector3Array), "Size of PackedVector3Array mismatch");
232233
static_assert(type_size_array[Variant::PACKED_COLOR_ARRAY][sizeof(void *)] == sizeof(PackedColorArray), "Size of PackedColorArray mismatch");
234+
static_assert(type_size_array[Variant::PACKED_VECTOR4_ARRAY][sizeof(void *)] == sizeof(PackedVector4Array), "Size of PackedVector4Array mismatch");
233235
static_assert(type_size_array[Variant::VARIANT_MAX][sizeof(void *)] == sizeof(Variant), "Size of Variant mismatch");
234236

235237
Array core_type_sizes;

core/extension/gdextension_interface.cpp

+22
Original file line numberDiff line numberDiff line change
@@ -595,6 +595,8 @@ static GDExtensionVariantFromTypeConstructorFunc gdextension_get_variant_from_ty
595595
return VariantTypeConstructor<PackedVector2Array>::variant_from_type;
596596
case GDEXTENSION_VARIANT_TYPE_PACKED_VECTOR3_ARRAY:
597597
return VariantTypeConstructor<PackedVector3Array>::variant_from_type;
598+
case GDEXTENSION_VARIANT_TYPE_PACKED_VECTOR4_ARRAY:
599+
return VariantTypeConstructor<PackedVector4Array>::variant_from_type;
598600
case GDEXTENSION_VARIANT_TYPE_PACKED_COLOR_ARRAY:
599601
return VariantTypeConstructor<PackedColorArray>::variant_from_type;
600602
case GDEXTENSION_VARIANT_TYPE_NIL:
@@ -678,6 +680,8 @@ static GDExtensionTypeFromVariantConstructorFunc gdextension_get_variant_to_type
678680
return VariantTypeConstructor<PackedVector2Array>::type_from_variant;
679681
case GDEXTENSION_VARIANT_TYPE_PACKED_VECTOR3_ARRAY:
680682
return VariantTypeConstructor<PackedVector3Array>::type_from_variant;
683+
case GDEXTENSION_VARIANT_TYPE_PACKED_VECTOR4_ARRAY:
684+
return VariantTypeConstructor<PackedVector4Array>::type_from_variant;
681685
case GDEXTENSION_VARIANT_TYPE_PACKED_COLOR_ARRAY:
682686
return VariantTypeConstructor<PackedColorArray>::type_from_variant;
683687
case GDEXTENSION_VARIANT_TYPE_NIL:
@@ -1116,6 +1120,22 @@ static GDExtensionTypePtr gdextension_packed_vector3_array_operator_index_const(
11161120
return (GDExtensionTypePtr)&self->ptr()[p_index];
11171121
}
11181122

1123+
static GDExtensionTypePtr gdextension_packed_vector4_array_operator_index(GDExtensionTypePtr p_self, GDExtensionInt p_index) {
1124+
PackedVector4Array *self = (PackedVector4Array *)p_self;
1125+
if (unlikely(p_index < 0 || p_index >= self->size())) {
1126+
return nullptr;
1127+
}
1128+
return (GDExtensionTypePtr)&self->ptrw()[p_index];
1129+
}
1130+
1131+
static GDExtensionTypePtr gdextension_packed_vector4_array_operator_index_const(GDExtensionConstTypePtr p_self, GDExtensionInt p_index) {
1132+
const PackedVector4Array *self = (const PackedVector4Array *)p_self;
1133+
if (unlikely(p_index < 0 || p_index >= self->size())) {
1134+
return nullptr;
1135+
}
1136+
return (GDExtensionTypePtr)&self->ptr()[p_index];
1137+
}
1138+
11191139
static GDExtensionVariantPtr gdextension_array_operator_index(GDExtensionTypePtr p_self, GDExtensionInt p_index) {
11201140
Array *self = (Array *)p_self;
11211141
if (unlikely(p_index < 0 || p_index >= self->size())) {
@@ -1620,6 +1640,8 @@ void gdextension_setup_interface() {
16201640
REGISTER_INTERFACE_FUNC(packed_vector2_array_operator_index_const);
16211641
REGISTER_INTERFACE_FUNC(packed_vector3_array_operator_index);
16221642
REGISTER_INTERFACE_FUNC(packed_vector3_array_operator_index_const);
1643+
REGISTER_INTERFACE_FUNC(packed_vector4_array_operator_index);
1644+
REGISTER_INTERFACE_FUNC(packed_vector4_array_operator_index_const);
16231645
REGISTER_INTERFACE_FUNC(array_operator_index);
16241646
REGISTER_INTERFACE_FUNC(array_operator_index_const);
16251647
REGISTER_INTERFACE_FUNC(array_ref);

core/extension/gdextension_interface.h

+53-26
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,7 @@ typedef enum {
9696
GDEXTENSION_VARIANT_TYPE_PACKED_VECTOR2_ARRAY,
9797
GDEXTENSION_VARIANT_TYPE_PACKED_VECTOR3_ARRAY,
9898
GDEXTENSION_VARIANT_TYPE_PACKED_COLOR_ARRAY,
99+
GDEXTENSION_VARIANT_TYPE_PACKED_VECTOR4_ARRAY,
99100

100101
GDEXTENSION_VARIANT_TYPE_VARIANT_MAX
101102
} GDExtensionVariantType;
@@ -1963,32 +1964,6 @@ typedef uint8_t *(*GDExtensionInterfacePackedByteArrayOperatorIndex)(GDExtension
19631964
*/
19641965
typedef const uint8_t *(*GDExtensionInterfacePackedByteArrayOperatorIndexConst)(GDExtensionConstTypePtr p_self, GDExtensionInt p_index);
19651966

1966-
/**
1967-
* @name packed_color_array_operator_index
1968-
* @since 4.1
1969-
*
1970-
* Gets a pointer to a color in a PackedColorArray.
1971-
*
1972-
* @param p_self A pointer to a PackedColorArray object.
1973-
* @param p_index The index of the Color to get.
1974-
*
1975-
* @return A pointer to the requested Color.
1976-
*/
1977-
typedef GDExtensionTypePtr (*GDExtensionInterfacePackedColorArrayOperatorIndex)(GDExtensionTypePtr p_self, GDExtensionInt p_index);
1978-
1979-
/**
1980-
* @name packed_color_array_operator_index_const
1981-
* @since 4.1
1982-
*
1983-
* Gets a const pointer to a color in a PackedColorArray.
1984-
*
1985-
* @param p_self A const pointer to a const PackedColorArray object.
1986-
* @param p_index The index of the Color to get.
1987-
*
1988-
* @return A const pointer to the requested Color.
1989-
*/
1990-
typedef GDExtensionTypePtr (*GDExtensionInterfacePackedColorArrayOperatorIndexConst)(GDExtensionConstTypePtr p_self, GDExtensionInt p_index);
1991-
19921967
/**
19931968
* @name packed_float32_array_operator_index
19941969
* @since 4.1
@@ -2171,6 +2146,58 @@ typedef GDExtensionTypePtr (*GDExtensionInterfacePackedVector3ArrayOperatorIndex
21712146
*/
21722147
typedef GDExtensionTypePtr (*GDExtensionInterfacePackedVector3ArrayOperatorIndexConst)(GDExtensionConstTypePtr p_self, GDExtensionInt p_index);
21732148

2149+
/**
2150+
* @name packed_vector4_array_operator_index
2151+
* @since 4.3
2152+
*
2153+
* Gets a pointer to a Vector4 in a PackedVector4Array.
2154+
*
2155+
* @param p_self A pointer to a PackedVector4Array object.
2156+
* @param p_index The index of the Vector4 to get.
2157+
*
2158+
* @return A pointer to the requested Vector4.
2159+
*/
2160+
typedef GDExtensionTypePtr (*GDExtensionInterfacePackedVector4ArrayOperatorIndex)(GDExtensionTypePtr p_self, GDExtensionInt p_index);
2161+
2162+
/**
2163+
* @name packed_vector4_array_operator_index_const
2164+
* @since 4.3
2165+
*
2166+
* Gets a const pointer to a Vector4 in a PackedVector4Array.
2167+
*
2168+
* @param p_self A const pointer to a PackedVector4Array object.
2169+
* @param p_index The index of the Vector4 to get.
2170+
*
2171+
* @return A const pointer to the requested Vector4.
2172+
*/
2173+
typedef GDExtensionTypePtr (*GDExtensionInterfacePackedVector4ArrayOperatorIndexConst)(GDExtensionConstTypePtr p_self, GDExtensionInt p_index);
2174+
2175+
/**
2176+
* @name packed_color_array_operator_index
2177+
* @since 4.1
2178+
*
2179+
* Gets a pointer to a color in a PackedColorArray.
2180+
*
2181+
* @param p_self A pointer to a PackedColorArray object.
2182+
* @param p_index The index of the Color to get.
2183+
*
2184+
* @return A pointer to the requested Color.
2185+
*/
2186+
typedef GDExtensionTypePtr (*GDExtensionInterfacePackedColorArrayOperatorIndex)(GDExtensionTypePtr p_self, GDExtensionInt p_index);
2187+
2188+
/**
2189+
* @name packed_color_array_operator_index_const
2190+
* @since 4.1
2191+
*
2192+
* Gets a const pointer to a color in a PackedColorArray.
2193+
*
2194+
* @param p_self A const pointer to a PackedColorArray object.
2195+
* @param p_index The index of the Color to get.
2196+
*
2197+
* @return A const pointer to the requested Color.
2198+
*/
2199+
typedef GDExtensionTypePtr (*GDExtensionInterfacePackedColorArrayOperatorIndexConst)(GDExtensionConstTypePtr p_self, GDExtensionInt p_index);
2200+
21742201
/**
21752202
* @name array_operator_index
21762203
* @since 4.1

core/io/marshalls.cpp

+94
Original file line numberDiff line numberDiff line change
@@ -1178,6 +1178,73 @@ Error decode_variant(Variant &r_variant, const uint8_t *p_buffer, int p_len, int
11781178

11791179
r_variant = carray;
11801180

1181+
} break;
1182+
1183+
case Variant::PACKED_VECTOR4_ARRAY: {
1184+
ERR_FAIL_COND_V(len < 4, ERR_INVALID_DATA);
1185+
int32_t count = decode_uint32(buf);
1186+
buf += 4;
1187+
len -= 4;
1188+
1189+
Vector<Vector4> varray;
1190+
1191+
if (header & HEADER_DATA_FLAG_64) {
1192+
ERR_FAIL_MUL_OF(count, sizeof(double) * 4, ERR_INVALID_DATA);
1193+
ERR_FAIL_COND_V(count < 0 || count * sizeof(double) * 4 > (size_t)len, ERR_INVALID_DATA);
1194+
1195+
if (r_len) {
1196+
(*r_len) += 4; // Size of count number.
1197+
}
1198+
1199+
if (count) {
1200+
varray.resize(count);
1201+
Vector4 *w = varray.ptrw();
1202+
1203+
for (int32_t i = 0; i < count; i++) {
1204+
w[i].x = decode_double(buf + i * sizeof(double) * 4 + sizeof(double) * 0);
1205+
w[i].y = decode_double(buf + i * sizeof(double) * 4 + sizeof(double) * 1);
1206+
w[i].z = decode_double(buf + i * sizeof(double) * 4 + sizeof(double) * 2);
1207+
w[i].w = decode_double(buf + i * sizeof(double) * 4 + sizeof(double) * 3);
1208+
}
1209+
1210+
int adv = sizeof(double) * 4 * count;
1211+
1212+
if (r_len) {
1213+
(*r_len) += adv;
1214+
}
1215+
len -= adv;
1216+
buf += adv;
1217+
}
1218+
} else {
1219+
ERR_FAIL_MUL_OF(count, sizeof(float) * 4, ERR_INVALID_DATA);
1220+
ERR_FAIL_COND_V(count < 0 || count * sizeof(float) * 4 > (size_t)len, ERR_INVALID_DATA);
1221+
1222+
if (r_len) {
1223+
(*r_len) += 4; // Size of count number.
1224+
}
1225+
1226+
if (count) {
1227+
varray.resize(count);
1228+
Vector4 *w = varray.ptrw();
1229+
1230+
for (int32_t i = 0; i < count; i++) {
1231+
w[i].x = decode_float(buf + i * sizeof(float) * 4 + sizeof(float) * 0);
1232+
w[i].y = decode_float(buf + i * sizeof(float) * 4 + sizeof(float) * 1);
1233+
w[i].z = decode_float(buf + i * sizeof(float) * 4 + sizeof(float) * 2);
1234+
w[i].w = decode_float(buf + i * sizeof(float) * 4 + sizeof(float) * 3);
1235+
}
1236+
1237+
int adv = sizeof(float) * 4 * count;
1238+
1239+
if (r_len) {
1240+
(*r_len) += adv;
1241+
}
1242+
len -= adv;
1243+
buf += adv;
1244+
}
1245+
}
1246+
r_variant = varray;
1247+
11811248
} break;
11821249
default: {
11831250
ERR_FAIL_V(ERR_BUG);
@@ -1263,6 +1330,7 @@ Error encode_variant(const Variant &p_variant, uint8_t *r_buffer, int &r_len, bo
12631330
case Variant::VECTOR4:
12641331
case Variant::PACKED_VECTOR2_ARRAY:
12651332
case Variant::PACKED_VECTOR3_ARRAY:
1333+
case Variant::PACKED_VECTOR4_ARRAY:
12661334
case Variant::TRANSFORM2D:
12671335
case Variant::TRANSFORM3D:
12681336
case Variant::PROJECTION:
@@ -1946,6 +2014,32 @@ Error encode_variant(const Variant &p_variant, uint8_t *r_buffer, int &r_len, bo
19462014

19472015
r_len += 4 * 4 * len;
19482016

2017+
} break;
2018+
case Variant::PACKED_VECTOR4_ARRAY: {
2019+
Vector<Vector4> data = p_variant;
2020+
int len = data.size();
2021+
2022+
if (buf) {
2023+
encode_uint32(len, buf);
2024+
buf += 4;
2025+
}
2026+
2027+
r_len += 4;
2028+
2029+
if (buf) {
2030+
for (int i = 0; i < len; i++) {
2031+
Vector4 v = data.get(i);
2032+
2033+
encode_real(v.x, &buf[0]);
2034+
encode_real(v.y, &buf[sizeof(real_t)]);
2035+
encode_real(v.z, &buf[sizeof(real_t) * 2]);
2036+
encode_real(v.w, &buf[sizeof(real_t) * 3]);
2037+
buf += sizeof(real_t) * 4;
2038+
}
2039+
}
2040+
2041+
r_len += sizeof(real_t) * 4 * len;
2042+
19492043
} break;
19502044
default: {
19512045
ERR_FAIL_V(ERR_BUG);

core/io/packed_data_container.cpp

+1
Original file line numberDiff line numberDiff line change
@@ -244,6 +244,7 @@ uint32_t PackedDataContainer::_pack(const Variant &p_data, Vector<uint8_t> &tmpd
244244
case Variant::PACKED_VECTOR2_ARRAY:
245245
case Variant::PACKED_VECTOR3_ARRAY:
246246
case Variant::PACKED_COLOR_ARRAY:
247+
case Variant::PACKED_VECTOR4_ARRAY:
247248
case Variant::STRING_NAME:
248249
case Variant::NODE_PATH: {
249250
uint32_t pos = tmpdata.size();

core/io/resource.cpp

+2-1
Original file line numberDiff line numberDiff line change
@@ -383,7 +383,8 @@ Ref<Resource> Resource::duplicate(bool p_subresources) const {
383383
case Variant::Type::PACKED_FLOAT64_ARRAY:
384384
case Variant::Type::PACKED_STRING_ARRAY:
385385
case Variant::Type::PACKED_VECTOR2_ARRAY:
386-
case Variant::Type::PACKED_VECTOR3_ARRAY: {
386+
case Variant::Type::PACKED_VECTOR3_ARRAY:
387+
case Variant::Type::PACKED_VECTOR4_ARRAY: {
387388
r->set(E.name, p.duplicate(p_subresources));
388389
} break;
389390

0 commit comments

Comments
 (0)