summaryrefslogtreecommitdiff
path: root/src/editor/properties.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/editor/properties.h')
-rw-r--r--src/editor/properties.h160
1 files changed, 146 insertions, 14 deletions
diff --git a/src/editor/properties.h b/src/editor/properties.h
index 34ac765..d663a6b 100644
--- a/src/editor/properties.h
+++ b/src/editor/properties.h
@@ -1,7 +1,6 @@
#pragma once
#include "../gamedef.h"
-#include <concepts>
#if IS_EDITOR
#include <math.h>
@@ -9,17 +8,46 @@
#define EPROP( _type, name, value, display ) \
_type name = value; \
- EDITOR_PROP name##_prop{ .pdata = &name, .type = eprop_type<_type>(), .displayname = display, .parent = this };
+ EDITOR_PROP name##_prop{ &name, eprop_type<_type>(), display, this, 0 }
+
+#define EPROP_RO( _type, name, value, display ) \
+ _type name = value; \
+ EDITOR_PROP name##_prop{ &name, eprop_type<_type>(), display, this, 1 }
#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 \
+ _type name = value; \
+ EDITOR_PROP name##_prop{ \
+ &name, \
+ eprop_type<_type>(), \
+ display, \
+ this, \
+ _min, \
+ _max, \
+ 0 \
+ }
+
+#define EPROP_STEP( _type, name, value, display, step ) \
+ _type name = value; \
+ EDITOR_PROP name##_prop{ \
+ &name, \
+ eprop_type<_type>(), \
+ display, \
+ step, \
+ this, \
+ 0 \
+ }
+
+#define EPROP_RANGED_STEP( _type, name, value, display, min, max, step ) \
+ _type name = value; \
+ EDITOR_PROP name##_prop{ \
+ &name, \
+ eprop_type<_type>(), \
+ display, \
+ step, \
+ this, \
+ min, \
+ max, \
+ 0 \
}
enum EditorPropType_t {
@@ -34,15 +62,27 @@ enum EditorPropType_t {
EPROP_I64,
EPROP_F32,
EPROP_F64,
+ EPROP_VEC2,
+ EPROP_VEC3,
+ EPROP_VEC4,
+ EPROP_CLR,
+ EPROP_MAPPROP,
EPROP_STRING,
EPROP_OBJ,
EPROP_LIST,
+ EPROP_TEXTURE,
EPROP_TEXTURE_LIST,
+ EPROP_VERTEX,
+ EPROP_VERTEX_LIST
+};
+
+struct EPROP_ENTRY {
+ U64 offset;
};
// editor map object
struct EOBJECT {
- LIST<struct EDITOR_PROP*> eprops{};
+ LIST<EPROP_ENTRY> eprops{};
};
template <typename T>
@@ -50,13 +90,89 @@ concept __eobject_base = __is_base_of(EOBJECT, T);
// editor object property
struct EDITOR_PROP {
- void* pdata;
+ EDITOR_PROP( void* _pdata, U8 _type, STR _displayname, struct EOBJECT* _parent, U8 _readonly = 0 ) {
+ type = _type;
+ displayname = _displayname;
+ min = -INFINITY;
+ max = INFINITY;
+ step = 0;
+ readonly = _readonly;
+
+ U64 _this = (U64)this;
+ U64 pdata = (U64)_pdata;
+ U64 parent = (U64)_parent;
+ U64 offset = _this - parent;
+
+ _parent->eprops.push( { offset } );
+
+ offset = _this - pdata;
+ dataoff = offset;
+ }
+
+ EDITOR_PROP( void* _pdata, U8 _type, STR _displayname, F32 _step, struct EOBJECT* _parent, U8 _readonly = 0 ) {
+ type = _type;
+ displayname = _displayname;
+ min = -INFINITY;
+ max = INFINITY;
+ step = _step;
+ readonly = _readonly;
+
+ U64 _this = (U64)this;
+ U64 pdata = (U64)_pdata;
+ U64 parent = (U64)_parent;
+ U64 offset = _this - parent;
+
+ _parent->eprops.push( { offset } );
+
+ offset = _this - pdata;
+ dataoff = offset;
+ }
+
+ EDITOR_PROP( void* _pdata, U8 _type, STR _displayname, struct EOBJECT* _parent, F32 _min, F32 _max, U8 _readonly = 0 ) {
+ type = _type;
+ displayname = _displayname;
+ min = _min;
+ max = _max;
+ step = 0;
+ readonly = _readonly;
+
+ U64 _this = (U64)this;
+ U64 pdata = (U64)_pdata;
+ U64 parent = (U64)_parent;
+ U64 offset = _this - parent;
+
+ _parent->eprops.push( { offset } );
+
+ offset = _this - pdata;
+ dataoff = offset;
+ }
+
+ EDITOR_PROP( void* _pdata, U8 _type, STR _displayname, F32 _step, struct EOBJECT* _parent, F32 _min, F32 _max, U8 _readonly = 0 ) {
+ type = _type;
+ displayname = _displayname;
+ min = _min;
+ max = _max;
+ step = _step;
+ readonly = _readonly;
+
+ U64 _this = (U64)this;
+ U64 pdata = (U64)_pdata;
+ U64 parent = (U64)_parent;
+ U64 offset = _this - parent;
+
+ _parent->eprops.push( { offset } );
+
+ offset = _this - pdata;
+ dataoff = offset;
+ }
+
+ U64 dataoff;
U8 type;
STR displayname;
F64 min{ -INFINITY };
F64 max{ INFINITY };
- struct EOBJECT* parent;
-
+ F32 step;
+ U8 readonly;
template <typename T> struct __eprop_type {
static const U8 type = EPROP_INVALID;
@@ -72,11 +188,27 @@ struct EDITOR_PROP {
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<struct CLR> { static const U8 type = EPROP_CLR; };
+ template <> struct __eprop_type<struct VEC2> { static const U8 type = EPROP_VEC2; };
+ template <> struct __eprop_type<struct VEC3> { static const U8 type = EPROP_VEC3; };
+ template <> struct __eprop_type<struct VEC4> { static const U8 type = EPROP_VEC4; };
+ template <> struct __eprop_type<struct MAP_PROPREF> { static const U8 type = EPROP_MAPPROP; };
+ template <> struct __eprop_type<struct GL_TEX2D*> { static const U8 type = EPROP_TEXTURE; };
template <__eobject_base T> struct __eprop_type<T> { 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 <> struct __eprop_type<struct MAP_VERTEX> { static const U8 type = EPROP_VERTEX; };
+ template <> struct __eprop_type<LIST<struct MAP_VERTEX>> { static const U8 type = EPROP_VERTEX_LIST; };
};
+inline EDITOR_PROP* eprop_from_ref( EOBJECT* obj, EPROP_ENTRY e ) {
+ return (EDITOR_PROP*)( (U64)obj + e.offset );
+}
+
+inline void* eprop_ptr( EDITOR_PROP* prop ) {
+ return (void*)( (U64)prop - prop->dataoff);
+}
+
template <typename T>
const U8 eprop_type() {
return EDITOR_PROP::__eprop_type<T>::type;