CoreAPI.cpp 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213
  1. // Copyright (c) 2008-2023 the Urho3D project
  2. // License: MIT
  3. #include "../Precompiled.h"
  4. #include "../AngelScript/APITemplates.h"
  5. #include "../Core/ProcessUtils.h"
  6. #include "../Core/Spline.h"
  7. namespace Urho3D
  8. {
  9. void ArrayToVariantVector(CScriptArray* arr, VariantVector& dest)
  10. {
  11. unsigned size = arr->GetSize();
  12. dest.Resize(size);
  13. for (unsigned i = 0; i < size; ++i)
  14. dest[i] = *(static_cast<Variant*>(arr->At(i)));
  15. }
  16. void ArrayToStringVector(CScriptArray* arr, StringVector& dest)
  17. {
  18. unsigned size = arr->GetSize();
  19. dest.Resize(size);
  20. for (unsigned i = 0; i < size; ++i)
  21. dest[i] = *(static_cast<String*>(arr->At(i)));
  22. }
  23. static void RegisterVariant(asIScriptEngine* engine)
  24. {
  25. engine->RegisterGlobalFunction("VariantType GetVariantTypeFromName(const String&in)", AS_FUNCTIONPR(Variant::GetTypeFromName, (const String&), VariantType), AS_CALL_CDECL);
  26. engine->RegisterGlobalFunction("String GetVariantTypeName(VariantType)", AS_FUNCTIONPR(Variant::GetTypeName, (VariantType), String), AS_CALL_CDECL);
  27. }
  28. static String StringJoined(CScriptArray* arr, const String& glue)
  29. {
  30. Vector<String> subStrings = ArrayToVector<String>(arr);
  31. return String::Joined(subStrings, glue);
  32. }
  33. static void RegisterStringUtils(asIScriptEngine* engine)
  34. {
  35. engine->RegisterObjectMethod("String", "bool ToBool() const", AS_FUNCTIONPR_OBJFIRST(ToBool, (const String&), bool), AS_CALL_CDECL_OBJFIRST);
  36. engine->RegisterObjectMethod("String", "float ToFloat() const", AS_FUNCTIONPR_OBJFIRST(ToFloat, (const String&), float), AS_CALL_CDECL_OBJFIRST);
  37. engine->RegisterObjectMethod("String", "double ToDouble() const", AS_FUNCTIONPR_OBJFIRST(ToDouble, (const String&), double), AS_CALL_CDECL_OBJFIRST);
  38. engine->RegisterObjectMethod("String", "int ToI32(int base = 10) const", AS_FUNCTIONPR_OBJFIRST(ToI32, (const String&, i32), i32), AS_CALL_CDECL_OBJFIRST);
  39. engine->RegisterObjectMethod("String", "uint ToU32(int base = 10) const", AS_FUNCTIONPR_OBJFIRST(ToU32, (const String&, i32), u32), AS_CALL_CDECL_OBJFIRST);
  40. engine->RegisterObjectMethod("String", "int64 ToI64(int base = 10) const", AS_FUNCTIONPR_OBJFIRST(ToI64, (const String&, i32), i64), AS_CALL_CDECL_OBJFIRST);
  41. engine->RegisterObjectMethod("String", "uint64 ToU64(int base = 10) const", AS_FUNCTIONPR_OBJFIRST(ToU64, (const String&, i32), u64), AS_CALL_CDECL_OBJFIRST);
  42. engine->RegisterObjectMethod("String", "Color ToColor() const", AS_FUNCTIONPR_OBJFIRST(ToColor, (const String&), Color), AS_CALL_CDECL_OBJFIRST);
  43. engine->RegisterObjectMethod("String", "IntRect ToIntRect() const", AS_FUNCTIONPR_OBJFIRST(ToIntRect, (const String&), IntRect), AS_CALL_CDECL_OBJFIRST);
  44. engine->RegisterObjectMethod("String", "IntVector2 ToIntVector2() const", AS_FUNCTIONPR_OBJFIRST(ToIntVector2, (const String&), IntVector2), AS_CALL_CDECL_OBJFIRST);
  45. engine->RegisterObjectMethod("String", "IntVector3 ToIntVector3() const", AS_FUNCTIONPR_OBJFIRST(ToIntVector3, (const String&), IntVector3), AS_CALL_CDECL_OBJFIRST);
  46. engine->RegisterObjectMethod("String", "Quaternion ToQuaternion() const", AS_FUNCTIONPR_OBJFIRST(ToQuaternion, (const String&), Quaternion), AS_CALL_CDECL_OBJFIRST);
  47. engine->RegisterObjectMethod("String", "Vector2 ToVector2() const", AS_FUNCTIONPR_OBJFIRST(ToVector2, (const String&), Vector2), AS_CALL_CDECL_OBJFIRST);
  48. engine->RegisterObjectMethod("String", "Vector3 ToVector3() const", AS_FUNCTIONPR_OBJFIRST(ToVector3, (const String&), Vector3), AS_CALL_CDECL_OBJFIRST);
  49. engine->RegisterObjectMethod("String", "Vector4 ToVector4(bool allowMissingCoords = false) const", AS_FUNCTIONPR_OBJFIRST(ToVector4, (const String&, bool), Vector4), AS_CALL_CDECL_OBJFIRST);
  50. engine->RegisterObjectMethod("String", "Variant ToVectorVariant() const", AS_FUNCTIONPR_OBJFIRST(ToVectorVariant, (const String&), Variant), AS_CALL_CDECL_OBJFIRST);
  51. engine->RegisterObjectMethod("String", "Matrix3 ToMatrix3() const", AS_FUNCTIONPR_OBJFIRST(ToMatrix3, (const String&), Matrix3), AS_CALL_CDECL_OBJFIRST);
  52. engine->RegisterObjectMethod("String", "Matrix3x4 ToMatrix3x4() const", AS_FUNCTIONPR_OBJFIRST(ToMatrix3x4, (const String&), Matrix3x4), AS_CALL_CDECL_OBJFIRST);
  53. engine->RegisterObjectMethod("String", "Matrix4 ToMatrix4() const", AS_FUNCTIONPR_OBJFIRST(ToMatrix4, (const String&), Matrix4), AS_CALL_CDECL_OBJFIRST);
  54. //engine->RegisterGlobalFunction("String ToStringHex(int)", asFUNCTION(ToStringHex), asCALL_CDECL);
  55. engine->RegisterGlobalFunction("String Join(String[]&, const String&in glue)", AS_FUNCTION(StringJoined), AS_CALL_CDECL);
  56. }
  57. static Object* CreateObject(const String& objectType)
  58. {
  59. if (Context* context = GetScriptContext())
  60. {
  61. if (SharedPtr<Object> object = context->CreateObject(objectType))
  62. {
  63. object->AddRef();
  64. return object;
  65. }
  66. }
  67. return nullptr;
  68. }
  69. static void SendEvent(const String& eventType, VariantMap& eventData)
  70. {
  71. Object* sender = GetScriptContextEventListenerObject();
  72. if (sender)
  73. sender->SendEvent(eventType, eventData);
  74. }
  75. static void SubscribeToEvent(const String& eventType, const String& handlerName)
  76. {
  77. ScriptEventListener* listener = GetScriptContextEventListener();
  78. if (listener)
  79. listener->AddEventHandler(eventType, handlerName);
  80. }
  81. static void SubscribeToSenderEvent(Object* sender, const String& eventType, const String& handlerName)
  82. {
  83. ScriptEventListener* listener = GetScriptContextEventListener();
  84. if (listener)
  85. listener->AddEventHandler(sender, eventType, handlerName);
  86. }
  87. static void UnsubscribeFromEvent(const String& eventType)
  88. {
  89. ScriptEventListener* listener = GetScriptContextEventListener();
  90. if (listener)
  91. listener->RemoveEventHandler(eventType);
  92. }
  93. static void UnsubscribeFromSenderEvent(Object* sender, const String& eventType)
  94. {
  95. ScriptEventListener* listener = GetScriptContextEventListener();
  96. if (listener)
  97. listener->RemoveEventHandler(sender, eventType);
  98. }
  99. static void UnsubscribeFromSenderEvents(Object* sender)
  100. {
  101. ScriptEventListener* listener = GetScriptContextEventListener();
  102. if (listener)
  103. listener->RemoveEventHandlers(sender);
  104. }
  105. static void UnsubscribeFromAllEvents()
  106. {
  107. ScriptEventListener* listener = GetScriptContextEventListener();
  108. if (listener)
  109. listener->RemoveEventHandlers();
  110. }
  111. static void UnsubscribeFromAllEventsExcept(CScriptArray* exceptions)
  112. {
  113. ScriptEventListener* listener = GetScriptContextEventListener();
  114. if (!listener || !exceptions)
  115. return;
  116. unsigned numExceptions = exceptions->GetSize();
  117. Vector<StringHash> destExceptions(numExceptions);
  118. for (unsigned i = 0; i < numExceptions; ++i)
  119. destExceptions[i] = StringHash(*(static_cast<String*>(exceptions->At(i))));
  120. listener->RemoveEventHandlersExcept(destExceptions);
  121. }
  122. static bool HasSubscribedToEvent(const String& eventType)
  123. {
  124. ScriptEventListener* listener = GetScriptContextEventListener();
  125. return listener ? listener->HasEventHandler(StringHash(eventType)) : false;
  126. }
  127. static bool HasSubscribedToSenderEvent(Object* sender, const String& eventType)
  128. {
  129. ScriptEventListener* listener = GetScriptContextEventListener();
  130. return listener ? listener->HasEventHandler(sender, StringHash(eventType)) : false;
  131. }
  132. static void RegisterEventName(const String& eventName)
  133. {
  134. GetEventNameRegister().RegisterString(eventName.CString());
  135. }
  136. static Object* GetEventSender()
  137. {
  138. return GetScriptContext()->GetEventSender();
  139. }
  140. static const String& GetTypeName(StringHash type)
  141. {
  142. return GetScriptContext()->GetTypeName(type);
  143. }
  144. static void SetGlobalVar(const String& key, const Variant& value)
  145. {
  146. GetScriptContext()->SetGlobalVar(key, value);
  147. }
  148. static Variant GetGlobalVar(const String& key)
  149. {
  150. return GetScriptContext()->GetGlobalVar(key);
  151. }
  152. static VariantMap& GetGlobalVars()
  153. {
  154. return const_cast<VariantMap&>(GetScriptContext()->GetGlobalVars());
  155. }
  156. void RegisterObject(asIScriptEngine* engine)
  157. {
  158. engine->RegisterGlobalFunction("Object@ CreateObject(const String&in)", AS_FUNCTION(CreateObject), AS_CALL_CDECL);
  159. engine->RegisterGlobalFunction("void SendEvent(const String&in, VariantMap& eventData = VariantMap())", AS_FUNCTION(SendEvent), AS_CALL_CDECL);
  160. engine->RegisterGlobalFunction("void SubscribeToEvent(const String&in, const String&in)", AS_FUNCTION(SubscribeToEvent), AS_CALL_CDECL);
  161. engine->RegisterGlobalFunction("void SubscribeToEvent(Object@+, const String&in, const String&in)", AS_FUNCTION(SubscribeToSenderEvent), AS_CALL_CDECL);
  162. engine->RegisterGlobalFunction("void UnsubscribeFromEvent(const String&in)", AS_FUNCTION(UnsubscribeFromEvent), AS_CALL_CDECL);
  163. engine->RegisterGlobalFunction("void UnsubscribeFromEvent(Object@+, const String&in)", AS_FUNCTION(UnsubscribeFromSenderEvent), AS_CALL_CDECL);
  164. engine->RegisterGlobalFunction("void UnsubscribeFromEvents(Object@+)", AS_FUNCTION(UnsubscribeFromSenderEvents), AS_CALL_CDECL);
  165. engine->RegisterGlobalFunction("void UnsubscribeFromAllEvents()", AS_FUNCTION(UnsubscribeFromAllEvents), AS_CALL_CDECL);
  166. engine->RegisterGlobalFunction("void UnsubscribeFromAllEventsExcept(Array<String>@+)", AS_FUNCTION(UnsubscribeFromAllEventsExcept), AS_CALL_CDECL);
  167. engine->RegisterGlobalFunction("bool HasSubscribedToEvent(const String&in)", AS_FUNCTION(HasSubscribedToEvent), AS_CALL_CDECL);
  168. engine->RegisterGlobalFunction("bool HasSubscribedToEvent(Object@+, const String&in)", AS_FUNCTION(HasSubscribedToSenderEvent), AS_CALL_CDECL);
  169. engine->RegisterGlobalFunction("void RegisterEventName(const String&in)", AS_FUNCTION(RegisterEventName), AS_CALL_CDECL);
  170. engine->RegisterGlobalFunction("Object@+ GetEventSender()", AS_FUNCTION(GetEventSender), AS_CALL_CDECL);
  171. engine->RegisterGlobalFunction("const String& GetTypeName(StringHash)", AS_FUNCTION(GetTypeName), AS_CALL_CDECL);
  172. engine->RegisterGlobalFunction("void SetGlobalVar(const String&in, Variant&in)", AS_FUNCTION(SetGlobalVar), AS_CALL_CDECL);
  173. engine->RegisterGlobalFunction("Variant GetGlobalVar(const String&in)", AS_FUNCTION(GetGlobalVar), AS_CALL_CDECL);
  174. engine->RegisterGlobalFunction("VariantMap& get_globalVars()", AS_FUNCTION(GetGlobalVars), AS_CALL_CDECL);
  175. }
  176. void RegisterCoreAPI(asIScriptEngine* engine)
  177. {
  178. RegisterVariant(engine);
  179. RegisterStringUtils(engine);
  180. RegisterObject(engine);
  181. }
  182. }