diff options
Diffstat (limited to 'eng/inc/entityimpl.h')
-rw-r--r-- | eng/inc/entityimpl.h | 48 |
1 files changed, 48 insertions, 0 deletions
diff --git a/eng/inc/entityimpl.h b/eng/inc/entityimpl.h new file mode 100644 index 0000000..06df273 --- /dev/null +++ b/eng/inc/entityimpl.h @@ -0,0 +1,48 @@ +#pragma once +#include "vtable.h" + +#define NAME(X) \ +static Vtable _vtable = {0}; \ +__attribute__((constructor(101))) \ +static void \ +_register_vtable(void) \ +{ \ + _vtable.id = ++___vtable_i; \ + if (___vtables == NULL) \ + ___vtables = &_vtable; \ + else { \ + Vtable *tail = ___vtables; \ + while (tail->next != NULL) \ + tail = tail->next; \ + tail->next = &_vtable; \ + } \ +} \ +SET(name, #X) + +#define SET(x, X) \ +__attribute__((constructor(102))) \ +static void \ +_set_##x(void) \ +{ \ + _vtable.x = X; \ +} + +#define IMPL(X) \ +static void _##X(Entity *this); \ +SET(X, _##X); \ +static void \ +_##X(Entity *this) + +#define PARENT(X) SET(parent, #X) +#define INIT() IMPL(init) +#define DEINIT() IMPL(deinit) +#define DRAW() IMPL(draw) +#define UPDATE() IMPL(update) +#define SUPER(X) vtable_get(_vtable.parent)->X(this) +#define T this +#define G this->g +#define POS this->pos +#define DIM this->dim +#define VEL this->vel +#define REM this->rem +#define SQRT2 1.414214 |