aboutsummaryrefslogtreecommitdiff
path: root/eng/inc/entityimpl.h
blob: 06df273e54010e41e24acd41170b60d1378db6be (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
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