Created
March 27, 2026 20:04
-
-
Save miremrie/a979e5f1093b7e5aa72d8fbf476447de to your computer and use it in GitHub Desktop.
Godot macros
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #pragma once | |
| // PROP_INLINE macros are used in the class declarations to declare the member, getters and setters | |
| // PROP_BIND macros are used in the _bind_methods | |
| // For PROP_BIND macros to work, you must do a #define CURR_CLASS MyClass before calling them. | |
| // Don't forget to #undef CURR_CLASS at the end. | |
| // NODE RESOLVE macros get the node from the serialized node path. I usually do this on _ready. | |
| #define STR_HLP(s) #s | |
| #define STR(s) STR_HLP(s) | |
| #define COMB_HLP(a,b) a ## b | |
| #define COMB(a,b) COMB_HLP(a,b) | |
| #define MAKE_RESOURCE_TYPE_HINT(m_type) vformat("%s/%s:%s", Variant::OBJECT, PROPERTY_HINT_RESOURCE_TYPE, m_type) | |
| #define MAKE_NODE_TYPE_HINT(m_type) vformat("%s/%s:%s", Variant::NODE_PATH, PROPERTY_HINT_NODE_PATH_VALID_TYPES, m_type) | |
| #define PROP_INLINE(name, type) \ | |
| type _##name; \ | |
| void set_##name(const type& name) { _##name = name; } \ | |
| type get_##name() const { return _##name; } \ | |
| #define PROP_INLINE_VALUE(name, type, value) \ | |
| type _##name = value; \ | |
| void set_##name(const type& name) { _##name = name; } \ | |
| type get_##name() const { return _##name; } \ | |
| #define PROP_INLINE_PTR(name, type) \ | |
| type* _##name; \ | |
| void set_##name(type* name) { _##name = name; } \ | |
| type* get_##name() const { return _##name; } \ | |
| #define PROP_INLINE_REF(name, type) \ | |
| Ref<type> _##name; \ | |
| void set_##name(const Ref<type> name) { _##name = name; } \ | |
| Ref<type> get_##name() const { return _##name; } \ | |
| #define PROP_INLINE_NODE(name, type) \ | |
| NodePath _##name##_nodePath; \ | |
| type* _##name = nullptr; \ | |
| void set_##name(NodePath name) { _##name##_nodePath = name; } \ | |
| NodePath get_##name() const { return _##name##_nodePath; } \ | |
| #define PROP_INLINE_ENUM(name, type) \ | |
| type _##name = {}; \ | |
| void set_##name(type name) { _##name = name; } \ | |
| type get_##name() const { return _##name; } \ | |
| #define PROP_INLINE_ARRAY(name, type) \ | |
| TypedArray<type> _##name{}; \ | |
| void set_##name(const TypedArray<type>& name) { _##name = name; } \ | |
| TypedArray<type> get_##name() const { return _##name; } \ | |
| #define PROP_INLINE_ARRAY_NODE(name, type) \ | |
| TypedArray<NodePath> _##name##_nodePaths; \ | |
| LocalVector<type*> _##name; \ | |
| void set_##name(const TypedArray<NodePath>& name) { _##name##_nodePaths = name; } \ | |
| TypedArray<NodePath> get_##name() const { return _##name##_nodePaths; } \ | |
| #define PROP_INLINE_ARRAY_REF(name, type) \ | |
| TypedArray<type> _##name{}; \ | |
| void set_##name(const TypedArray<type>& name) { _##name = name; } \ | |
| TypedArray<type> get_##name() const { return _##name; } \ | |
| #define NODE_PROP_RESOLVE(name, type) \ | |
| Node* name##_node##_generic = get_node_or_null(_##name##_nodePath); \ | |
| if (name##_node##_generic != nullptr) \ | |
| { \ | |
| _##name = Object::cast_to<type>(name##_node##_generic); \ | |
| } \ | |
| #define NODE_ARRAY_PROP_RESOLVE(name, type) \ | |
| for (const NodePath& path : _##name##_nodePaths) \ | |
| { \ | |
| Node* n = get_node_or_null(path); \ | |
| type* casted = cast_to<Wall>(n); \ | |
| _##name.push_back(casted); \ | |
| } \ | |
| #define PROP_BIND_GETSET(name) \ | |
| ClassDB::bind_method(D_METHOD(STR(COMB(get_,name))), &CURR_CLASS::COMB(get_,name)); \ | |
| ClassDB::bind_method(D_METHOD(STR(COMB(set_,name)), STR(COMB(p_, name))), &CURR_CLASS::set_##name); \ | |
| #define PROP_BIND(name, type, upType) \ | |
| PROP_BIND_GETSET(name) \ | |
| ADD_PROPERTY(PropertyInfo(Variant::upType, #name), STR(COMB(set_,name)), STR(COMB(get_,name))); \ | |
| #define PROP_BIND_RESOURCE(name, type) \ | |
| PROP_BIND_GETSET(name) \ | |
| ADD_PROPERTY(PropertyInfo(Variant::OBJECT, #name, PROPERTY_HINT_RESOURCE_TYPE, #type), STR(COMB(set_,name)), STR(COMB(get_,name))); \ | |
| #define PROP_BIND_NODE(name, type) \ | |
| PROP_BIND_GETSET(name) \ | |
| ADD_PROPERTY(PropertyInfo(Variant::NODE_PATH, #name, PROPERTY_HINT_NODE_PATH_VALID_TYPES, #type), STR(COMB(set_,name)), STR(COMB(get_,name))); \ | |
| #define PROP_BIND_ARRAY(name, type) \ | |
| PROP_BIND_GETSET(name) \ | |
| ADD_PROPERTY(PropertyInfo(Variant::ARRAY, #name, PROPERTY_HINT_NONE), STR(COMB(set_,name)), STR(COMB(get_,name))); \ | |
| #define PROP_BIND_ARRAY_RESOURCE(name, type) \ | |
| PROP_BIND_GETSET(name) \ | |
| ADD_PROPERTY(PropertyInfo(Variant::ARRAY, #name, PROPERTY_HINT_ARRAY_TYPE, MAKE_RESOURCE_TYPE_HINT(#type)), STR(COMB(set_,name)), STR(COMB(get_,name))); \ | |
| #define PROP_BIND_ARRAY_NODE(name, type) \ | |
| PROP_BIND_GETSET(name) \ | |
| ADD_PROPERTY(PropertyInfo(Variant::ARRAY, #name, PROPERTY_HINT_ARRAY_TYPE, MAKE_NODE_TYPE_HINT(#type)), STR(COMB(set_,name)), STR(COMB(get_,name))); \ | |
| #define DCAST(object, type) \ | |
| Object::cast_to<type>(object) \ | |
| #define SafeQFree(object) \ | |
| object->queue_free(); \ | |
| object = nullptr; \ | |
| #define GetInstanceCast(id, type) \ | |
| Object::cast_to<type>(ObjectDB::get_instance(id)) | |
| #define IsInstanceValid(id) \ | |
| ObjectDB::get_instance(id) | |
| #define VariantCast(variant, type) \ | |
| Object::cast_to<type>(variant.get_validated_object()) \ | |
| #define Vector2_Zero Vector2(0.f, 0.f) | |
| #define Vector2_One Vector2(1.f, 1.f) | |
| #define Vector2_Up Vector2(0.f, -1.f) | |
| #define Vector2_Down Vector2(0.f, 1.f) | |
| #define Vector2_Left Vector2(-1.f, 0.f) | |
| #define Vector2_Right Vector2(1.f, 0.f) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment