Godot.hpp 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267
  1. #ifndef GODOT_H
  2. #define GODOT_H
  3. #include <cstdlib>
  4. #include <godot.h>
  5. #include <godot_cpp/core/CoreTypes.hpp>
  6. #include <godot_cpp/core/Variant.hpp>
  7. namespace godot {
  8. #define GODOT_CLASS(Name, Base) \
  9. public: static char *___get_type_name() { return (char *) #Name; } \
  10. static char *___get_base_type_name() { return (char *) #Base; } \
  11. Name(godot_object *o) { __core_object = o; } \
  12. private:
  13. template<class A, class B>
  14. A object_cast(B b)
  15. {
  16. A *a = (A*) &b;
  17. return *a;
  18. }
  19. // instance and destroy funcs
  20. template<class T>
  21. void *_godot_class_instance_func(godot_object *p)
  22. {
  23. T *d = new T(p);
  24. d->_init();
  25. return d;
  26. }
  27. template<class T>
  28. void _godot_class_destroy_func(godot_object *p, void *data)
  29. {
  30. T *d = (T *) data;
  31. delete d;
  32. }
  33. template<class T>
  34. void register_class()
  35. {
  36. godot_script_register(T::___get_type_name(), T::___get_base_type_name(), _godot_class_instance_func<T>, _godot_class_destroy_func<T>);
  37. T::_register_methods();
  38. }
  39. // wrapped methods
  40. template<class T, class R, class A0, class A1, class A2, class A3, class A4, R (T::*p)(A0, A1, A2, A3, A4)>
  41. struct WrappedMethod5 {
  42. static godot_variant wrapped_method(godot_object *_, void *data, int num_args, godot_variant **args)
  43. {
  44. godot_variant _variant;
  45. godot_variant_new_nil(&_variant);
  46. godot::Variant *v = (godot::Variant *) &_variant;
  47. T *obj = (T *) data;
  48. godot::Variant **arg = (godot::Variant **) args;
  49. *v = (obj->*p)(*arg[0], *arg[1], *arg[2], *arg[3], *arg[4]);
  50. return _variant;
  51. }
  52. };
  53. template<class T, class A0, class A1, class A2, class A3, class A4, void (T::*p)(A0, A1, A2, A3, A4)>
  54. struct WrappedMethod5<T, void, A0, A1, A2, A3, A4, p> {
  55. static godot_variant wrapped_method(godot_object *_, void *data, int num_args, godot_variant **args)
  56. {
  57. godot_variant _variant;
  58. godot_variant_new_nil(&_variant);
  59. T *obj = (T *) data;
  60. godot::Variant **arg = (godot::Variant **) args;
  61. (obj->*p)(*arg[0], *arg[1], *arg[2], *arg[3], *arg[4]);
  62. return _variant;
  63. }
  64. };
  65. template<class T, class R, class A0, class A1, class A2, class A3, R (T::*p)(A0, A1, A2, A3)>
  66. struct WrappedMethod4 {
  67. static godot_variant wrapped_method(godot_object *_, void *data, int num_args, godot_variant **args)
  68. {
  69. godot_variant _variant;
  70. godot_variant_new_nil(&_variant);
  71. godot::Variant *v = (godot::Variant *) &_variant;
  72. T *obj = (T *) data;
  73. godot::Variant **arg = (godot::Variant **) args;
  74. *v = (obj->*p)(*arg[0], *arg[1], *arg[2], *arg[3]);
  75. return _variant;
  76. }
  77. };
  78. template<class T, class A0, class A1, class A2, class A3, void (T::*p)(A0, A1, A2, A3)>
  79. struct WrappedMethod4<T, void, A0, A1, A2, A3, p> {
  80. static godot_variant wrapped_method(godot_object *_, void *data, int num_args, godot_variant **args)
  81. {
  82. godot_variant _variant;
  83. godot_variant_new_nil(&_variant);
  84. T *obj = (T *) data;
  85. godot::Variant **arg = (godot::Variant **) args;
  86. (obj->*p)(*arg[0], *arg[1], *arg[2], *arg[3]);
  87. return _variant;
  88. }
  89. };
  90. template<class T, class R, class A0, class A1, class A2, R (T::*p)(A0, A1, A2)>
  91. struct WrappedMethod3 {
  92. static godot_variant wrapped_method(godot_object *_, void *data, int num_args, godot_variant **args)
  93. {
  94. godot_variant _variant;
  95. godot_variant_new_nil(&_variant);
  96. godot::Variant *v = (godot::Variant *) &_variant;
  97. T *obj = (T *) data;
  98. godot::Variant **arg = (godot::Variant **) args;
  99. *v = (obj->*p)(*arg[0], *arg[1], *arg[2]);
  100. return _variant;
  101. }
  102. };
  103. template<class T, class A0, class A1, class A2, void (T::*p)(A0, A1, A2)>
  104. struct WrappedMethod3<T, void, A0, A1, A2, p> {
  105. static godot_variant wrapped_method(godot_object *_, void *data, int num_args, godot_variant **args)
  106. {
  107. godot_variant _variant;
  108. godot_variant_new_nil(&_variant);
  109. T *obj = (T *) data;
  110. godot::Variant **arg = (godot::Variant **) args;
  111. (obj->*p)(*arg[0], *arg[1], *arg[2]);
  112. return _variant;
  113. }
  114. };
  115. template<class T, class R, class A0, class A1, R (T::*p)(A0, A1)>
  116. struct WrappedMethod2 {
  117. static godot_variant wrapped_method(godot_object *_, void *data, int num_args, godot_variant **args)
  118. {
  119. godot_variant _variant;
  120. godot_variant_new_nil(&_variant);
  121. godot::Variant *v = (godot::Variant *) &_variant;
  122. T *obj = (T *) data;
  123. godot::Variant **arg = (godot::Variant **) args;
  124. *v = (obj->*p)(*arg[0], *arg[1]);
  125. return _variant;
  126. }
  127. };
  128. template<class T, class A0, class A1, void (T::*p)(A0, A1)>
  129. struct WrappedMethod2<T, void, A0, A1, p> {
  130. static godot_variant wrapped_method(godot_object *_, void *data, int num_args, godot_variant **args)
  131. {
  132. godot_variant _variant;
  133. godot_variant_new_nil(&_variant);
  134. T *obj = (T *) data;
  135. godot::Variant **arg = (godot::Variant **) args;
  136. (obj->*p)(*arg[0], *arg[1]);
  137. return _variant;
  138. }
  139. };
  140. template<class T, class R, class I, R (T::*p)(I)>
  141. struct WrappedMethod1 {
  142. static godot_variant wrapped_method(godot_object *_, void *data, int num_args, godot_variant **args)
  143. {
  144. godot_variant _variant;
  145. godot_variant_new_nil(&_variant);
  146. godot::Variant *v = (godot::Variant *) &_variant;
  147. T *obj = (T *) data;
  148. godot::Variant **arg = (godot::Variant **) args;
  149. *v = (obj->*p)(*arg[0]);
  150. return _variant;
  151. }
  152. };
  153. template <class T, class I, void (T::*p)(I)>
  154. struct WrappedMethod1<T, void, I, p> {
  155. static godot_variant wrapped_method(godot_object *_, void *data, int num_args, godot_variant **args)
  156. {
  157. godot_variant _variant;
  158. godot_variant_new_nil(&_variant);
  159. T *obj = (T *) data;
  160. godot::Variant **arg = (godot::Variant **) args;
  161. (obj->*p)(*arg[0]);
  162. return _variant;
  163. }
  164. };
  165. template<class T, class R, R (T::*p)()>
  166. struct WrappedMethod0 {
  167. static godot_variant wrapped_method(godot_object *_, void *data, int num_args, godot_variant **args)
  168. {
  169. godot_variant _variant;
  170. godot_variant_new_nil(&_variant);
  171. godot::Variant *v = (godot::Variant *) &_variant;
  172. T *obj = (T *) data;
  173. *v = (obj->*p)();
  174. return _variant;
  175. }
  176. };
  177. template<class T, void (T::*p)()>
  178. struct WrappedMethod0<T, void, p> {
  179. static godot_variant wrapped_method(godot_object *_, void *data, int num_args, godot_variant **args)
  180. {
  181. godot_variant _variant;
  182. godot_variant_new_nil(&_variant);
  183. T *obj = (T *) data;
  184. (obj->*p)();
  185. return _variant;
  186. }
  187. };
  188. // method registering
  189. template<class T, class R, R (T::*p)()>
  190. void register_method(char *name, godot_method_attributes attr = {}) {
  191. godot_script_add_method(T::___get_type_name(), name, &attr, &WrappedMethod0<T, R, p>::wrapped_method);
  192. }
  193. template<class T, class R, class A0, R (T::*p)(A0)>
  194. void register_method(char *name, godot_method_attributes attr = {}) {
  195. godot_script_add_method(T::___get_type_name(), name, &attr, &WrappedMethod1<T, R, A0, p>::wrapped_method);
  196. }
  197. template<class T, class R, class A0, class A1, R (T::*p)(A0, A1)>
  198. void register_method(char *name, godot_method_attributes attr = {}) {
  199. godot_script_add_method(T::___get_type_name(), name, &attr, &WrappedMethod2<T, R, A0, A1, p>::wrapped_method);
  200. }
  201. template<class T, class R, class A0, class A1, class A2, R (T::*p)(A0, A1, A2)>
  202. void register_method(char *name, godot_method_attributes attr = {}) {
  203. godot_script_add_method(T::___get_type_name(), name, &attr, &WrappedMethod3<T, R, A0, A1, A2, p>::wrapped_method);
  204. }
  205. template<class T, class R, class A0, class A1, class A2, class A3, R (T::*p)(A0, A1, A2, A3)>
  206. void register_method(char *name, godot_method_attributes attr = {}) {
  207. godot_script_add_method(T::___get_type_name(), name, &attr, &WrappedMethod4<T, R, A0, A1, A2, A3, p>::wrapped_method);
  208. }
  209. template<class T, class R, class A0, class A1, class A2, class A3, class A4, R (T::*p)(A0, A1, A2, A3, A4)>
  210. void register_method(char *name, godot_method_attributes attr = {}) {
  211. godot_script_add_method(T::___get_type_name(), name, &attr, &WrappedMethod5<T, R, A0, A1, A2, A3, A4, p>::wrapped_method);
  212. }
  213. }
  214. #endif // GODOT_H