@@ -14,6 +14,11 @@ static func serialize(data: Variant, max_depth: int = MAX_DEPTH) -> Variant:
1414 push_error ("Data structure too deep to serialize! Is there a circular reference?" )
1515 return str (data )
1616
17+ var depth := max_depth - 1
18+
19+ if data == null :
20+ return null
21+
1722 match typeof (data ):
1823 # Numbers
1924 TYPE_BOOL , TYPE_INT , TYPE_FLOAT :
@@ -24,35 +29,76 @@ static func serialize(data: Variant, max_depth: int = MAX_DEPTH) -> Variant:
2429 return str (data )
2530
2631 # Linalg
27- TYPE_VECTOR2 , TYPE_VECTOR2I , TYPE_RECT2 , TYPE_RECT2I , \
28- TYPE_VECTOR3 , TYPE_VECTOR3I , TYPE_VECTOR4 , TYPE_VECTOR4I , \
29- TYPE_PLANE , TYPE_QUATERNION :
30- return str (data )
32+ TYPE_VECTOR2 , TYPE_VECTOR2I :
33+ return [data .x , data .y ]
34+
35+ TYPE_VECTOR3 , TYPE_VECTOR3I :
36+ return [data .x , data .y , data .z ]
37+
38+ TYPE_VECTOR4 , TYPE_VECTOR4I , TYPE_QUATERNION :
39+ return [data .x , data .y , data .z , data .w ]
40+
41+ TYPE_RECT2 , TYPE_RECT2I , TYPE_AABB :
42+ return [serialize (data .position , depth ), serialize (data .size , depth )]
43+
44+ TYPE_PLANE :
45+ var plane := data as Plane
46+ return [plane .x , plane .y , plane .z , plane .d , serialize (plane .normal , depth )]
47+
48+ TYPE_TRANSFORM2D :
49+ var xform := data as Transform2D
50+ return [
51+ serialize (xform .x , depth ),
52+ serialize (xform .y , depth ),
53+ serialize (xform .origin , depth )
54+ ]
55+
56+ TYPE_TRANSFORM3D :
57+ var xform := data as Transform3D
58+ return [serialize (xform .basis , depth )] + [serialize (xform .origin , depth )]
59+
60+ TYPE_BASIS :
61+ var basis := data as Basis
62+ return [
63+ serialize (basis .x , depth ),
64+ serialize (basis .y , depth ),
65+ serialize (basis .z , depth )
66+ ]
3167
32- TYPE_TRANSFORM2D , TYPE_TRANSFORM3D , TYPE_AABB , TYPE_BASIS , \
3368 TYPE_PROJECTION :
34- return str (data )
69+ var projection := data as Projection
70+ return [
71+ serialize (projection .x , depth ),
72+ serialize (projection .y , depth ),
73+ serialize (projection .z , depth ),
74+ serialize (projection .w , depth )
75+ ]
3576
3677 # Other
37- TYPE_COLOR , TYPE_RID , TYPE_CALLABLE , TYPE_SIGNAL :
78+ TYPE_COLOR :
79+ var color := data as Color
80+ return [color .r , color .g , color .b , color .a ]
81+
82+ TYPE_RID , TYPE_CALLABLE , TYPE_SIGNAL :
3883 return str (data )
3984
4085 # Complex
4186 TYPE_OBJECT :
4287 var object := data as Object
4388 if object .has_method ("_to_vest" ):
44- return serialize (object ._to_vest (), max_depth - 1 )
45- return str (object ) # TODO: Convert to dictionary instead
89+ return serialize (object ._to_vest (), depth )
90+
91+ return serialize (_object_to_map (object ), depth )
4692
4793 # Arrays
4894 TYPE_PACKED_BYTE_ARRAY , TYPE_PACKED_INT32_ARRAY , TYPE_PACKED_INT64_ARRAY , \
4995 TYPE_PACKED_FLOAT32_ARRAY , TYPE_PACKED_FLOAT64_ARRAY , TYPE_PACKED_STRING_ARRAY , \
5096 TYPE_PACKED_VECTOR2_ARRAY , TYPE_PACKED_VECTOR3_ARRAY , TYPE_PACKED_COLOR_ARRAY :
51- return serialize (Array (data ), max_depth - 1 )
97+ return serialize (Array (data ), depth )
5298
5399 TYPE_ARRAY :
54100 var array := data as Array
55- return array .map (func (it ): return serialize (it , max_depth - 1 ))
101+ return array .map (func (it ): return serialize (it , depth ))
56102
57103 # Dictionary
58104 TYPE_DICTIONARY :
@@ -61,8 +107,22 @@ static func serialize(data: Variant, max_depth: int = MAX_DEPTH) -> Variant:
61107
62108 for key in dict :
63109 var value = dict .get (key )
64- result [serialize (key , max_depth - 1 )] = serialize (value , max_depth - 1 )
110+ result [serialize (key , max_depth - 1 )] = serialize (value , depth )
65111 return result
66112
67113 # Default
68114 _ : return str (data )
115+
116+ static func _object_to_map (object : Object ) -> Dictionary :
117+ var properties := object .get_property_list ().map (func (prop ): return prop ["name" ])
118+ var script := object .get_script () as Script
119+
120+ if script != null :
121+ properties = script .get_script_property_list ().map (func (prop ): return prop ["name" ])
122+
123+ var result := {}
124+ for property in properties :
125+ if property .contains (" " ): continue # Skip invalid props
126+ result [property ] = object .get (property )
127+
128+ return result
0 commit comments