Advertisement
Guest User

Unity

a guest
Nov 30th, 2015
83
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.89 KB | None | 0 0
  1. #pragma once
  2.  
  3. // Unity native plugin API
  4. // Compatible with C99
  5.  
  6. #if defined(__CYGWIN32__)
  7.     #define UNITY_INTERFACE_API __stdcall
  8.     #define UNITY_INTERFACE_EXPORT __declspec(dllexport)
  9. #elif defined(WIN32) || defined(_WIN32) || defined(__WIN32__) || defined(_WIN64) || defined(WINAPI_FAMILY)
  10.     #define UNITY_INTERFACE_API __stdcall
  11.     #define UNITY_INTERFACE_EXPORT __declspec(dllexport)
  12. #elif defined(__MACH__) || defined(__ANDROID__) || defined(__linux__) || defined(__QNX__)
  13.     #define UNITY_INTERFACE_API
  14.     #define UNITY_INTERFACE_EXPORT
  15. #else
  16.     #define UNITY_INTERFACE_API
  17.     #define UNITY_INTERFACE_EXPORT
  18. #endif
  19.  
  20.  
  21.  
  22. // Unity Interface GUID
  23. // Ensures cross plugin uniqueness.
  24. //
  25. // Template specialization is used to produce a means of looking up a GUID from it's payload type at compile time.
  26. // The net result should compile down to passing around the GUID.
  27. //
  28. // UNITY_REGISTER_INTERFACE_GUID should be placed in the header file of any payload definition outside of all namespaces.
  29. // The payload structure and the registration GUID are all that is required to expose the interface to other systems.
  30. struct UnityInterfaceGUID
  31. {
  32. #ifdef __cplusplus
  33.     UnityInterfaceGUID(unsigned long long high, unsigned long long low)
  34.     : m_GUIDHigh(high)
  35.     , m_GUIDLow(low)
  36.     {
  37.     }
  38.  
  39.     UnityInterfaceGUID(const UnityInterfaceGUID& other)
  40.     {
  41.         m_GUIDHigh = other.m_GUIDHigh;
  42.         m_GUIDLow  = other.m_GUIDLow;
  43.     }
  44.  
  45.     UnityInterfaceGUID& operator=(const UnityInterfaceGUID& other)
  46.     {
  47.         m_GUIDHigh = other.m_GUIDHigh;
  48.         m_GUIDLow  = other.m_GUIDLow;
  49.         return *this;
  50.     }
  51.  
  52.     bool Equals(const UnityInterfaceGUID& other)   const { return m_GUIDHigh == other.m_GUIDHigh && m_GUIDLow == other.m_GUIDLow; }
  53.     bool LessThan(const UnityInterfaceGUID& other) const { return m_GUIDHigh < other.m_GUIDHigh || (m_GUIDHigh == other.m_GUIDHigh && m_GUIDLow < other.m_GUIDLow); }
  54. #endif
  55.     unsigned long long m_GUIDHigh;
  56.     unsigned long long m_GUIDLow;
  57. };
  58. #ifdef __cplusplus
  59. inline bool operator==(const UnityInterfaceGUID& left, const UnityInterfaceGUID& right) { return left.Equals(right); }
  60. inline bool operator!=(const UnityInterfaceGUID& left, const UnityInterfaceGUID& right) { return !left.Equals(right); }
  61. inline bool operator< (const UnityInterfaceGUID& left, const UnityInterfaceGUID& right) { return left.LessThan(right); }
  62. inline bool operator> (const UnityInterfaceGUID& left, const UnityInterfaceGUID& right) { return right.LessThan(left); }
  63. inline bool operator>=(const UnityInterfaceGUID& left, const UnityInterfaceGUID& right) { return !operator< (left,right); }
  64. inline bool operator<=(const UnityInterfaceGUID& left, const UnityInterfaceGUID& right) { return !operator> (left,right); }
  65. #else
  66. typedef struct UnityInterfaceGUID UnityInterfaceGUID;
  67. #endif
  68.  
  69.  
  70.  
  71. #define UNITY_GET_INTERFACE_GUID(TYPE) TYPE##_GUID
  72. #define UNITY_GET_INTERFACE(INTERFACES, TYPE) (TYPE*)INTERFACES->GetInterface(UNITY_GET_INTERFACE_GUID(TYPE));
  73.  
  74. #ifdef __cplusplus
  75.     #define UNITY_DECLARE_INTERFACE(NAME) \
  76.     struct NAME : IUnityInterface
  77.  
  78.     template<typename TYPE>                                        \
  79.     inline const UnityInterfaceGUID GetUnityInterfaceGUID();       \
  80.  
  81.     #define UNITY_REGISTER_INTERFACE_GUID(HASHH, HASHL, TYPE)      \
  82.     const UnityInterfaceGUID TYPE##_GUID(HASHH, HASHL);            \
  83.     template<>                                                     \
  84.     inline const UnityInterfaceGUID GetUnityInterfaceGUID<TYPE>()  \
  85.     {                                                              \
  86.         return UNITY_GET_INTERFACE_GUID(TYPE);                     \
  87.     }
  88. #else
  89.     #define UNITY_DECLARE_INTERFACE(NAME) \
  90.     typedef struct NAME NAME;             \
  91.     struct NAME
  92.  
  93.     #define UNITY_REGISTER_INTERFACE_GUID(HASHH, HASHL, TYPE) \
  94.     const UnityInterfaceGUID TYPE##_GUID = {HASHH, HASHL};
  95. #endif
  96.  
  97.  
  98.  
  99. #ifdef __cplusplus
  100. struct IUnityInterface
  101. {
  102. };
  103. #else
  104. typedef void IUnityInterface;
  105. #endif
  106.  
  107.  
  108.  
  109. typedef struct IUnityInterfaces
  110. {
  111.     // Returns an interface matching the guid.
  112.     // Returns nullptr if the given interface is unavailable in the active Unity runtime.
  113.     IUnityInterface* (UNITY_INTERFACE_API * GetInterface)(UnityInterfaceGUID guid);
  114.  
  115.     // Registers a new interface.
  116.     void (UNITY_INTERFACE_API * RegisterInterface)(UnityInterfaceGUID guid, IUnityInterface* ptr);
  117.  
  118. #ifdef __cplusplus
  119.     // Helper for GetInterface.
  120.     template <typename INTERFACE>
  121.     INTERFACE* Get()
  122.     {
  123.         return static_cast<INTERFACE*>(GetInterface(GetUnityInterfaceGUID<INTERFACE>()));
  124.     }
  125.  
  126.     // Helper for RegisterInterface.
  127.     template <typename INTERFACE>
  128.     void Register(IUnityInterface* ptr)
  129.     {
  130.         RegisterInterface(GetUnityInterfaceGUID<INTERFACE>(), ptr);
  131.     }
  132. #endif
  133. } IUnityInterfaces;
  134.  
  135.  
  136.  
  137. #ifdef __cplusplus
  138. extern "C" {
  139. #endif
  140.  
  141. // If exported by a plugin, this function will be called when the plugin is loaded.
  142. void UNITY_INTERFACE_EXPORT UNITY_INTERFACE_API UnityPluginLoad(IUnityInterfaces* unityInterfaces);
  143. // If exported by a plugin, this function will be called when the plugin is about to be unloaded.
  144. void UNITY_INTERFACE_EXPORT UNITY_INTERFACE_API UnityPluginUnload();
  145.  
  146. #ifdef __cplusplus
  147. }
  148. #endif
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement