72 lines
2.0 KiB
GDScript
72 lines
2.0 KiB
GDScript
@tool
|
|
extends RefCounted
|
|
|
|
## Converts Godot Variants into values that can be encoded as JSON.
|
|
|
|
|
|
static func serialize(value: Variant) -> Variant:
|
|
if value == null:
|
|
return null
|
|
match typeof(value):
|
|
TYPE_BOOL, TYPE_INT, TYPE_FLOAT, TYPE_STRING:
|
|
return value
|
|
TYPE_STRING_NAME:
|
|
return str(value)
|
|
TYPE_VECTOR2, TYPE_VECTOR2I:
|
|
return {"x": value.x, "y": value.y}
|
|
TYPE_VECTOR3, TYPE_VECTOR3I:
|
|
return {"x": value.x, "y": value.y, "z": value.z}
|
|
TYPE_VECTOR4, TYPE_VECTOR4I, TYPE_QUATERNION:
|
|
return {"x": value.x, "y": value.y, "z": value.z, "w": value.w}
|
|
TYPE_COLOR:
|
|
return {"r": value.r, "g": value.g, "b": value.b, "a": value.a}
|
|
TYPE_RECT2, TYPE_RECT2I, TYPE_AABB:
|
|
return {
|
|
"position": serialize(value.position),
|
|
"size": serialize(value.size),
|
|
}
|
|
TYPE_PLANE:
|
|
return {"normal": serialize(value.normal), "d": value.d}
|
|
TYPE_BASIS:
|
|
return {
|
|
"x": serialize(value.x),
|
|
"y": serialize(value.y),
|
|
"z": serialize(value.z),
|
|
}
|
|
TYPE_TRANSFORM2D:
|
|
return {
|
|
"x": serialize(value.x),
|
|
"y": serialize(value.y),
|
|
"origin": serialize(value.origin),
|
|
}
|
|
TYPE_TRANSFORM3D:
|
|
return {
|
|
"basis": serialize(value.basis),
|
|
"origin": serialize(value.origin),
|
|
}
|
|
TYPE_PROJECTION:
|
|
return {
|
|
"x": serialize(value.x),
|
|
"y": serialize(value.y),
|
|
"z": serialize(value.z),
|
|
"w": serialize(value.w),
|
|
}
|
|
TYPE_NODE_PATH:
|
|
return str(value)
|
|
TYPE_ARRAY, TYPE_PACKED_BYTE_ARRAY, TYPE_PACKED_INT32_ARRAY, TYPE_PACKED_INT64_ARRAY, TYPE_PACKED_FLOAT32_ARRAY, TYPE_PACKED_FLOAT64_ARRAY, TYPE_PACKED_STRING_ARRAY, TYPE_PACKED_VECTOR2_ARRAY, TYPE_PACKED_VECTOR3_ARRAY, TYPE_PACKED_VECTOR4_ARRAY, TYPE_PACKED_COLOR_ARRAY:
|
|
var arr: Array = []
|
|
for item in value:
|
|
arr.append(serialize(item))
|
|
return arr
|
|
TYPE_DICTIONARY:
|
|
var out := {}
|
|
for key in value:
|
|
out[str(key)] = serialize(value[key])
|
|
return out
|
|
TYPE_OBJECT:
|
|
if value is Resource and value.resource_path:
|
|
return value.resource_path
|
|
return str(value)
|
|
_:
|
|
return str(value)
|