Godot.hpp 7.6 KB

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