godot-cpp-utils/godot_macros.hpp

120 lines
5.3 KiB
C++
Raw Permalink Normal View History

#ifndef UTILS_GODOT_MACROS_HPP
#define UTILS_GODOT_MACROS_HPP
/*! \file godot_macros.hpp
* \brief C-style preprocessor macros to simplify using godot's C++ API.
*/
2024-01-30 09:36:58 +00:00
#include <godot_cpp/classes/engine.hpp>
#include <godot_cpp/core/class_db.hpp>
#include <godot_cpp/variant/string.hpp>
2024-01-30 09:36:58 +00:00
#define MACRO_STRING_INNER(_Arg) #_Arg
#define MACRO_STRING(_Arg) MACRO_STRING_INNER(_Arg)
/*! \def GDPROPERTY(PropName_, PropType_)
* \brief 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
/*! \def GDPROPERTY_HINTED(PropName_, PropType_, ...)
* \brief 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
/*! \def GDFUNCTION(FnName_)
* \brief Register a function CLASSNAME::FnName_() to godot.
*
* Requires setting CLASSNAME as a #define first.
*/
#define GDFUNCTION(FnName_) godot::ClassDB::bind_method(godot::D_METHOD(#FnName_), &CLASSNAME::FnName_)
2024-01-30 09:36:58 +00:00
/*! \def GDFUNCTION_ARGS(FnName_, ...)
* \brief Register a function CLASSNAME::FnName_(...) to godot.
*
* Requires setting CLASSNAME as a #define first.
*/
#define GDFUNCTION_ARGS(FnName_, ...) godot::ClassDB::bind_method(godot::D_METHOD(#FnName_, __VA_ARGS__), &CLASSNAME::FnName_)
2024-01-30 09:36:58 +00:00
/*! \def GDFUNCTION_STATIC(FnName_)
* \brief Register a static member function CLASSNAME::FnName_() to godot.
*
* Requires setting CLASSNAME as a #define first.
*/
#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
/*! \def GDFUNCTION_STATIC_ARGS(FnName_, ...)
* \brief Register a static member function CLASSNAME::FnName_(...) to godot.
*
* Requires setting CLASSNAME as a #define first.
*/
#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
/*! \def GDSIGNAL(...)
* \brief Declare a godot Observer signal.
*/
#define GDSIGNAL(...) godot::ClassDB::add_signal(MACRO_STRING(CLASSNAME), godot::MethodInfo(__VA_ARGS__))
2024-03-20 10:35:13 +00:00
/*! \def GDRESOURCETYPE(Class_)
* \brief Construct godot resource type hint.
*
* Use when registering properties of arrays of resource classes.
*/
#define GDRESOURCETYPE(Class_) godot::vformat("%s/%s:%s", godot::Variant::OBJECT, godot::PROPERTY_HINT_RESOURCE_TYPE, Class_)
2024-07-28 09:40:06 +00:00
#define GDNODETYPE(Class_) godot::vformat("%s/%s:%s", godot::Variant::OBJECT, godot::PROPERTY_HINT_NODE_TYPE, Class_)
#define GDENUMTYPE(EnumString_) godot::vformat("%s/%s:%s", godot::Variant::INT, godot::PROPERTY_HINT_ENUM, EnumString_)
2024-01-30 09:36:58 +00:00
/*! \def GDEDITORONLY()
* \brief Execute the rest of the function only if currently running as editor.
*
* Useful for _ready, _enter/_exit, _process, etc. functions.
*/
#define GDEDITORONLY() if(!godot::Engine::get_singleton()->is_editor_hint()) return;
/*! \def GDGAMEONLY()
* \brief Execute the rest of the function only if currently running as game.
*
* Useful for _ready, _enter/_exit, _process, etc. functions.
*/
#define GDGAMEONLY() if(godot::Engine::get_singleton()->is_editor_hint()) return;
/*! \def GDENUM(Name_, ...)
* \brief 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_ {\
public:\
enum Value : uint32_t {__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_(uint32_t value) : value{value} {}\
inline Name_(int value) : value{static_cast<uint32_t>(value)} {}\
inline Name_(Name_ const &value) : value{value.value} {}\
inline bool operator==(Name_ const &rhs) const { return this->value == rhs.value; }\
inline bool operator==(Value const &rhs) const { return this->value == rhs; }\
inline bool operator!=(Name_ const &rhs) const { return this->value != rhs.value; }\
inline bool operator!=(Value const &rhs) const { return this->value != rhs; }\
inline operator Value() const { return this->value; }\
inline operator uint32_t() const { return this->value; }\
inline operator int() const { return static_cast<int>(this->value); }\
}
#endif // !UTILS_GODOT_MACROS_HPP