Expose in builtins' members internal type & size (on top of offset) in extension_api.json
This commit is contained in:
parent
015dc492de
commit
2c2fd0820a
@ -252,63 +252,140 @@ Dictionary NativeExtensionAPIDump::generate_extension_api() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
// Member offsets sizes.
|
// Member offsets, meta types and sizes.
|
||||||
|
|
||||||
|
#define REAL_MEMBER_OFFSET(type, member) \
|
||||||
|
{ \
|
||||||
|
type, \
|
||||||
|
member, \
|
||||||
|
"float", \
|
||||||
|
sizeof(float), \
|
||||||
|
"float", \
|
||||||
|
sizeof(float), \
|
||||||
|
"double", \
|
||||||
|
sizeof(double), \
|
||||||
|
"double", \
|
||||||
|
sizeof(double), \
|
||||||
|
}
|
||||||
|
|
||||||
|
#define INT32_MEMBER_OFFSET(type, member) \
|
||||||
|
{ \
|
||||||
|
type, \
|
||||||
|
member, \
|
||||||
|
"int32", \
|
||||||
|
sizeof(int32_t), \
|
||||||
|
"int32", \
|
||||||
|
sizeof(int32_t), \
|
||||||
|
"int32", \
|
||||||
|
sizeof(int32_t), \
|
||||||
|
"int32", \
|
||||||
|
sizeof(int32_t), \
|
||||||
|
}
|
||||||
|
|
||||||
|
#define INT32_BASED_BUILTIN_MEMBER_OFFSET(type, member, member_type, member_elems) \
|
||||||
|
{ \
|
||||||
|
type, \
|
||||||
|
member, \
|
||||||
|
member_type, \
|
||||||
|
sizeof(int32_t) * member_elems, \
|
||||||
|
member_type, \
|
||||||
|
sizeof(int32_t) * member_elems, \
|
||||||
|
member_type, \
|
||||||
|
sizeof(int32_t) * member_elems, \
|
||||||
|
member_type, \
|
||||||
|
sizeof(int32_t) * member_elems, \
|
||||||
|
}
|
||||||
|
|
||||||
|
#define REAL_BASED_BUILTIN_MEMBER_OFFSET(type, member, member_type, member_elems) \
|
||||||
|
{ \
|
||||||
|
type, \
|
||||||
|
member, \
|
||||||
|
member_type, \
|
||||||
|
sizeof(float) * member_elems, \
|
||||||
|
member_type, \
|
||||||
|
sizeof(float) * member_elems, \
|
||||||
|
member_type, \
|
||||||
|
sizeof(double) * member_elems, \
|
||||||
|
member_type, \
|
||||||
|
sizeof(double) * member_elems, \
|
||||||
|
}
|
||||||
|
|
||||||
struct {
|
struct {
|
||||||
Variant::Type type;
|
Variant::Type type;
|
||||||
const char *member;
|
const char *member;
|
||||||
uint32_t offset_32_bits_real_float;
|
const char *member_meta_32_bits_real_float;
|
||||||
uint32_t offset_64_bits_real_float;
|
const uint32_t member_size_32_bits_real_float;
|
||||||
uint32_t offset_32_bits_real_double;
|
const char *member_meta_64_bits_real_float;
|
||||||
uint32_t offset_64_bits_real_double;
|
const uint32_t member_size_64_bits_real_float;
|
||||||
|
const char *member_meta_32_bits_real_double;
|
||||||
|
const uint32_t member_size_32_bits_real_double;
|
||||||
|
const char *member_meta_64_bits_real_double;
|
||||||
|
const uint32_t member_size_64_bits_real_double;
|
||||||
} member_offset_array[] = {
|
} member_offset_array[] = {
|
||||||
{ Variant::VECTOR2, "x", 0, 0, 0, 0 },
|
// Vector2
|
||||||
{ Variant::VECTOR2, "y", sizeof(float), sizeof(float), sizeof(double), sizeof(double) },
|
REAL_MEMBER_OFFSET(Variant::VECTOR2, "x"),
|
||||||
{ Variant::VECTOR2I, "x", 0, 0, 0, 0 },
|
REAL_MEMBER_OFFSET(Variant::VECTOR2, "y"),
|
||||||
{ Variant::VECTOR2I, "y", sizeof(int32_t), sizeof(int32_t), sizeof(int32_t), sizeof(int32_t) },
|
// Vector2i
|
||||||
{ Variant::RECT2, "position", 0, 0, 0, 0 },
|
INT32_MEMBER_OFFSET(Variant::VECTOR2I, "x"),
|
||||||
{ Variant::RECT2, "size", 2 * sizeof(float), 2 * sizeof(float), 2 * sizeof(double), 2 * sizeof(double) },
|
INT32_MEMBER_OFFSET(Variant::VECTOR2I, "y"),
|
||||||
{ Variant::RECT2I, "position", 0, 0, 0, 0 },
|
// Rect2
|
||||||
{ Variant::RECT2I, "size", 2 * sizeof(int32_t), 2 * sizeof(int32_t), 2 * sizeof(int32_t), 2 * sizeof(int32_t) },
|
REAL_BASED_BUILTIN_MEMBER_OFFSET(Variant::RECT2, "position", "Vector2", 2),
|
||||||
{ Variant::VECTOR3, "x", 0, 0, 0, 0 },
|
REAL_BASED_BUILTIN_MEMBER_OFFSET(Variant::RECT2, "size", "Vector2", 2),
|
||||||
{ Variant::VECTOR3, "y", sizeof(float), sizeof(float), sizeof(double), sizeof(double) },
|
// Rect2i
|
||||||
{ Variant::VECTOR3, "z", 2 * sizeof(float), 2 * sizeof(float), 2 * sizeof(double), 2 * sizeof(double) },
|
INT32_BASED_BUILTIN_MEMBER_OFFSET(Variant::RECT2I, "position", "Vector2i", 2),
|
||||||
{ Variant::VECTOR3I, "x", 0, 0, 0, 0 },
|
INT32_BASED_BUILTIN_MEMBER_OFFSET(Variant::RECT2I, "size", "Vector2i", 2),
|
||||||
{ Variant::VECTOR3I, "y", sizeof(int32_t), sizeof(int32_t), sizeof(int32_t), sizeof(int32_t) },
|
// Vector3
|
||||||
{ Variant::VECTOR3I, "z", 2 * sizeof(int32_t), 2 * sizeof(int32_t), 2 * sizeof(int32_t), 2 * sizeof(int32_t) },
|
REAL_MEMBER_OFFSET(Variant::VECTOR3, "x"),
|
||||||
{ Variant::TRANSFORM2D, "x", 0, 0, 0, 0 },
|
REAL_MEMBER_OFFSET(Variant::VECTOR3, "y"),
|
||||||
{ Variant::TRANSFORM2D, "y", 2 * sizeof(float), 2 * sizeof(float), 2 * sizeof(double), 2 * sizeof(double) },
|
REAL_MEMBER_OFFSET(Variant::VECTOR3, "z"),
|
||||||
{ Variant::TRANSFORM2D, "origin", 4 * sizeof(float), 4 * sizeof(float), 4 * sizeof(double), 4 * sizeof(double) },
|
// Vector3i
|
||||||
{ Variant::VECTOR4, "x", 0, 0, 0, 0 },
|
INT32_MEMBER_OFFSET(Variant::VECTOR3I, "x"),
|
||||||
{ Variant::VECTOR4, "y", sizeof(float), sizeof(float), sizeof(double), sizeof(double) },
|
INT32_MEMBER_OFFSET(Variant::VECTOR3I, "y"),
|
||||||
{ Variant::VECTOR4, "z", 2 * sizeof(float), 2 * sizeof(float), 2 * sizeof(double), 2 * sizeof(double) },
|
INT32_MEMBER_OFFSET(Variant::VECTOR3I, "z"),
|
||||||
{ Variant::VECTOR4, "w", 3 * sizeof(float), 3 * sizeof(float), 3 * sizeof(double), 3 * sizeof(double) },
|
// Transform2D
|
||||||
{ Variant::VECTOR4I, "x", 0, 0, 0, 0 },
|
REAL_BASED_BUILTIN_MEMBER_OFFSET(Variant::TRANSFORM2D, "x", "Vector2", 2),
|
||||||
{ Variant::VECTOR4I, "y", sizeof(int32_t), sizeof(int32_t), sizeof(int32_t), sizeof(int32_t) },
|
REAL_BASED_BUILTIN_MEMBER_OFFSET(Variant::TRANSFORM2D, "y", "Vector2", 2),
|
||||||
{ Variant::VECTOR4I, "z", 2 * sizeof(int32_t), 2 * sizeof(int32_t), 2 * sizeof(int32_t), 2 * sizeof(int32_t) },
|
REAL_BASED_BUILTIN_MEMBER_OFFSET(Variant::TRANSFORM2D, "origin", "Vector2", 2),
|
||||||
{ Variant::VECTOR4I, "w", 3 * sizeof(int32_t), 3 * sizeof(int32_t), 3 * sizeof(int32_t), 3 * sizeof(int32_t) },
|
// Vector4
|
||||||
{ Variant::PLANE, "normal", 0, 0, 0, 0 },
|
REAL_MEMBER_OFFSET(Variant::VECTOR4, "x"),
|
||||||
{ Variant::PLANE, "d", vec3_elems * sizeof(float), vec3_elems * sizeof(float), vec3_elems * sizeof(double), vec3_elems * sizeof(double) },
|
REAL_MEMBER_OFFSET(Variant::VECTOR4, "y"),
|
||||||
{ Variant::QUATERNION, "x", 0, 0, 0, 0 },
|
REAL_MEMBER_OFFSET(Variant::VECTOR4, "z"),
|
||||||
{ Variant::QUATERNION, "y", sizeof(float), sizeof(float), sizeof(double), sizeof(double) },
|
REAL_MEMBER_OFFSET(Variant::VECTOR4, "w"),
|
||||||
{ Variant::QUATERNION, "z", 2 * sizeof(float), 2 * sizeof(float), 2 * sizeof(double), 2 * sizeof(double) },
|
// Vector4i
|
||||||
{ Variant::QUATERNION, "w", 3 * sizeof(float), 3 * sizeof(float), 3 * sizeof(double), 3 * sizeof(double) },
|
INT32_MEMBER_OFFSET(Variant::VECTOR4I, "x"),
|
||||||
{ Variant::AABB, "position", 0, 0, 0, 0 },
|
INT32_MEMBER_OFFSET(Variant::VECTOR4I, "y"),
|
||||||
{ Variant::AABB, "size", vec3_elems * sizeof(float), vec3_elems * sizeof(float), vec3_elems * sizeof(double), vec3_elems * sizeof(double) },
|
INT32_MEMBER_OFFSET(Variant::VECTOR4I, "z"),
|
||||||
// Remember that basis vectors are flipped!
|
INT32_MEMBER_OFFSET(Variant::VECTOR4I, "w"),
|
||||||
{ Variant::BASIS, "x", 0, 0, 0, 0 },
|
// Plane
|
||||||
{ Variant::BASIS, "y", vec3_elems * sizeof(float), vec3_elems * sizeof(float), vec3_elems * sizeof(double), vec3_elems * sizeof(double) },
|
REAL_BASED_BUILTIN_MEMBER_OFFSET(Variant::PLANE, "normal", "Vector3", vec3_elems),
|
||||||
{ Variant::BASIS, "z", vec3_elems * 2 * sizeof(float), vec3_elems * 2 * sizeof(float), vec3_elems * 2 * sizeof(double), vec3_elems * 2 * sizeof(double) },
|
REAL_MEMBER_OFFSET(Variant::PLANE, "d"),
|
||||||
{ Variant::TRANSFORM3D, "basis", 0, 0, 0, 0 },
|
// Quaternion
|
||||||
{ Variant::TRANSFORM3D, "origin", (vec3_elems * 3) * sizeof(float), (vec3_elems * 3) * sizeof(float), (vec3_elems * 3) * sizeof(double), (vec3_elems * 3) * sizeof(double) },
|
REAL_MEMBER_OFFSET(Variant::QUATERNION, "x"),
|
||||||
{ Variant::PROJECTION, "x", 0, 0, 0, 0 },
|
REAL_MEMBER_OFFSET(Variant::QUATERNION, "y"),
|
||||||
{ Variant::PROJECTION, "y", vec4_elems * sizeof(float), vec4_elems * sizeof(float), vec4_elems * sizeof(double), vec4_elems * sizeof(double) },
|
REAL_MEMBER_OFFSET(Variant::QUATERNION, "z"),
|
||||||
{ Variant::PROJECTION, "z", vec4_elems * 2 * sizeof(float), vec4_elems * 2 * sizeof(float), vec4_elems * 2 * sizeof(double), vec4_elems * 2 * sizeof(double) },
|
REAL_MEMBER_OFFSET(Variant::QUATERNION, "w"),
|
||||||
{ Variant::PROJECTION, "w", vec4_elems * 3 * sizeof(float), vec4_elems * 3 * sizeof(float), vec4_elems * 3 * sizeof(double), vec4_elems * 3 * sizeof(double) },
|
// AABB
|
||||||
{ Variant::COLOR, "r", 0, 0, 0, 0 },
|
REAL_BASED_BUILTIN_MEMBER_OFFSET(Variant::AABB, "position", "Vector3", vec3_elems),
|
||||||
{ Variant::COLOR, "g", sizeof(float), sizeof(float), sizeof(float), sizeof(float) },
|
REAL_BASED_BUILTIN_MEMBER_OFFSET(Variant::AABB, "size", "Vector3", vec3_elems),
|
||||||
{ Variant::COLOR, "b", 2 * sizeof(float), 2 * sizeof(float), 2 * sizeof(float), 2 * sizeof(float) },
|
// Basis (remember that basis vectors are flipped!)
|
||||||
{ Variant::COLOR, "a", 3 * sizeof(float), 3 * sizeof(float), 3 * sizeof(float), 3 * sizeof(float) },
|
REAL_BASED_BUILTIN_MEMBER_OFFSET(Variant::BASIS, "x", "Vector3", vec3_elems),
|
||||||
{ Variant::NIL, nullptr, 0, 0, 0, 0 },
|
REAL_BASED_BUILTIN_MEMBER_OFFSET(Variant::BASIS, "y", "Vector3", vec3_elems),
|
||||||
|
REAL_BASED_BUILTIN_MEMBER_OFFSET(Variant::BASIS, "z", "Vector3", vec3_elems),
|
||||||
|
// Transform3D
|
||||||
|
REAL_BASED_BUILTIN_MEMBER_OFFSET(Variant::TRANSFORM3D, "basis", "Basis", vec3_elems * 3),
|
||||||
|
REAL_BASED_BUILTIN_MEMBER_OFFSET(Variant::TRANSFORM3D, "origin", "Vector3", vec3_elems),
|
||||||
|
// Projection
|
||||||
|
REAL_BASED_BUILTIN_MEMBER_OFFSET(Variant::PROJECTION, "x", "Vector4", vec4_elems),
|
||||||
|
REAL_BASED_BUILTIN_MEMBER_OFFSET(Variant::PROJECTION, "y", "Vector4", vec4_elems),
|
||||||
|
REAL_BASED_BUILTIN_MEMBER_OFFSET(Variant::PROJECTION, "z", "Vector4", vec4_elems),
|
||||||
|
REAL_BASED_BUILTIN_MEMBER_OFFSET(Variant::PROJECTION, "w", "Vector4", vec4_elems),
|
||||||
|
// Color (always composed of 4bytes floats)
|
||||||
|
{ Variant::COLOR, "r", "float", sizeof(float), "float", sizeof(float), "float", sizeof(float), "float", sizeof(float) },
|
||||||
|
{ Variant::COLOR, "g", "float", sizeof(float), "float", sizeof(float), "float", sizeof(float), "float", sizeof(float) },
|
||||||
|
{ Variant::COLOR, "b", "float", sizeof(float), "float", sizeof(float), "float", sizeof(float), "float", sizeof(float) },
|
||||||
|
{ Variant::COLOR, "a", "float", sizeof(float), "float", sizeof(float), "float", sizeof(float), "float", sizeof(float) },
|
||||||
|
// End marker, must stay last
|
||||||
|
{ Variant::NIL, nullptr, nullptr, 0, nullptr, 0, nullptr, 0, nullptr, 0 },
|
||||||
};
|
};
|
||||||
|
|
||||||
Array core_type_member_offsets;
|
Array core_type_member_offsets;
|
||||||
@ -319,15 +396,16 @@ Dictionary NativeExtensionAPIDump::generate_extension_api() {
|
|||||||
Array type_offsets;
|
Array type_offsets;
|
||||||
uint32_t idx = 0;
|
uint32_t idx = 0;
|
||||||
|
|
||||||
Variant::Type last_type = Variant::NIL;
|
Variant::Type previous_type = Variant::NIL;
|
||||||
|
|
||||||
Dictionary d2;
|
Dictionary d2;
|
||||||
Array members;
|
Array members;
|
||||||
|
uint32_t offset = 0;
|
||||||
|
|
||||||
while (true) {
|
while (true) {
|
||||||
Variant::Type t = member_offset_array[idx].type;
|
Variant::Type t = member_offset_array[idx].type;
|
||||||
if (t != last_type) {
|
if (t != previous_type) {
|
||||||
if (last_type != Variant::NIL) {
|
if (previous_type != Variant::NIL) {
|
||||||
d2["members"] = members;
|
d2["members"] = members;
|
||||||
type_offsets.push_back(d2);
|
type_offsets.push_back(d2);
|
||||||
}
|
}
|
||||||
@ -338,27 +416,35 @@ Dictionary NativeExtensionAPIDump::generate_extension_api() {
|
|||||||
String name = t == Variant::VARIANT_MAX ? String("Variant") : Variant::get_type_name(t);
|
String name = t == Variant::VARIANT_MAX ? String("Variant") : Variant::get_type_name(t);
|
||||||
d2 = Dictionary();
|
d2 = Dictionary();
|
||||||
members = Array();
|
members = Array();
|
||||||
|
offset = 0;
|
||||||
d2["name"] = name;
|
d2["name"] = name;
|
||||||
last_type = t;
|
previous_type = t;
|
||||||
}
|
}
|
||||||
Dictionary d3;
|
Dictionary d3;
|
||||||
uint32_t offset = 0;
|
const char *member_meta = nullptr;
|
||||||
|
uint32_t member_size = 0;
|
||||||
switch (i) {
|
switch (i) {
|
||||||
case 0:
|
case 0:
|
||||||
offset = member_offset_array[idx].offset_32_bits_real_float;
|
member_meta = member_offset_array[idx].member_meta_32_bits_real_float;
|
||||||
|
member_size = member_offset_array[idx].member_size_32_bits_real_float;
|
||||||
break;
|
break;
|
||||||
case 1:
|
case 1:
|
||||||
offset = member_offset_array[idx].offset_64_bits_real_float;
|
member_meta = member_offset_array[idx].member_meta_64_bits_real_float;
|
||||||
|
member_size = member_offset_array[idx].member_size_64_bits_real_float;
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
offset = member_offset_array[idx].offset_32_bits_real_double;
|
member_meta = member_offset_array[idx].member_meta_32_bits_real_double;
|
||||||
|
member_size = member_offset_array[idx].member_size_32_bits_real_double;
|
||||||
break;
|
break;
|
||||||
case 3:
|
case 3:
|
||||||
offset = member_offset_array[idx].offset_64_bits_real_double;
|
member_meta = member_offset_array[idx].member_meta_64_bits_real_double;
|
||||||
|
member_size = member_offset_array[idx].member_size_64_bits_real_double;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
d3["member"] = member_offset_array[idx].member;
|
d3["member"] = member_offset_array[idx].member;
|
||||||
d3["offset"] = offset;
|
d3["offset"] = offset;
|
||||||
|
d3["meta"] = member_meta;
|
||||||
|
offset += member_size;
|
||||||
members.push_back(d3);
|
members.push_back(d3);
|
||||||
idx++;
|
idx++;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user