瀏覽代碼

Minor comment edits and missing bindings. Move VAR_RECT last in the enum to not break potential binary scenes/prefabs. Set StaticSprite2D rect attribute default values to Rect::ZERO for more pleasant editing. Editing of VAR_RECT attributes.

Lasse Öörni 9 年之前
父節點
當前提交
467729bae7

+ 10 - 0
Source/Urho3D/AngelScript/CoreAPI.cpp

@@ -262,6 +262,11 @@ static void ConstructVariantVariantMap(const VariantMap& value, Variant* ptr)
     new(ptr) Variant(value);
     new(ptr) Variant(value);
 }
 }
 
 
+static void ConstructVariantRect(const Rect& value, Variant* ptr)
+{
+    new(ptr) Variant(value);
+}
+
 static void ConstructVariantIntRect(const IntRect& value, Variant* ptr)
 static void ConstructVariantIntRect(const IntRect& value, Variant* ptr)
 {
 {
     new(ptr) Variant(value);
     new(ptr) Variant(value);
@@ -456,6 +461,7 @@ static void RegisterVariant(asIScriptEngine* engine)
     engine->RegisterEnumValue("VariantType", "VAR_MATRIX4", VAR_MATRIX4);
     engine->RegisterEnumValue("VariantType", "VAR_MATRIX4", VAR_MATRIX4);
     engine->RegisterEnumValue("VariantType", "VAR_DOUBLE", VAR_DOUBLE);
     engine->RegisterEnumValue("VariantType", "VAR_DOUBLE", VAR_DOUBLE);
     engine->RegisterEnumValue("VariantType", "VAR_STRINGVECTOR", VAR_STRINGVECTOR);
     engine->RegisterEnumValue("VariantType", "VAR_STRINGVECTOR", VAR_STRINGVECTOR);
+    engine->RegisterEnumValue("VariantType", "VAR_RECT", VAR_RECT);
 
 
     engine->RegisterObjectType("ResourceRef", sizeof(ResourceRef), asOBJ_VALUE | asOBJ_POD | asOBJ_APP_CLASS_CK);
     engine->RegisterObjectType("ResourceRef", sizeof(ResourceRef), asOBJ_VALUE | asOBJ_POD | asOBJ_APP_CLASS_CK);
     engine->RegisterObjectBehaviour("ResourceRef", asBEHAVE_CONSTRUCT, "void f()", asFUNCTION(ConstructResourceRef), asCALL_CDECL_OBJLAST);
     engine->RegisterObjectBehaviour("ResourceRef", asBEHAVE_CONSTRUCT, "void f()", asFUNCTION(ConstructResourceRef), asCALL_CDECL_OBJLAST);
@@ -505,6 +511,7 @@ static void RegisterVariant(asIScriptEngine* engine)
     engine->RegisterObjectBehaviour("Variant", asBEHAVE_CONSTRUCT, "void f(const Array<Variant>@+)", asFUNCTION(ConstructVariantVariantVector), asCALL_CDECL_OBJLAST);
     engine->RegisterObjectBehaviour("Variant", asBEHAVE_CONSTRUCT, "void f(const Array<Variant>@+)", asFUNCTION(ConstructVariantVariantVector), asCALL_CDECL_OBJLAST);
     engine->RegisterObjectBehaviour("Variant", asBEHAVE_CONSTRUCT, "void f(const Array<String>@+)", asFUNCTION(ConstructVariantStringVector), asCALL_CDECL_OBJLAST);
     engine->RegisterObjectBehaviour("Variant", asBEHAVE_CONSTRUCT, "void f(const Array<String>@+)", asFUNCTION(ConstructVariantStringVector), asCALL_CDECL_OBJLAST);
     engine->RegisterObjectBehaviour("Variant", asBEHAVE_CONSTRUCT, "void f(const VariantMap&in)", asFUNCTION(ConstructVariantVariantMap), asCALL_CDECL_OBJLAST);
     engine->RegisterObjectBehaviour("Variant", asBEHAVE_CONSTRUCT, "void f(const VariantMap&in)", asFUNCTION(ConstructVariantVariantMap), asCALL_CDECL_OBJLAST);
+    engine->RegisterObjectBehaviour("Variant", asBEHAVE_CONSTRUCT, "void f(const Rect&in)", asFUNCTION(ConstructVariantRect), asCALL_CDECL_OBJLAST);
     engine->RegisterObjectBehaviour("Variant", asBEHAVE_CONSTRUCT, "void f(const IntRect&in)", asFUNCTION(ConstructVariantIntRect), asCALL_CDECL_OBJLAST);
     engine->RegisterObjectBehaviour("Variant", asBEHAVE_CONSTRUCT, "void f(const IntRect&in)", asFUNCTION(ConstructVariantIntRect), asCALL_CDECL_OBJLAST);
     engine->RegisterObjectBehaviour("Variant", asBEHAVE_CONSTRUCT, "void f(const IntVector2&in)", asFUNCTION(ConstructVariantIntVector2), asCALL_CDECL_OBJLAST);
     engine->RegisterObjectBehaviour("Variant", asBEHAVE_CONSTRUCT, "void f(const IntVector2&in)", asFUNCTION(ConstructVariantIntVector2), asCALL_CDECL_OBJLAST);
     engine->RegisterObjectBehaviour("Variant", asBEHAVE_CONSTRUCT, "void f(RefCounted@+)", asFUNCTION(ConstructVariantPtr), asCALL_CDECL_OBJLAST);
     engine->RegisterObjectBehaviour("Variant", asBEHAVE_CONSTRUCT, "void f(RefCounted@+)", asFUNCTION(ConstructVariantPtr), asCALL_CDECL_OBJLAST);
@@ -534,6 +541,7 @@ static void RegisterVariant(asIScriptEngine* engine)
     engine->RegisterObjectMethod("Variant", "Variant& opAssign(const Array<Variant>@+)", asFUNCTION(VariantAssignVariantVector), asCALL_CDECL_OBJLAST);
     engine->RegisterObjectMethod("Variant", "Variant& opAssign(const Array<Variant>@+)", asFUNCTION(VariantAssignVariantVector), asCALL_CDECL_OBJLAST);
     engine->RegisterObjectMethod("Variant", "Variant& opAssign(const Array<String>@+)", asFUNCTION(VariantAssignStringVector), asCALL_CDECL_OBJLAST);
     engine->RegisterObjectMethod("Variant", "Variant& opAssign(const Array<String>@+)", asFUNCTION(VariantAssignStringVector), asCALL_CDECL_OBJLAST);
     engine->RegisterObjectMethod("Variant", "Variant& opAssign(const VariantMap&in)", asMETHODPR(Variant, operator =, (const VariantMap&), Variant&), asCALL_THISCALL);
     engine->RegisterObjectMethod("Variant", "Variant& opAssign(const VariantMap&in)", asMETHODPR(Variant, operator =, (const VariantMap&), Variant&), asCALL_THISCALL);
+    engine->RegisterObjectMethod("Variant", "Variant& opAssign(const Rect&in)", asMETHODPR(Variant, operator =, (const Rect&), Variant&), asCALL_THISCALL);
     engine->RegisterObjectMethod("Variant", "Variant& opAssign(const IntRect&in)", asMETHODPR(Variant, operator =, (const IntRect&), Variant&), asCALL_THISCALL);
     engine->RegisterObjectMethod("Variant", "Variant& opAssign(const IntRect&in)", asMETHODPR(Variant, operator =, (const IntRect&), Variant&), asCALL_THISCALL);
     engine->RegisterObjectMethod("Variant", "Variant& opAssign(const IntVector2&in)", asMETHODPR(Variant, operator =, (const IntVector2&), Variant&), asCALL_THISCALL);
     engine->RegisterObjectMethod("Variant", "Variant& opAssign(const IntVector2&in)", asMETHODPR(Variant, operator =, (const IntVector2&), Variant&), asCALL_THISCALL);
     engine->RegisterObjectMethod("Variant", "Variant& opAssign(RefCounted@+)", asMETHODPR(Variant, operator =, (RefCounted*), Variant&), asCALL_THISCALL);
     engine->RegisterObjectMethod("Variant", "Variant& opAssign(RefCounted@+)", asMETHODPR(Variant, operator =, (RefCounted*), Variant&), asCALL_THISCALL);
@@ -559,6 +567,7 @@ static void RegisterVariant(asIScriptEngine* engine)
     engine->RegisterObjectMethod("Variant", "bool opEquals(const Array<Variant>@+)", asFUNCTION(VariantEqualsVariantVector), asCALL_CDECL_OBJLAST);
     engine->RegisterObjectMethod("Variant", "bool opEquals(const Array<Variant>@+)", asFUNCTION(VariantEqualsVariantVector), asCALL_CDECL_OBJLAST);
     engine->RegisterObjectMethod("Variant", "bool opEquals(const Array<String>@+)", asFUNCTION(VariantEqualsStringVector), asCALL_CDECL_OBJLAST);
     engine->RegisterObjectMethod("Variant", "bool opEquals(const Array<String>@+)", asFUNCTION(VariantEqualsStringVector), asCALL_CDECL_OBJLAST);
     engine->RegisterObjectMethod("Variant", "bool opEquals(const VariantMap&in) const", asMETHODPR(Variant, operator ==, (const VariantMap&) const, bool), asCALL_THISCALL);
     engine->RegisterObjectMethod("Variant", "bool opEquals(const VariantMap&in) const", asMETHODPR(Variant, operator ==, (const VariantMap&) const, bool), asCALL_THISCALL);
+    engine->RegisterObjectMethod("Variant", "bool opEquals(const Rect&in) const", asMETHODPR(Variant, operator ==, (const Rect&) const, bool), asCALL_THISCALL);
     engine->RegisterObjectMethod("Variant", "bool opEquals(const IntRect&in) const", asMETHODPR(Variant, operator ==, (const IntRect&) const, bool), asCALL_THISCALL);
     engine->RegisterObjectMethod("Variant", "bool opEquals(const IntRect&in) const", asMETHODPR(Variant, operator ==, (const IntRect&) const, bool), asCALL_THISCALL);
     engine->RegisterObjectMethod("Variant", "bool opEquals(const IntVector2&in) const", asMETHODPR(Variant, operator ==, (const IntVector2&) const, bool), asCALL_THISCALL);
     engine->RegisterObjectMethod("Variant", "bool opEquals(const IntVector2&in) const", asMETHODPR(Variant, operator ==, (const IntVector2&) const, bool), asCALL_THISCALL);
     engine->RegisterObjectMethod("Variant", "bool opEquals(RefCounted@+) const", asMETHODPR(Variant, operator ==, (RefCounted*) const, bool), asCALL_THISCALL);
     engine->RegisterObjectMethod("Variant", "bool opEquals(RefCounted@+) const", asMETHODPR(Variant, operator ==, (RefCounted*) const, bool), asCALL_THISCALL);
@@ -583,6 +592,7 @@ static void RegisterVariant(asIScriptEngine* engine)
     engine->RegisterObjectMethod("Variant", "Array<Variant>@ GetVariantVector() const", asFUNCTION(VariantGetVariantVector), asCALL_CDECL_OBJLAST);
     engine->RegisterObjectMethod("Variant", "Array<Variant>@ GetVariantVector() const", asFUNCTION(VariantGetVariantVector), asCALL_CDECL_OBJLAST);
     engine->RegisterObjectMethod("Variant", "Array<String>@ GetStringVector() const", asFUNCTION(VariantGetStringVector), asCALL_CDECL_OBJLAST);
     engine->RegisterObjectMethod("Variant", "Array<String>@ GetStringVector() const", asFUNCTION(VariantGetStringVector), asCALL_CDECL_OBJLAST);
     engine->RegisterObjectMethod("Variant", "const VariantMap& GetVariantMap() const", asMETHOD(Variant, GetVariantMap), asCALL_THISCALL);
     engine->RegisterObjectMethod("Variant", "const VariantMap& GetVariantMap() const", asMETHOD(Variant, GetVariantMap), asCALL_THISCALL);
+    engine->RegisterObjectMethod("Variant", "const Rect& GetRect() const", asMETHOD(Variant, GetRect), asCALL_THISCALL);
     engine->RegisterObjectMethod("Variant", "const IntRect& GetIntRect() const", asMETHOD(Variant, GetIntRect), asCALL_THISCALL);
     engine->RegisterObjectMethod("Variant", "const IntRect& GetIntRect() const", asMETHOD(Variant, GetIntRect), asCALL_THISCALL);
     engine->RegisterObjectMethod("Variant", "const IntVector2& GetIntVector2() const", asMETHOD(Variant, GetIntVector2), asCALL_THISCALL);
     engine->RegisterObjectMethod("Variant", "const IntVector2& GetIntVector2() const", asMETHOD(Variant, GetIntVector2), asCALL_THISCALL);
     engine->RegisterObjectMethod("Variant", "RefCounted@+ GetPtr() const", asMETHOD(Variant, GetPtr), asCALL_THISCALL);
     engine->RegisterObjectMethod("Variant", "RefCounted@+ GetPtr() const", asMETHOD(Variant, GetPtr), asCALL_THISCALL);

+ 22 - 22
Source/Urho3D/Core/Variant.cpp

@@ -57,7 +57,6 @@ static const char* typeNames[] =
     "VariantVector",
     "VariantVector",
     "VariantMap",
     "VariantMap",
     "IntRect",
     "IntRect",
-    "Rect",
     "IntVector2",
     "IntVector2",
     "Ptr",
     "Ptr",
     "Matrix3",
     "Matrix3",
@@ -65,6 +64,7 @@ static const char* typeNames[] =
     "Matrix4",
     "Matrix4",
     "Double",
     "Double",
     "StringVector",
     "StringVector",
+    "Rect",
     0
     0
 };
 };
 
 
@@ -188,9 +188,6 @@ bool Variant::operator ==(const Variant& rhs) const
     case VAR_INTRECT:
     case VAR_INTRECT:
         return *(reinterpret_cast<const IntRect*>(&value_)) == *(reinterpret_cast<const IntRect*>(&rhs.value_));
         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:
     case VAR_INTVECTOR2:
         return *(reinterpret_cast<const IntVector2*>(&value_)) == *(reinterpret_cast<const IntVector2*>(&rhs.value_));
         return *(reinterpret_cast<const IntVector2*>(&value_)) == *(reinterpret_cast<const IntVector2*>(&rhs.value_));
 
 
@@ -206,6 +203,9 @@ bool Variant::operator ==(const Variant& rhs) const
     case VAR_DOUBLE:
     case VAR_DOUBLE:
         return *(reinterpret_cast<const double*>(&value_)) == *(reinterpret_cast<const double*>(&rhs.value_));
         return *(reinterpret_cast<const double*>(&value_)) == *(reinterpret_cast<const double*>(&rhs.value_));
 
 
+    case VAR_RECT:
+        return *(reinterpret_cast<const Rect*>(&value_)) == *(reinterpret_cast<const Rect*>(&rhs.value_));
+
     default:
     default:
         return true;
         return true;
     }
     }
@@ -328,10 +328,6 @@ void Variant::FromString(VariantType type, const char* value)
         *this = ToIntRect(value);
         *this = ToIntRect(value);
         break;
         break;
 
 
-    case VAR_RECT:
-        *this = ToRect(value);
-        break;
-
     case VAR_INTVECTOR2:
     case VAR_INTVECTOR2:
         *this = ToIntVector2(value);
         *this = ToIntVector2(value);
         break;
         break;
@@ -357,6 +353,10 @@ void Variant::FromString(VariantType type, const char* value)
         *this = ToDouble(value);
         *this = ToDouble(value);
         break;
         break;
 
 
+    case VAR_RECT:
+        *this = ToRect(value);
+        break;
+
     default:
     default:
         SetType(VAR_NONE);
         SetType(VAR_NONE);
     }
     }
@@ -431,9 +431,6 @@ String Variant::ToString() const
     case VAR_INTRECT:
     case VAR_INTRECT:
         return (reinterpret_cast<const IntRect*>(&value_))->ToString();
         return (reinterpret_cast<const IntRect*>(&value_))->ToString();
 
 
-    case VAR_RECT:
-        return (reinterpret_cast<const Rect*>(&value_))->ToString();
-
     case VAR_INTVECTOR2:
     case VAR_INTVECTOR2:
         return (reinterpret_cast<const IntVector2*>(&value_))->ToString();
         return (reinterpret_cast<const IntVector2*>(&value_))->ToString();
 
 
@@ -449,6 +446,9 @@ String Variant::ToString() const
     case VAR_DOUBLE:
     case VAR_DOUBLE:
         return String(*reinterpret_cast<const double*>(&value_));
         return String(*reinterpret_cast<const double*>(&value_));
 
 
+    case VAR_RECT:
+        return (reinterpret_cast<const Rect*>(&value_))->ToString();
+
     default:
     default:
         // VAR_RESOURCEREF, VAR_RESOURCEREFLIST, VAR_VARIANTVECTOR, VAR_STRINGVECTOR, VAR_VARIANTMAP
         // VAR_RESOURCEREF, VAR_RESOURCEREFLIST, VAR_VARIANTVECTOR, VAR_STRINGVECTOR, VAR_VARIANTMAP
         // Reference string serialization requires typehash-to-name mapping from the context. Can not support here
         // Reference string serialization requires typehash-to-name mapping from the context. Can not support here
@@ -521,9 +521,6 @@ bool Variant::IsZero() const
     case VAR_INTRECT:
     case VAR_INTRECT:
         return *reinterpret_cast<const IntRect*>(&value_) == IntRect::ZERO;
         return *reinterpret_cast<const IntRect*>(&value_) == IntRect::ZERO;
 
 
-    case VAR_RECT:
-        return *reinterpret_cast<const Rect*>(&value_) == Rect::ZERO;
-
     case VAR_INTVECTOR2:
     case VAR_INTVECTOR2:
         return *reinterpret_cast<const IntVector2*>(&value_) == IntVector2::ZERO;
         return *reinterpret_cast<const IntVector2*>(&value_) == IntVector2::ZERO;
 
 
@@ -542,6 +539,9 @@ bool Variant::IsZero() const
     case VAR_DOUBLE:
     case VAR_DOUBLE:
         return *reinterpret_cast<const double*>(&value_) == 0.0;
         return *reinterpret_cast<const double*>(&value_) == 0.0;
 
 
+    case VAR_RECT:
+        return *reinterpret_cast<const Rect*>(&value_) == Rect::ZERO;
+
     default:
     default:
         return true;
         return true;
     }
     }
@@ -715,14 +715,14 @@ template <> const String& Variant::Get<const String&>() const
     return GetString();
     return GetString();
 }
 }
 
 
-template <> const IntRect& Variant::Get<const IntRect&>() const
+template <> const Rect& Variant::Get<const Rect&>() const
 {
 {
-    return GetIntRect();
+    return GetRect();
 }
 }
 
 
-template <> const Rect& Variant::Get<const Rect&>() const
+template <> const IntRect& Variant::Get<const IntRect&>() const
 {
 {
-    return GetRect();
+    return GetIntRect();
 }
 }
 
 
 template <> const IntVector2& Variant::Get<const IntVector2&>() const
 template <> const IntVector2& Variant::Get<const IntVector2&>() const
@@ -815,14 +815,14 @@ template <> String Variant::Get<String>() const
     return GetString();
     return GetString();
 }
 }
 
 
-template <> IntRect Variant::Get<IntRect>() const
+template <> Rect Variant::Get<Rect>() const
 {
 {
-    return GetIntRect();
+    return GetRect();
 }
 }
 
 
-template <> Rect Variant::Get<Rect>() const
+template <> IntRect Variant::Get<IntRect>() const
 {
 {
-    return GetRect();
+    return GetIntRect();
 }
 }
 
 
 template <> IntVector2 Variant::Get<IntVector2>() const
 template <> IntVector2 Variant::Get<IntVector2>() const

+ 31 - 31
Source/Urho3D/Core/Variant.h

@@ -53,7 +53,6 @@ enum VariantType
     VAR_VARIANTVECTOR,
     VAR_VARIANTVECTOR,
     VAR_VARIANTMAP,
     VAR_VARIANTMAP,
     VAR_INTRECT,
     VAR_INTRECT,
-    VAR_RECT,
     VAR_INTVECTOR2,
     VAR_INTVECTOR2,
     VAR_PTR,
     VAR_PTR,
     VAR_MATRIX3,
     VAR_MATRIX3,
@@ -61,6 +60,7 @@ enum VariantType
     VAR_MATRIX4,
     VAR_MATRIX4,
     VAR_DOUBLE,
     VAR_DOUBLE,
     VAR_STRINGVECTOR,
     VAR_STRINGVECTOR,
+    VAR_RECT,
     MAX_VAR_TYPES
     MAX_VAR_TYPES
 };
 };
 
 
@@ -353,15 +353,15 @@ public:
         *this = value;
         *this = value;
     }
     }
 
 
-    /// Construct from an integer rect.
-    Variant(const IntRect& value) :
+    /// Construct from a rect.
+    Variant(const Rect& value) :
         type_(VAR_NONE)
         type_(VAR_NONE)
     {
     {
         *this = value;
         *this = value;
     }
     }
 
 
-    /// Construct from a rect.
-    Variant(const Rect& value) :
+    /// Construct from an integer rect.
+    Variant(const IntRect& value) :
         type_(VAR_NONE)
         type_(VAR_NONE)
     {
     {
         *this = value;
         *this = value;
@@ -615,14 +615,6 @@ public:
         return *this;
         return *this;
     }
     }
 
 
-    /// Assign from an integer rect.
-    Variant& operator =(const IntRect& rhs)
-    {
-        SetType(VAR_INTRECT);
-        *(reinterpret_cast<IntRect*>(&value_)) = rhs;
-        return *this;
-    }
-
     /// Assign from a rect.
     /// Assign from a rect.
     Variant& operator =(const Rect& rhs)
     Variant& operator =(const Rect& rhs)
     {
     {
@@ -631,6 +623,14 @@ public:
         return *this;
         return *this;
     }
     }
 
 
+    /// Assign from an integer rect.
+    Variant& operator =(const IntRect& rhs)
+    {
+        SetType(VAR_INTRECT);
+        *(reinterpret_cast<IntRect*>(&value_)) = rhs;
+        return *this;
+    }
+
     /// Assign from an IntVector2.
     /// Assign from an IntVector2.
     Variant& operator =(const IntVector2& rhs)
     Variant& operator =(const IntVector2& rhs)
     {
     {
@@ -771,18 +771,18 @@ public:
         return type_ == VAR_VARIANTMAP ? *(reinterpret_cast<const VariantMap*>(&value_)) == rhs : false;
         return type_ == VAR_VARIANTMAP ? *(reinterpret_cast<const VariantMap*>(&value_)) == rhs : false;
     }
     }
 
 
-    /// Test for equality with an integer rect. To return true, both the type and value must match.
-    bool operator ==(const IntRect& rhs) const
-    {
-        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.
     /// Test for equality with a rect. To return true, both the type and value must match.
     bool operator ==(const Rect& rhs) const
     bool operator ==(const Rect& rhs) const
     {
     {
         return type_ == VAR_RECT ? *(reinterpret_cast<const Rect*>(&value_)) == rhs : false;
         return type_ == VAR_RECT ? *(reinterpret_cast<const Rect*>(&value_)) == rhs : false;
     }
     }
 
 
+    /// Test for equality with an integer rect. To return true, both the type and value must match.
+    bool operator ==(const IntRect& rhs) const
+    {
+        return type_ == VAR_INTRECT ? *(reinterpret_cast<const IntRect*>(&value_)) == rhs : false;
+    }
+
     /// Test for equality with an IntVector2. To return true, both the type and value must match.
     /// Test for equality with an IntVector2. To return true, both the type and value must match.
     bool operator ==(const IntVector2& rhs) const
     bool operator ==(const IntVector2& rhs) const
     {
     {
@@ -878,12 +878,12 @@ public:
     /// Test for inequality with a variant map.
     /// Test for inequality with a variant map.
     bool operator !=(const VariantMap& rhs) const { return !(*this == rhs); }
     bool operator !=(const VariantMap& rhs) const { return !(*this == rhs); }
 
 
-    /// Test for inequality with an integer rect.
-    bool operator !=(const IntRect& rhs) const { return !(*this == rhs); }
-
     /// Test for inequality with a rect.
     /// Test for inequality with a rect.
     bool operator !=(const Rect& rhs) const { return !(*this == rhs); }
     bool operator !=(const Rect& rhs) const { return !(*this == rhs); }
 
 
+    /// Test for inequality with an integer rect.
+    bool operator !=(const IntRect& rhs) const { return !(*this == rhs); }
+
     /// Test for inequality with an IntVector2.
     /// Test for inequality with an IntVector2.
     bool operator !=(const IntVector2& rhs) const { return !(*this == rhs); }
     bool operator !=(const IntVector2& rhs) const { return !(*this == rhs); }
 
 
@@ -1042,11 +1042,11 @@ public:
         return type_ == VAR_VARIANTMAP ? *reinterpret_cast<const VariantMap*>(&value_) : emptyVariantMap;
         return type_ == VAR_VARIANTMAP ? *reinterpret_cast<const VariantMap*>(&value_) : emptyVariantMap;
     }
     }
 
 
-    /// 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 a rect or empty on type mismatch.
+    const Rect& GetRect() const { return type_ == VAR_RECT ? *reinterpret_cast<const Rect*>(&value_) : Rect::ZERO; }
 
 
     /// Return an integer rect or empty on type mismatch.
     /// Return an integer rect or empty on type mismatch.
-    const Rect& GetRect() const { return type_ == VAR_RECT ? *reinterpret_cast<const Rect*>(&value_) : Rect::ZERO; }
+    const IntRect& GetIntRect() const { return type_ == VAR_INTRECT ? *reinterpret_cast<const IntRect*>(&value_) : IntRect::ZERO; }
 
 
     /// Return an IntVector2 or empty on type mismatch.
     /// Return an IntVector2 or empty on type mismatch.
     const IntVector2& GetIntVector2() const
     const IntVector2& GetIntVector2() const
@@ -1181,10 +1181,10 @@ template <> inline VariantType GetVariantType<StringVector>() { return VAR_STRIN
 
 
 template <> inline VariantType GetVariantType<VariantMap>() { return VAR_VARIANTMAP; }
 template <> inline VariantType GetVariantType<VariantMap>() { return VAR_VARIANTMAP; }
 
 
-template <> inline VariantType GetVariantType<IntRect>() { return VAR_INTRECT; }
-
 template <> inline VariantType GetVariantType<Rect>() { return VAR_RECT; }
 template <> inline VariantType GetVariantType<Rect>() { return VAR_RECT; }
 
 
+template <> inline VariantType GetVariantType<IntRect>() { return VAR_INTRECT; }
+
 template <> inline VariantType GetVariantType<IntVector2>() { return VAR_INTVECTOR2; }
 template <> inline VariantType GetVariantType<IntVector2>() { return VAR_INTVECTOR2; }
 
 
 template <> inline VariantType GetVariantType<Matrix3>() { return VAR_MATRIX3; }
 template <> inline VariantType GetVariantType<Matrix3>() { return VAR_MATRIX3; }
@@ -1218,10 +1218,10 @@ template <> URHO3D_API const Color& Variant::Get<const Color&>() const;
 
 
 template <> URHO3D_API const String& Variant::Get<const String&>() const;
 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 Rect& Variant::Get<const Rect&>() const;
 
 
+template <> URHO3D_API const IntRect& Variant::Get<const IntRect&>() const;
+
 template <> URHO3D_API const IntVector2& Variant::Get<const IntVector2&>() 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;
 template <> URHO3D_API const PODVector<unsigned char>& Variant::Get<const PODVector<unsigned char>&>() const;
@@ -1258,10 +1258,10 @@ template <> URHO3D_API Color Variant::Get<Color>() const;
 
 
 template <> URHO3D_API String Variant::Get<String>() const;
 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 Rect Variant::Get<Rect>() const;
 
 
+template <> URHO3D_API IntRect Variant::Get<IntRect>() const;
+
 template <> URHO3D_API IntVector2 Variant::Get<IntVector2>() const;
 template <> URHO3D_API IntVector2 Variant::Get<IntVector2>() const;
 
 
 template <> URHO3D_API PODVector<unsigned char> Variant::Get<PODVector<unsigned char> >() const;
 template <> URHO3D_API PODVector<unsigned char> Variant::Get<PODVector<unsigned char> >() const;

+ 2 - 0
Source/Urho3D/LuaScript/pkgs/Core/Variant.pkg

@@ -27,6 +27,7 @@ enum VariantType
     VAR_MATRIX4,
     VAR_MATRIX4,
     VAR_DOUBLE,
     VAR_DOUBLE,
     VAR_STRINGVECTOR,
     VAR_STRINGVECTOR,
+    VAR_RECT,
     MAX_VAR_TYPES
     MAX_VAR_TYPES
 };
 };
 
 
@@ -94,6 +95,7 @@ class Variant
     const Vector<Variant>& GetVariantVector() const;
     const Vector<Variant>& GetVariantVector() const;
     const VariantMap& GetVariantMap() const;
     const VariantMap& GetVariantMap() const;
     const Vector<String>& GetStringVector() const;
     const Vector<String>& GetStringVector() const;
+    const Rect& GetRect() const;
     const IntRect& GetIntRect() const;
     const IntRect& GetIntRect() const;
     const IntVector2& GetIntVector2() const;
     const IntVector2& GetIntVector2() const;
     RefCounted* GetPtr(const char* type) const;
     RefCounted* GetPtr(const char* type) const;

+ 8 - 0
Source/Urho3D/LuaScript/pkgs/Urho2D/StaticSprite2D.pkg

@@ -12,6 +12,10 @@ public:
     void SetAlpha(float alpha);
     void SetAlpha(float alpha);
     void SetUseHotSpot(bool useHotSpot);
     void SetUseHotSpot(bool useHotSpot);
     void SetHotSpot(const Vector2& hotspot);
     void SetHotSpot(const Vector2& hotspot);
+    void SetUseDrawRect(bool useDrawRect);
+    void SetDrawRect(const Rect &rect);
+    void SetUseTextureRect(bool useTextureRect);
+    void SetTextureRect(const Rect &rect);
     void SetCustomMaterial(Material* customMaterial);
     void SetCustomMaterial(Material* customMaterial);
 
 
     Sprite2D* GetSprite() const;
     Sprite2D* GetSprite() const;
@@ -22,6 +26,10 @@ public:
     float GetAlpha() const;
     float GetAlpha() const;
     bool GetUseHotSpot() const;
     bool GetUseHotSpot() const;
     const Vector2& GetHotSpot() const;
     const Vector2& GetHotSpot() const;
+    bool GetUseDrawRect() const;
+    const Rect& GetDrawRect() const;
+    bool GetUseTextureRect() const;
+    const Rect& GetTextureRect() const;
     Material* GetCustomMaterial() const;
     Material* GetCustomMaterial() const;
 
 
     tolua_property__get_set Sprite2D* sprite;
     tolua_property__get_set Sprite2D* sprite;

+ 9 - 5
Source/Urho3D/Urho2D/StaticSprite2D.cpp

@@ -46,9 +46,11 @@ StaticSprite2D::StaticSprite2D(Context* context) :
     flipY_(false),
     flipY_(false),
     color_(Color::WHITE),
     color_(Color::WHITE),
     useHotSpot_(false),
     useHotSpot_(false),
-    hotSpot_(0.5f, 0.5f),
     useDrawRect_(false),
     useDrawRect_(false),
-    useTextureRect_(false)
+    useTextureRect_(false),
+    hotSpot_(0.5f, 0.5f),
+    drawRect_(Rect::ZERO),
+    textureRect_(Rect::ZERO)
 {
 {
     sourceBatches_.Resize(1);
     sourceBatches_.Resize(1);
     sourceBatches_[0].owner_ = this;
     sourceBatches_[0].owner_ = this;
@@ -72,9 +74,11 @@ void StaticSprite2D::RegisterObject(Context* context)
     URHO3D_ACCESSOR_ATTRIBUTE("Color", GetColor, SetColor, Color, Color::WHITE, AM_DEFAULT);
     URHO3D_ACCESSOR_ATTRIBUTE("Color", GetColor, SetColor, Color, Color::WHITE, AM_DEFAULT);
     URHO3D_MIXED_ACCESSOR_ATTRIBUTE("Custom material", GetCustomMaterialAttr, SetCustomMaterialAttr, ResourceRef,
     URHO3D_MIXED_ACCESSOR_ATTRIBUTE("Custom material", GetCustomMaterialAttr, SetCustomMaterialAttr, ResourceRef,
         ResourceRef(Material::GetTypeStatic()), AM_DEFAULT);
         ResourceRef(Material::GetTypeStatic()), AM_DEFAULT);
-    URHO3D_ACCESSOR_ATTRIBUTE("Draw Rectangle", GetDrawRect, SetDrawRect, Rect, Rect(), AM_DEFAULT);
+    URHO3D_ACCESSOR_ATTRIBUTE("Hot Spot", GetHotSpot, SetHotSpot, Vector2, Vector2(0.5f, 0.5f), AM_DEFAULT);
+    URHO3D_ACCESSOR_ATTRIBUTE("Use Hot Spot", GetUseHotSpot, SetUseHotSpot, bool, false, AM_DEFAULT);
+    URHO3D_ACCESSOR_ATTRIBUTE("Draw Rectangle", GetDrawRect, SetDrawRect, Rect, Rect::ZERO, AM_DEFAULT);
     URHO3D_ACCESSOR_ATTRIBUTE("Use Draw Rectangle", GetUseDrawRect, SetUseDrawRect, bool, false, AM_DEFAULT);
     URHO3D_ACCESSOR_ATTRIBUTE("Use Draw Rectangle", GetUseDrawRect, SetUseDrawRect, bool, false, AM_DEFAULT);
-    URHO3D_ACCESSOR_ATTRIBUTE("Texture Rectangle", GetTextureRect, SetTextureRect, Rect, Rect(), AM_DEFAULT);
+    URHO3D_ACCESSOR_ATTRIBUTE("Texture Rectangle", GetTextureRect, SetTextureRect, Rect, Rect::ZERO, AM_DEFAULT);
     URHO3D_ACCESSOR_ATTRIBUTE("Use Texture Rectangle", GetUseTextureRect, SetUseTextureRect, bool, false, AM_DEFAULT);
     URHO3D_ACCESSOR_ATTRIBUTE("Use Texture Rectangle", GetUseTextureRect, SetUseTextureRect, bool, false, AM_DEFAULT);
 }
 }
 
 
@@ -287,7 +291,7 @@ void StaticSprite2D::UpdateSourceBatches()
     if (!sprite_)
     if (!sprite_)
         return;
         return;
 
 
-    if(!useTextureRect_)
+    if (!useTextureRect_)
     {
     {
         if (!sprite_->GetTextureRectangle(textureRect_, flipX_, flipY_))
         if (!sprite_->GetTextureRectangle(textureRect_, flipX_, flipY_))
             return;
             return;

+ 13 - 13
Source/Urho3D/Urho2D/StaticSprite2D.h

@@ -60,11 +60,11 @@ public:
     void SetColor(const Color& color);
     void SetColor(const Color& color);
     /// Set alpha.
     /// Set alpha.
     void SetAlpha(float alpha);
     void SetAlpha(float alpha);
-    /// Set use hot spot.
+    /// Set whether to use custom-defined hot spot.
     void SetUseHotSpot(bool useHotSpot);
     void SetUseHotSpot(bool useHotSpot);
-    /// Set use draw rectangle.
+    /// Set whether to use custom-defined draw rectangle.
     void SetUseDrawRect(bool useDrawRect);
     void SetUseDrawRect(bool useDrawRect);
-    /// Set use texture rectangle.
+    /// Set whether to use custom-defined texture rectangle.
     void SetUseTextureRect(bool useTextureRect);
     void SetUseTextureRect(bool useTextureRect);
     /// Set hot spot.
     /// Set hot spot.
     void SetHotSpot(const Vector2& hotspot);
     void SetHotSpot(const Vector2& hotspot);
@@ -95,13 +95,13 @@ public:
     /// Return alpha.
     /// Return alpha.
     float GetAlpha() const { return color_.a_; }
     float GetAlpha() const { return color_.a_; }
 
 
-    /// Return use hot spot.
+    /// Return whether to use custom-defined hot spot.
     bool GetUseHotSpot() const { return useHotSpot_; }
     bool GetUseHotSpot() const { return useHotSpot_; }
 
 
-    /// Return use draw rect.
+    /// Return whether to use custom-defined draw rectangle.
     bool GetUseDrawRect() const { return useDrawRect_; }
     bool GetUseDrawRect() const { return useDrawRect_; }
 
 
-    /// Return use draw rect.
+    /// Return whether to use custom-defined texture rectangle.
     bool GetUseTextureRect() const { return useTextureRect_; }
     bool GetUseTextureRect() const { return useTextureRect_; }
 
 
     /// Return hot spot.
     /// Return hot spot.
@@ -141,20 +141,20 @@ protected:
     bool flipY_;
     bool flipY_;
     /// Color.
     /// Color.
     Color color_;
     Color color_;
-    /// Use hot spot.
+    /// Use hot spot flag.
     bool useHotSpot_;
     bool useHotSpot_;
+    /// Use draw rectangle flag.
+    bool useDrawRect_;
+    /// Use texture rectangle flag.
+    bool useTextureRect_;
     /// Hot spot.
     /// Hot spot.
     Vector2 hotSpot_;
     Vector2 hotSpot_;
-    /// Custom material.
-    SharedPtr<Material> customMaterial_;
     /// Draw rectangle.
     /// Draw rectangle.
     Rect drawRect_;
     Rect drawRect_;
-    /// Use drawRect.
-    bool useDrawRect_;
     /// Texture rectangle.
     /// Texture rectangle.
     Rect textureRect_;
     Rect textureRect_;
-    /// Use textureRect.
-    bool useTextureRect_;
+    /// Custom material.
+    SharedPtr<Material> customMaterial_;
 };
 };
 
 
 }
 }

+ 3 - 3
bin/Data/Scripts/Editor/AttributeEditor.as

@@ -281,7 +281,7 @@ UIElement@ CreateNumAttributeEditor(ListView@ list, Array<Serializable@>@ serial
         numCoords = 2;
         numCoords = 2;
     if (type == VAR_VECTOR3 || type == VAR_QUATERNION)
     if (type == VAR_VECTOR3 || type == VAR_QUATERNION)
         numCoords = 3;
         numCoords = 3;
-    else if (type == VAR_VECTOR4 || type == VAR_COLOR || type == VAR_INTRECT)
+    else if (type == VAR_VECTOR4 || type == VAR_COLOR || type == VAR_INTRECT || type == VAR_RECT)
         numCoords = 4;
         numCoords = 4;
 
 
     for (uint i = 0; i < numCoords; ++i)
     for (uint i = 0; i < numCoords; ++i)
@@ -435,7 +435,7 @@ UIElement@ CreateAttributeEditor(ListView@ list, Array<Serializable@>@ serializa
         parent = CreateStringAttributeEditor(list, serializables, info, index, subIndex);
         parent = CreateStringAttributeEditor(list, serializables, info, index, subIndex);
     else if (type == VAR_BOOL)
     else if (type == VAR_BOOL)
         parent = CreateBoolAttributeEditor(list, serializables, info, index, subIndex);
         parent = CreateBoolAttributeEditor(list, serializables, info, index, subIndex);
-    else if ((type >= VAR_FLOAT && type <= VAR_VECTOR4) || type == VAR_QUATERNION || type == VAR_COLOR || type == VAR_INTVECTOR2 || type == VAR_INTRECT || type == VAR_DOUBLE)
+    else if ((type >= VAR_FLOAT && type <= VAR_VECTOR4) || type == VAR_QUATERNION || type == VAR_COLOR || type == VAR_INTVECTOR2 || type == VAR_INTRECT || type == VAR_DOUBLE || type == VAR_RECT)
         parent = CreateNumAttributeEditor(list, serializables, info, index, subIndex);
         parent = CreateNumAttributeEditor(list, serializables, info, index, subIndex);
     else if (type == VAR_INT)
     else if (type == VAR_INT)
         parent = CreateIntAttributeEditor(list, serializables, info, index, subIndex);
         parent = CreateIntAttributeEditor(list, serializables, info, index, subIndex);
@@ -860,7 +860,7 @@ void FillValue(Array<Variant>& values, const Variant&in value)
 
 
 void SanitizeNumericalValue(VariantType type, String& value)
 void SanitizeNumericalValue(VariantType type, String& value)
 {
 {
-    if (type >= VAR_FLOAT && type <= VAR_COLOR)
+    if ((type >= VAR_FLOAT && type <= VAR_COLOR) || type == VAR_RECT)
         value = String(value.ToFloat());
         value = String(value.ToFloat());
     else if (type == VAR_INT || type == VAR_INTRECT || type == VAR_INTVECTOR2)
     else if (type == VAR_INT || type == VAR_INTRECT || type == VAR_INTVECTOR2)
         value = String(value.ToInt());
         value = String(value.ToInt());