@@ -416,7 +416,7 @@ impl<'de> Visitor<'de> for VariantVisitor {
416
416
}
417
417
}
418
418
} else if len == 2 {
419
- if let Some ( v) = vec2_plane_rect2_or_aabb ( & dict) {
419
+ if let Some ( v) = vec2_plane_xform_rect2_or_aabb ( & dict) {
420
420
return Ok ( v) ;
421
421
}
422
422
} else if len == 3 {
@@ -456,19 +456,17 @@ fn basis_seq<Access: ThreadAccess>(arr: &VariantArray<Access>, first: Vector3) -
456
456
457
457
fn string_tagged ( key : & str , value : Variant ) -> Option < Variant > {
458
458
let s = key;
459
- if s == value. get_type ( ) . name ( ) {
459
+ let value_type = value. get_type ( ) ;
460
+ if ( s == value_type. name ( ) )
461
+ || ( ( value_type == Option :: < ( ) > :: None . to_variant ( ) . get_type ( ) ) && ( s == "Object" ) )
462
+ || ( ( value_type == ( ) . to_variant ( ) . get_type ( ) ) && ( s == "Rid" ) )
463
+ //maybe a Basis represented as a Map, in which case visit_seq will have assumed [Vector3; 3] was a Basis
464
+ || ( ( value_type == VariantType :: Basis ) && ( s == "elements" ) )
465
+ {
460
466
return Some ( value) ;
461
- } else if s == "elements" {
462
- //maybe a Basis represented as a Map
463
- if let VariantType :: Basis = value. get_type ( ) {
464
- //visit_seq will have assumed [Vector3; 3] was a Basis
465
- return Some ( value) ;
466
- }
467
- } else if value. get_type ( ) == ( ) . to_variant ( ) . get_type ( ) {
468
- match & * s {
469
- "Object" => return Some ( Variant :: new ( ) ) ,
470
- "Rid" => return Some ( Rid :: new ( ) . to_variant ( ) ) ,
471
- _ => { }
467
+ } else if s == VariantType :: NodePath . name ( ) {
468
+ if let Some ( path) = value. try_to_string ( ) {
469
+ return Some ( NodePath :: from_str ( & * path) . to_variant ( ) ) ;
472
470
}
473
471
} else if let Some ( arr) = value. try_to_array ( ) {
474
472
if let Some ( s) = s. strip_suffix ( "Array" ) {
@@ -488,15 +486,22 @@ fn string_tagged(key: &str, value: Variant) -> Option<Variant> {
488
486
}
489
487
490
488
fn int_tagged ( key : i64 , value : Variant ) -> Option < Variant > {
489
+ //TODO: The field enums serde generates for structs could get stored as ints.
490
+ // We could either hand-write all the impls so we know what the int will be,
491
+ // or assume serde will keep the indices the same as the declaration order,
492
+ // or just not support deserializing Variants from formats that store the field
493
+ // identifier as an int (VariantDispatch should still work).
491
494
let i = key;
492
495
if i == value. get_type ( ) as i64 {
493
496
return Some ( value) ;
494
- } else if value. get_type ( ) == ( ) . to_variant ( ) . get_type ( ) {
495
- if i == VariantType :: Object as i64 {
496
- return Some ( Variant :: new ( ) ) ;
497
- } else if i == VariantType :: Rid as i64 {
498
- return Some ( Rid :: new ( ) . to_variant ( ) ) ;
499
- }
497
+ } else if ( i == VariantType :: Object as i64 )
498
+ && ( value. get_type ( ) == ( ) . to_variant ( ) . get_type ( ) )
499
+ {
500
+ return Some ( Variant :: new ( ) ) ;
501
+ } else if ( i == VariantType :: Rid as i64 )
502
+ && ( value. get_type ( ) == Option :: < ( ) > :: None . to_variant ( ) . get_type ( ) )
503
+ {
504
+ return Some ( Rid :: new ( ) . to_variant ( ) ) ;
500
505
} else if let Some ( arr) = value. try_to_array ( ) {
501
506
if i == VariantType :: ByteArray as i64 {
502
507
return Some ( ByteArray :: from_variant_array ( & arr) . to_variant ( ) ) ;
@@ -515,17 +520,20 @@ fn int_tagged(key: i64, value: Variant) -> Option<Variant> {
515
520
None
516
521
}
517
522
518
- fn vec2_plane_rect2_or_aabb ( dict : & Dictionary < Unique > ) -> Option < Variant > {
523
+ fn vec2_plane_xform_rect2_or_aabb ( dict : & Dictionary < Unique > ) -> Option < Variant > {
519
524
if let Some ( x) = get_f32 ( & dict, "x" ) {
520
525
if let Some ( y) = get_f32 ( & dict, "y" ) {
521
526
return Some ( Vector2 { x, y } . to_variant ( ) ) ;
522
527
}
523
- } else {
524
- if let Some ( normal) = dict. get ( "normal" ) . try_to_vector3 ( ) {
525
- if let Some ( d) = get_f32 ( & dict, "d" ) {
526
- return Some ( Plane { normal, d } . to_variant ( ) ) ;
527
- }
528
+ } else if let Some ( normal) = dict. get ( "normal" ) . try_to_vector3 ( ) {
529
+ if let Some ( d) = get_f32 ( & dict, "d" ) {
530
+ return Some ( Plane { normal, d } . to_variant ( ) ) ;
528
531
}
532
+ } else if let Some ( basis) = dict. get ( "basis" ) . try_to_basis ( ) {
533
+ if let Some ( origin) = dict. get ( "origin" ) . try_to_vector3 ( ) {
534
+ return Some ( Transform { basis, origin } . to_variant ( ) ) ;
535
+ }
536
+ } else {
529
537
match dict. get ( "position" ) . dispatch ( ) {
530
538
VariantDispatch :: Vector2 ( position) => {
531
539
if let Some ( size) = dict. get ( "size" ) . try_to_vector2 ( ) {
0 commit comments