gd_mono_marshal.h 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219
  1. /*************************************************************************/
  2. /* gd_mono_marshal.h */
  3. /*************************************************************************/
  4. /* This file is part of: */
  5. /* GODOT ENGINE */
  6. /* https://godotengine.org */
  7. /*************************************************************************/
  8. /* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
  9. /* Copyright (c) 2014-2017 Godot Engine contributors (cf. AUTHORS.md) */
  10. /* */
  11. /* Permission is hereby granted, free of charge, to any person obtaining */
  12. /* a copy of this software and associated documentation files (the */
  13. /* "Software"), to deal in the Software without restriction, including */
  14. /* without limitation the rights to use, copy, modify, merge, publish, */
  15. /* distribute, sublicense, and/or sell copies of the Software, and to */
  16. /* permit persons to whom the Software is furnished to do so, subject to */
  17. /* the following conditions: */
  18. /* */
  19. /* The above copyright notice and this permission notice shall be */
  20. /* included in all copies or substantial portions of the Software. */
  21. /* */
  22. /* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
  23. /* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
  24. /* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
  25. /* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
  26. /* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
  27. /* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
  28. /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
  29. /*************************************************************************/
  30. #ifndef GDMONOMARSHAL_H
  31. #define GDMONOMARSHAL_H
  32. #include "gd_mono.h"
  33. #include "gd_mono_utils.h"
  34. #include "variant.h"
  35. namespace GDMonoMarshal {
  36. template <typename T>
  37. T unbox(MonoObject *p_obj) {
  38. return *(T *)mono_object_unbox(p_obj);
  39. }
  40. #define BOX_DOUBLE(x) mono_value_box(mono_domain_get(), CACHED_CLASS_RAW(double), &x)
  41. #define BOX_FLOAT(x) mono_value_box(mono_domain_get(), CACHED_CLASS_RAW(float), &x)
  42. #define BOX_INT64(x) mono_value_box(mono_domain_get(), CACHED_CLASS_RAW(int64_t), &x)
  43. #define BOX_INT32(x) mono_value_box(mono_domain_get(), CACHED_CLASS_RAW(int32_t), &x)
  44. #define BOX_INT16(x) mono_value_box(mono_domain_get(), CACHED_CLASS_RAW(int16_t), &x)
  45. #define BOX_INT8(x) mono_value_box(mono_domain_get(), CACHED_CLASS_RAW(int8_t), &x)
  46. #define BOX_UINT64(x) mono_value_box(mono_domain_get(), CACHED_CLASS_RAW(uint64_t), &x)
  47. #define BOX_UINT32(x) mono_value_box(mono_domain_get(), CACHED_CLASS_RAW(uint32_t), &x)
  48. #define BOX_UINT16(x) mono_value_box(mono_domain_get(), CACHED_CLASS_RAW(uint16_t), &x)
  49. #define BOX_UINT8(x) mono_value_box(mono_domain_get(), CACHED_CLASS_RAW(uint8_t), &x)
  50. #define BOX_BOOLEAN(x) mono_value_box(mono_domain_get(), CACHED_CLASS_RAW(bool), &x)
  51. #define BOX_PTR(x) mono_value_box(mono_domain_get(), CACHED_CLASS_RAW(IntPtr), x)
  52. #define BOX_ENUM(m_enum_class, x) mono_value_box(mono_domain_get(), m_enum_class, &x)
  53. Variant::Type managed_to_variant_type(const ManagedType &p_type);
  54. // String
  55. String mono_to_utf8_string(MonoString *p_mono_string);
  56. String mono_to_utf16_string(MonoString *p_mono_string);
  57. _FORCE_INLINE_ String mono_string_to_godot(MonoString *p_mono_string) {
  58. if (sizeof(CharType) == 2)
  59. return mono_to_utf16_string(p_mono_string);
  60. return mono_to_utf8_string(p_mono_string);
  61. }
  62. _FORCE_INLINE_ MonoString *mono_from_utf8_string(const String &p_string) {
  63. return mono_string_new(mono_domain_get(), p_string.utf8().get_data());
  64. }
  65. _FORCE_INLINE_ MonoString *mono_from_utf16_string(const String &p_string) {
  66. return mono_string_from_utf16((mono_unichar2 *)p_string.c_str());
  67. }
  68. _FORCE_INLINE_ MonoString *mono_string_from_godot(const String &p_string) {
  69. if (sizeof(CharType) == 2)
  70. return mono_from_utf16_string(p_string);
  71. return mono_from_utf8_string(p_string);
  72. }
  73. // Variant
  74. MonoObject *variant_to_mono_object(const Variant *p_var, const ManagedType &p_type);
  75. MonoObject *variant_to_mono_object(const Variant *p_var);
  76. _FORCE_INLINE_ MonoObject *variant_to_mono_object(Variant p_var) {
  77. return variant_to_mono_object(&p_var);
  78. }
  79. Variant mono_object_to_variant(MonoObject *p_obj);
  80. Variant mono_object_to_variant(MonoObject *p_obj, const ManagedType &p_type);
  81. // Array
  82. MonoArray *Array_to_mono_array(const Array &p_array);
  83. Array mono_array_to_Array(MonoArray *p_array);
  84. // PoolIntArray
  85. MonoArray *PoolIntArray_to_mono_array(const PoolIntArray &p_array);
  86. PoolIntArray mono_array_to_PoolIntArray(MonoArray *p_array);
  87. // PoolByteArray
  88. MonoArray *PoolByteArray_to_mono_array(const PoolByteArray &p_array);
  89. PoolByteArray mono_array_to_PoolByteArray(MonoArray *p_array);
  90. // PoolRealArray
  91. MonoArray *PoolRealArray_to_mono_array(const PoolRealArray &p_array);
  92. PoolRealArray mono_array_to_PoolRealArray(MonoArray *p_array);
  93. // PoolStringArray
  94. MonoArray *PoolStringArray_to_mono_array(const PoolStringArray &p_array);
  95. PoolStringArray mono_array_to_PoolStringArray(MonoArray *p_array);
  96. // PoolColorArray
  97. MonoArray *PoolColorArray_to_mono_array(const PoolColorArray &p_array);
  98. PoolColorArray mono_array_to_PoolColorArray(MonoArray *p_array);
  99. // PoolVector2Array
  100. MonoArray *PoolVector2Array_to_mono_array(const PoolVector2Array &p_array);
  101. PoolVector2Array mono_array_to_PoolVector2Array(MonoArray *p_array);
  102. // PoolVector3Array
  103. MonoArray *PoolVector3Array_to_mono_array(const PoolVector3Array &p_array);
  104. PoolVector3Array mono_array_to_PoolVector3Array(MonoArray *p_array);
  105. // Dictionary
  106. MonoObject *Dictionary_to_mono_object(const Dictionary &p_dict);
  107. Dictionary mono_object_to_Dictionary(MonoObject *p_dict);
  108. #ifdef YOLO_COPY
  109. #define MARSHALLED_OUT(m_t, m_in, m_out) m_t *m_out = (m_t *)&m_in;
  110. #define MARSHALLED_IN(m_t, m_in, m_out) m_t m_out = *reinterpret_cast<m_t *>(m_in);
  111. #else
  112. // Expects m_in to be of type float*
  113. #define MARSHALLED_OUT(m_t, m_in, m_out) MARSHALLED_OUT_##m_t(m_in, m_out)
  114. #define MARSHALLED_IN(m_t, m_in, m_out) MARSHALLED_IN_##m_t(m_in, m_out)
  115. // Vector2
  116. #define MARSHALLED_OUT_Vector2(m_in, m_out) real_t m_out[2] = { m_in.x, m_in.y };
  117. #define MARSHALLED_IN_Vector2(m_in, m_out) Vector2 m_out(m_in[0], m_in[1]);
  118. // Rect2
  119. #define MARSHALLED_OUT_Rect2(m_in, m_out) real_t m_out[4] = { m_in.position.x, m_in.position.y, m_in.size.width, m_in.size.height };
  120. #define MARSHALLED_IN_Rect2(m_in, m_out) Rect2 m_out(m_in[0], m_in[1], m_in[2], m_in[3]);
  121. // Transform2D
  122. #define MARSHALLED_OUT_Transform2D(m_in, m_out) real_t m_out[6] = { m_in[0].x, m_in[0].y, m_in[1].x, m_in[1].y, m_in[2].x, m_in[2].y };
  123. #define MARSHALLED_IN_Transform2D(m_in, m_out) Transform2D m_out(m_in[0], m_in[1], m_in[2], m_in[3], m_in[4], m_in[5]);
  124. // Vector3
  125. #define MARSHALLED_OUT_Vector3(m_in, m_out) real_t m_out[3] = { m_in.x, m_in.y, m_in.z };
  126. #define MARSHALLED_IN_Vector3(m_in, m_out) Vector3 m_out(m_in[0], m_in[1], m_in[2]);
  127. // Basis
  128. #define MARSHALLED_OUT_Basis(m_in, m_out) real_t m_out[9] = { \
  129. m_in[0].x, m_in[0].y, m_in[0].z, \
  130. m_in[1].x, m_in[1].y, m_in[1].z, \
  131. m_in[2].x, m_in[2].y, m_in[2].z \
  132. };
  133. #define MARSHALLED_IN_Basis(m_in, m_out) Basis m_out(m_in[0], m_in[1], m_in[2], m_in[3], m_in[4], m_in[5], m_in[6], m_in[7], m_in[8]);
  134. // Quat
  135. #define MARSHALLED_OUT_Quat(m_in, m_out) real_t m_out[4] = { m_in.x, m_in.y, m_in.z, m_in.w };
  136. #define MARSHALLED_IN_Quat(m_in, m_out) Quat m_out(m_in[0], m_in[1], m_in[2], m_in[3]);
  137. // Transform
  138. #define MARSHALLED_OUT_Transform(m_in, m_out) real_t m_out[12] = { \
  139. m_in.basis[0].x, m_in.basis[0].y, m_in.basis[0].z, \
  140. m_in.basis[1].x, m_in.basis[1].y, m_in.basis[1].z, \
  141. m_in.basis[2].x, m_in.basis[2].y, m_in.basis[2].z, \
  142. m_in.origin.x, m_in.origin.y, m_in.origin.z \
  143. };
  144. #define MARSHALLED_IN_Transform(m_in, m_out) Transform m_out( \
  145. Basis(m_in[0], m_in[1], m_in[2], m_in[3], m_in[4], m_in[5], m_in[6], m_in[7], m_in[8]), \
  146. Vector3(m_in[9], m_in[10], m_in[11]));
  147. // AABB
  148. #define MARSHALLED_OUT_AABB(m_in, m_out) real_t m_out[6] = { m_in.position.x, m_in.position.y, m_in.position.z, m_in.size.x, m_in.size.y, m_in.size.z };
  149. #define MARSHALLED_IN_AABB(m_in, m_out) AABB m_out(Vector3(m_in[0], m_in[1], m_in[2]), Vector3(m_in[3], m_in[4], m_in[5]));
  150. // Color
  151. #define MARSHALLED_OUT_Color(m_in, m_out) real_t m_out[4] = { m_in.r, m_in.g, m_in.b, m_in.a };
  152. #define MARSHALLED_IN_Color(m_in, m_out) Color m_out(m_in[0], m_in[1], m_in[2], m_in[3]);
  153. // Plane
  154. #define MARSHALLED_OUT_Plane(m_in, m_out) real_t m_out[4] = { m_in.normal.x, m_in.normal.y, m_in.normal.z, m_in.d };
  155. #define MARSHALLED_IN_Plane(m_in, m_out) Plane m_out(m_in[0], m_in[1], m_in[2], m_in[3]);
  156. #endif
  157. } // namespace GDMonoMarshal
  158. #endif // GDMONOMARSHAL_H