#pragma once #include "../../datatypes/base.h" #include "datatypes/meta.h" #include #include #include #include #include class Instance; struct FieldCodec { void (*write)(Data::Variant source, void* destination); Data::Variant (*read)(void* source); }; template constexpr FieldCodec fieldCodecOf() { return FieldCodec { .write = [](Data::Variant source, void* destination) { *(U*)destination = (U)source.get(); }, .read = [](void* source) -> Data::Variant { return T(*(U*)source); }, }; } template constexpr FieldCodec fieldCodecOf() { return FieldCodec { .write = [](Data::Variant source, void* destination) { *(T*)destination = source.get(); }, .read = [](void* source) -> Data::Variant { return *(T*)source; }, }; } template std::function memberFunctionOf(void(T::*func)(std::string), T* obj) { return std::bind(func, obj, std::placeholders::_1); } enum PropertyFlags { PROP_HIDDEN = 1 << 0, // Hidden from the editor PROP_NOSAVE = 1 << 1, // Do not serialize PROP_UNIT_FLOAT = 1 << 2, // Float between 0 and 1 PROP_READONLY = 1 << 3, // Read only property, do not write }; enum PropertyCategory { PROP_CATEGORY_APPEARENCE, PROP_CATEGORY_DATA, PROP_CATEGORY_BEHAVIOR, PROP_CATEGORY_PART, PROP_CATEGORY_SURFACE, }; const int PROPERTY_CATEGORY_MAX = PROP_CATEGORY_SURFACE; struct PropertyMeta { void* backingField; const Data::TypeInfo* type; FieldCodec codec; std::optional> updateCallback; PropertyFlags flags; PropertyCategory category = PROP_CATEGORY_DATA; }; typedef std::variant MemberMeta; struct MemberMap { std::optional> super; std::map members; };