Skip to content

Instantly share code, notes, and snippets.

@miremrie
Created March 27, 2026 20:04
Show Gist options
  • Select an option

  • Save miremrie/a979e5f1093b7e5aa72d8fbf476447de to your computer and use it in GitHub Desktop.

Select an option

Save miremrie/a979e5f1093b7e5aa72d8fbf476447de to your computer and use it in GitHub Desktop.
Godot macros
#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