@@ -601,35 +601,69 @@ bool Variant::can_convert_strict(Variant::Type p_type_from, Variant::Type p_type
601601 return false ;
602602}
603603
604- bool Variant::deep_equal (const Variant &p_variant, int p_recursion_count) const {
605- ERR_FAIL_COND_V_MSG (p_recursion_count > MAX_RECURSION, true , " Max recursion reached" );
604+ template <typename T>
605+ static bool _equal_approx_recursive (const Variant &p_a, const Variant &p_b, int p_recursion_count, bool p_approximate) {
606+ if (p_a.get_type () != p_b.get_type ()) {
607+ return false ;
608+ }
606609
607- // Containers must be handled with recursivity checks
608- switch (type) {
609- case Variant::Type::DICTIONARY: {
610- if (p_variant.type != Variant::Type::DICTIONARY) {
611- return false ;
612- }
610+ const T &a_as_t = p_a.operator T ();
611+ const T &b_as_t = p_b.operator T ();
613612
614- const Dictionary v1_as_d = Dictionary (* this );
615- const Dictionary v2_as_d = Dictionary (p_variant);
613+ return a_as_t . deep_equal ( b_as_t , p_recursion_count + 1 , p_approximate );
614+ }
616615
617- return v1_as_d.deep_equal (v2_as_d, p_recursion_count + 1 );
618- } break ;
619- case Variant::Type::ARRAY: {
620- if (p_variant.type != Variant::Type::ARRAY) {
621- return false ;
622- }
616+ template <typename T>
617+ static bool _equal_approx_primitive (const Variant &p_a, const Variant &p_b) {
618+ if (p_a.get_type () != p_b.get_type ()) {
619+ return false ;
620+ }
623621
624- const Array v1_as_a = Array (* this );
625- const Array v2_as_a = Array (p_variant );
622+ const T & a_as_t = p_a. operator T ( );
623+ const T & b_as_t = p_b. operator T ( );
626624
627- return v1_as_a.deep_equal (v2_as_a, p_recursion_count + 1 );
628- } break ;
629- default : {
630- return *this == p_variant;
631- } break ;
625+ return a_as_t .is_equal_approx (b_as_t );
626+ }
627+
628+ bool Variant::deep_equal (const Variant &p_variant, int p_recursion_count, bool p_approximate) const {
629+ ERR_FAIL_COND_V_MSG (p_recursion_count > MAX_RECURSION, true , " Max recursion reached" );
630+
631+ // Containers must be handled with recursivity checks
632+ if (type == ARRAY) {
633+ return _equal_approx_recursive<Array>(*this , p_variant, p_recursion_count, p_approximate);
634+ } else if (type == DICTIONARY) {
635+ return _equal_approx_recursive<Dictionary>(*this , p_variant, p_recursion_count, p_approximate);
636+ } else if (p_approximate) {
637+ switch (type) {
638+ case REAL:
639+ return Math::is_equal_approx ((double )*this , (double )p_variant);
640+ case VECTOR2:
641+ return _equal_approx_primitive<Vector2>(*this , p_variant);
642+ case RECT2:
643+ return _equal_approx_primitive<Rect2>(*this , p_variant);
644+ case VECTOR3:
645+ return _equal_approx_primitive<Vector3>(*this , p_variant);
646+ case TRANSFORM2D:
647+ return _equal_approx_primitive<Transform2D>(*this , p_variant);
648+ case PLANE:
649+ return _equal_approx_primitive<Plane>(*this , p_variant);
650+ case QUAT:
651+ return _equal_approx_primitive<Quat>(*this , p_variant);
652+ case AABB:
653+ return _equal_approx_primitive<::AABB>(*this , p_variant);
654+ case BASIS:
655+ return _equal_approx_primitive<Basis>(*this , p_variant);
656+ case TRANSFORM:
657+ return _equal_approx_primitive<Transform>(*this , p_variant);
658+ case DICTIONARY:
659+ return _equal_approx_recursive<Dictionary>(*this , p_variant, p_recursion_count, p_approximate);
660+ case ARRAY:
661+ return _equal_approx_recursive<Array>(*this , p_variant, p_recursion_count, p_approximate);
662+ default : {
663+ }
664+ }
632665 }
666+ return *this == p_variant;
633667}
634668
635669bool Variant::operator ==(const Variant &p_variant) const {
0 commit comments