aboutsummaryrefslogtreecommitdiff
path: root/eng/inc/entityimpl.h
diff options
context:
space:
mode:
Diffstat (limited to 'eng/inc/entityimpl.h')
-rw-r--r--eng/inc/entityimpl.h48
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