Browse Source

Updated Variant to support Rect

Gauthier Billot 9 years ago
parent
commit
544bd1eefe
2 changed files with 58 additions and 0 deletions
  1. 24 0
      Source/Urho3D/Core/Variant.cpp
  2. 34 0
      Source/Urho3D/Core/Variant.h

+ 24 - 0
Source/Urho3D/Core/Variant.cpp

@@ -57,6 +57,7 @@ static const char* typeNames[] =
     "VariantVector",
     "VariantMap",
     "IntRect",
+    "Rect",
     "IntVector2",
     "Ptr",
     "Matrix3",
@@ -187,6 +188,9 @@ bool Variant::operator ==(const Variant& rhs) const
     case VAR_INTRECT:
         return *(reinterpret_cast<const IntRect*>(&value_)) == *(reinterpret_cast<const IntRect*>(&rhs.value_));
 
+    case VAR_RECT:
+        return *(reinterpret_cast<const Rect*>(&value_)) == *(reinterpret_cast<const Rect*>(&rhs.value_));
+
     case VAR_INTVECTOR2:
         return *(reinterpret_cast<const IntVector2*>(&value_)) == *(reinterpret_cast<const IntVector2*>(&rhs.value_));
 
@@ -324,6 +328,10 @@ void Variant::FromString(VariantType type, const char* value)
         *this = ToIntRect(value);
         break;
 
+    case VAR_RECT:
+        *this = ToRect(value);
+        break;
+
     case VAR_INTVECTOR2:
         *this = ToIntVector2(value);
         break;
@@ -423,6 +431,9 @@ String Variant::ToString() const
     case VAR_INTRECT:
         return (reinterpret_cast<const IntRect*>(&value_))->ToString();
 
+    case VAR_RECT:
+        return (reinterpret_cast<const Rect*>(&value_))->ToString();
+
     case VAR_INTVECTOR2:
         return (reinterpret_cast<const IntVector2*>(&value_))->ToString();
 
@@ -510,6 +521,9 @@ bool Variant::IsZero() const
     case VAR_INTRECT:
         return *reinterpret_cast<const IntRect*>(&value_) == IntRect::ZERO;
 
+    case VAR_RECT:
+        return *reinterpret_cast<const Rect*>(&value_) == Rect::ZERO;
+
     case VAR_INTVECTOR2:
         return *reinterpret_cast<const IntVector2*>(&value_) == IntVector2::ZERO;
 
@@ -706,6 +720,11 @@ template <> const IntRect& Variant::Get<const IntRect&>() const
     return GetIntRect();
 }
 
+template <> const Rect& Variant::Get<const Rect&>() const
+{
+    return GetRect();
+}
+
 template <> const IntVector2& Variant::Get<const IntVector2&>() const
 {
     return GetIntVector2();
@@ -801,6 +820,11 @@ template <> IntRect Variant::Get<IntRect>() const
     return GetIntRect();
 }
 
+template <> Rect Variant::Get<Rect>() const
+{
+    return GetRect();
+}
+
 template <> IntVector2 Variant::Get<IntVector2>() const
 {
     return GetIntVector2();

+ 34 - 0
Source/Urho3D/Core/Variant.h

@@ -53,6 +53,7 @@ enum VariantType
     VAR_VARIANTVECTOR,
     VAR_VARIANTMAP,
     VAR_INTRECT,
+    VAR_RECT,
     VAR_INTVECTOR2,
     VAR_PTR,
     VAR_MATRIX3,
@@ -359,6 +360,13 @@ public:
         *this = value;
     }
 
+    /// Construct from a rect.
+    Variant(const Rect& value) :
+        type_(VAR_NONE)
+    {
+        *this = value;
+    }
+
     /// Construct from an IntVector2.
     Variant(const IntVector2& value) :
         type_(VAR_NONE)
@@ -615,6 +623,14 @@ public:
         return *this;
     }
 
+    /// Assign from a rect.
+    Variant& operator =(const Rect& rhs)
+    {
+        SetType(VAR_RECT);
+        *(reinterpret_cast<Rect*>(&value_)) = rhs;
+        return *this;
+    }
+
     /// Assign from an IntVector2.
     Variant& operator =(const IntVector2& rhs)
     {
@@ -761,6 +777,12 @@ public:
         return type_ == VAR_INTRECT ? *(reinterpret_cast<const IntRect*>(&value_)) == rhs : false;
     }
 
+    /// Test for equality with a rect. To return true, both the type and value must match.
+    bool operator ==(const Rect& rhs) const
+    {
+        return type_ == VAR_RECT ? *(reinterpret_cast<const Rect*>(&value_)) == rhs : false;
+    }
+
     /// Test for equality with an IntVector2. To return true, both the type and value must match.
     bool operator ==(const IntVector2& rhs) const
     {
@@ -859,6 +881,9 @@ public:
     /// Test for inequality with an integer rect.
     bool operator !=(const IntRect& rhs) const { return !(*this == rhs); }
 
+    /// Test for inequality with a rect.
+    bool operator !=(const Rect& rhs) const { return !(*this == rhs); }
+
     /// Test for inequality with an IntVector2.
     bool operator !=(const IntVector2& rhs) const { return !(*this == rhs); }
 
@@ -1020,6 +1045,9 @@ public:
     /// Return an integer rect or empty on type mismatch.
     const IntRect& GetIntRect() const { return type_ == VAR_INTRECT ? *reinterpret_cast<const IntRect*>(&value_) : IntRect::ZERO; }
 
+    /// Return an integer rect or empty on type mismatch.
+    const Rect& GetRect() const { return type_ == VAR_RECT ? *reinterpret_cast<const Rect*>(&value_) : Rect::ZERO; }
+
     /// Return an IntVector2 or empty on type mismatch.
     const IntVector2& GetIntVector2() const
     {
@@ -1155,6 +1183,8 @@ template <> inline VariantType GetVariantType<VariantMap>() { return VAR_VARIANT
 
 template <> inline VariantType GetVariantType<IntRect>() { return VAR_INTRECT; }
 
+template <> inline VariantType GetVariantType<Rect>() { return VAR_RECT; }
+
 template <> inline VariantType GetVariantType<IntVector2>() { return VAR_INTVECTOR2; }
 
 template <> inline VariantType GetVariantType<Matrix3>() { return VAR_MATRIX3; }
@@ -1190,6 +1220,8 @@ template <> URHO3D_API const String& Variant::Get<const String&>() const;
 
 template <> URHO3D_API const IntRect& Variant::Get<const IntRect&>() const;
 
+template <> URHO3D_API const Rect& Variant::Get<const Rect&>() const;
+
 template <> URHO3D_API const IntVector2& Variant::Get<const IntVector2&>() const;
 
 template <> URHO3D_API const PODVector<unsigned char>& Variant::Get<const PODVector<unsigned char>&>() const;
@@ -1228,6 +1260,8 @@ template <> URHO3D_API String Variant::Get<String>() const;
 
 template <> URHO3D_API IntRect Variant::Get<IntRect>() const;
 
+template <> URHO3D_API Rect Variant::Get<Rect>() const;
+
 template <> URHO3D_API IntVector2 Variant::Get<IntVector2>() const;
 
 template <> URHO3D_API PODVector<unsigned char> Variant::Get<PODVector<unsigned char> >() const;