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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
|
#pragma once
#include "../gamedef.h"
#if IS_EDITOR
#include <math.h>
#include "../util/string.h"
#define EPROP( _type, name, value, display ) \
_type name = value; \
EDITOR_PROP name##_prop{ .pdata = &name, .type = eprop_type<_type>(), .displayname = display, .parent = this };
#define EPROP_RANGED( _type, name, value, display, _min, _max ) \
_type name{ value }; \
EDITOR_PROP{ \
.pdata = &name, \
.type = eprop_type<_type>(), \
.displayname = display, \
.parent = this, \
.min = _min, \
.max = _max \
}
enum EditorPropType_t {
EPROP_INVALID = 0,
EPROP_U8 = 1,
EPROP_U16,
EPROP_U32,
EPROP_U64,
EPROP_I8,
EPROP_I16,
EPROP_I32,
EPROP_I64,
EPROP_F32,
EPROP_F64,
EPROP_STRING,
EPROP_OBJ,
EPROP_LIST,
EPROP_TEXTURE_LIST,
};
// editor map object
struct EOBJECT {
LIST<struct EDITOR_PROP*> eprops{};
};
// editor object property
struct EDITOR_PROP {
void* pdata;
U8 type;
STR displayname;
F64 min{ -INFINITY };
F64 max{ INFINITY };
struct EOBJECT* parent;
template <typename T> struct __eprop_type {
static const U8 type = EPROP_INVALID;
};
template <> struct __eprop_type<U8> { static const U8 type = EPROP_U8; };
template <> struct __eprop_type<U16> { static const U8 type = EPROP_U16; };
template <> struct __eprop_type<U32> { static const U8 type = EPROP_U32; };
template <> struct __eprop_type<U64> { static const U8 type = EPROP_U64; };
template <> struct __eprop_type<I8> { static const U8 type = EPROP_I8; };
template <> struct __eprop_type<I16> { static const U8 type = EPROP_I16; };
template <> struct __eprop_type<I32> { static const U8 type = EPROP_I32; };
template <> struct __eprop_type<I64> { static const U8 type = EPROP_I64; };
template <> struct __eprop_type<F32> { static const U8 type = EPROP_F32; };
template <> struct __eprop_type<F64> { static const U8 type = EPROP_F64; };
template <> struct __eprop_type<STR> { static const U8 type = EPROP_STRING; };
template <> struct __eprop_type<EOBJECT> { static const U8 type = EPROP_OBJ; };
template <typename LT> struct __eprop_type<LIST<LT>> { static const U8 type = EPROP_LIST; };
template <> struct __eprop_type<LIST<struct MAP_TEXTURE_ENTRY*>> { static const U8 type = EPROP_TEXTURE_LIST; };
};
template <typename T>
const U8 eprop_type() {
if constexpr( __is_base_of( EOBJECT, T ) )
return EPROP_OBJ;
return EDITOR_PROP::__eprop_type<T>::type;
}
#else
struct EOBJECT {};
#define EPROP( type, name, value, displayname ) \
type name{ value };
#endif
|