2024-01-30 09:36:58 +00:00
|
|
|
#ifndef UC_GODOT_MACROS_H
|
|
|
|
#define UC_GODOT_MACROS_H
|
|
|
|
|
2024-02-02 07:47:30 +00:00
|
|
|
#include "godot_cpp/classes/engine.hpp"
|
|
|
|
#include "godot_cpp/core/class_db.hpp"
|
2024-05-29 14:46:18 +00:00
|
|
|
#include "godot_cpp/variant/string.hpp"
|
2024-02-02 07:47:30 +00:00
|
|
|
|
2024-05-28 14:28:36 +00:00
|
|
|
|
2024-01-30 09:36:58 +00:00
|
|
|
#define MACRO_STRING_INNER(_Arg) #_Arg
|
|
|
|
#define MACRO_STRING(_Arg) MACRO_STRING_INNER(_Arg)
|
|
|
|
|
2024-05-29 14:46:18 +00:00
|
|
|
/*! Register property.
|
|
|
|
*
|
|
|
|
* Register variable CLASSNAME::PropName_ with variant type PropType_.
|
|
|
|
* Requires setting CLASSNAME as a #define first. Also requires a CLASSNAME::get_PropName_ and CLASSNAME::set_PropName_ to exist.
|
|
|
|
*/
|
|
|
|
#define GDPROPERTY(PropName_, PropType_) \
|
|
|
|
godot::ClassDB::bind_method(godot::D_METHOD("get_" #PropName_), &CLASSNAME::get_##PropName_); \
|
|
|
|
godot::ClassDB::bind_method(godot::D_METHOD("set_" #PropName_, "value"), &CLASSNAME::set_##PropName_); \
|
|
|
|
godot::ClassDB::add_property(MACRO_STRING(CLASSNAME), godot::PropertyInfo(PropType_, #PropName_), "set_" #PropName_, "get_" #PropName_)
|
2024-01-30 09:36:58 +00:00
|
|
|
|
2024-05-29 14:46:18 +00:00
|
|
|
/*! Register a hinted property.
|
|
|
|
*
|
|
|
|
* Register variable CLASSNAME::PropName_ with variant type PropType_.
|
|
|
|
* Requires setting CLASSNAME as a #define first, and CLASSNAME::get_PropName and CLASSNAME::set_PropName_ to exist.
|
|
|
|
*/
|
|
|
|
#define GDPROPERTY_HINTED(PropName_, PropType_, ...) \
|
|
|
|
godot::ClassDB::bind_method(godot::D_METHOD("get_" #PropName_), &CLASSNAME::get_##PropName_); \
|
|
|
|
godot::ClassDB::bind_method(godot::D_METHOD("set_" #PropName_, "value"), &CLASSNAME::set_##PropName_); \
|
|
|
|
godot::ClassDB::add_property(MACRO_STRING(CLASSNAME), godot::PropertyInfo(PropType_, #PropName_, __VA_ARGS__), "set_" #PropName_, "get_" #PropName_)
|
2024-01-30 09:36:58 +00:00
|
|
|
|
2024-05-29 14:46:18 +00:00
|
|
|
/*! Register a function.
|
|
|
|
*
|
|
|
|
* Register a function CLASSNAME::_FnName() to godot.
|
|
|
|
* Requires setting CLASSNAME as a #define first.
|
|
|
|
*/
|
2024-05-28 14:28:36 +00:00
|
|
|
#define GDFUNCTION(_FnName) godot::ClassDB::bind_method(godot::D_METHOD(#_FnName), &CLASSNAME::_FnName)
|
2024-01-30 09:36:58 +00:00
|
|
|
|
2024-05-29 14:46:18 +00:00
|
|
|
/*! Register a function with arguments.
|
|
|
|
*
|
|
|
|
* Register a function CLASSNAME::_FnName(...) to godot.
|
|
|
|
* Requires setting CLASSNAME as a #define first.
|
|
|
|
*/
|
2024-05-28 14:28:36 +00:00
|
|
|
#define GDFUNCTION_ARGS(_FnName, ...) godot::ClassDB::bind_method(godot::D_METHOD(#_FnName, __VA_ARGS__), &CLASSNAME::_FnName)
|
2024-01-30 09:36:58 +00:00
|
|
|
|
2024-05-29 14:46:18 +00:00
|
|
|
/*! Register a static function.
|
|
|
|
*
|
|
|
|
* Register a static member function CLASSNAME::_FnName() to godot.
|
|
|
|
* Requires setting CLASSNAME as a #define first.
|
|
|
|
*/
|
2024-05-28 14:28:36 +00:00
|
|
|
#define GDFUNCTION_STATIC(_FnName) godot::ClassDB::bind_static_method(MACRO_STRING(CLASSNAME), godot::D_METHOD(#_FnName), &CLASSNAME::_FnName)
|
2024-01-30 09:36:58 +00:00
|
|
|
|
2024-05-29 14:46:18 +00:00
|
|
|
/*! Register a static function with arguments.
|
|
|
|
*
|
|
|
|
* Register a static member function CLASSNAME::_FnName(...) to godot.
|
|
|
|
* Requires setting CLASSNAME as a #define first.
|
|
|
|
*/
|
2024-05-28 14:28:36 +00:00
|
|
|
#define GDFUNCTION_STATIC_ARGS(_FnName, ...) godot::ClassDB::bind_static_method(MACRO_STRING(CLASSNAME), godot::D_METHOD(#_FnName, __VA_ARGS__), &CLASSNAME::_FnName)
|
2024-01-30 09:36:58 +00:00
|
|
|
|
2024-05-29 14:46:18 +00:00
|
|
|
/*! Declare a godot Observer signal.
|
|
|
|
*
|
|
|
|
* Declare the existence of a Observer signal to godot.
|
|
|
|
*/
|
2024-05-28 14:28:36 +00:00
|
|
|
#define GDSIGNAL(...) godot::ClassDB::add_signal(MACRO_STRING(CLASSNAME), godot::MethodInfo(__VA_ARGS__))
|
2024-03-20 10:35:13 +00:00
|
|
|
|
2024-05-29 14:46:18 +00:00
|
|
|
/*! Construct godot resource type hint.
|
|
|
|
*
|
|
|
|
* Use when registering properties of arrays of resource classes.
|
|
|
|
*/
|
2024-05-28 14:28:36 +00:00
|
|
|
#define GDRESOURCETYPE(_Class) godot::vformat("%s/%s:%s", godot::Variant::OBJECT, godot::PROPERTY_HINT_RESOURCE_TYPE, #_Class)
|
2024-01-30 09:36:58 +00:00
|
|
|
|
2024-05-29 14:46:18 +00:00
|
|
|
/*! Execute the rest of the function only if currently running as editor.
|
|
|
|
*
|
|
|
|
* Useful for _ready, _enter/_exit, _process, etc. functions.
|
|
|
|
*/
|
2024-05-28 14:28:36 +00:00
|
|
|
#define GDEDITORONLY() if(!godot::Engine::get_singleton()->is_editor_hint()) return;
|
2024-05-29 14:46:18 +00:00
|
|
|
/*! Execute the rest of the function only if currently running as game.
|
|
|
|
*
|
|
|
|
* Useful for _ready, _enter/_exit, _process, etc. functions.
|
|
|
|
*/
|
2024-05-28 14:28:36 +00:00
|
|
|
#define GDGAMEONLY() if(godot::Engine::get_singleton()->is_editor_hint()) return;
|
2024-02-02 07:47:05 +00:00
|
|
|
|
2024-05-29 14:46:18 +00:00
|
|
|
/*! Declare a scoped enum struct.
|
|
|
|
*
|
|
|
|
* Declares a struct Name_ with an enum Value and a single variable and a get_property_hint() function.
|
|
|
|
*/
|
|
|
|
#define GDENUM(Name_, ...) struct Name_ {\
|
|
|
|
enum Value {__VA_ARGS__};\
|
|
|
|
private:\
|
|
|
|
Value value{};\
|
|
|
|
public:\
|
|
|
|
static inline godot::String get_property_hint() { return godot::String(#__VA_ARGS__); }\
|
|
|
|
inline Name_(Value value): value{value} {}\
|
|
|
|
inline Name_(Name_ const &value): value{value.value} {}\
|
|
|
|
}
|
|
|
|
|
2024-01-30 09:36:58 +00:00
|
|
|
#endif // !UC_GODOT_MACROS_H
|