diff --git a/include/Nazara/Core/BinarySerialization.hpp b/include/Nazara/Core/BinarySerialization.hpp index e0089030e..d52c845b1 100644 --- a/include/Nazara/Core/BinarySerialization.hpp +++ b/include/Nazara/Core/BinarySerialization.hpp @@ -9,6 +9,8 @@ namespace Nz : public SerializationContext { public: + EnumSerializationMode GetEnumSerializationMode() const override { return EnumSerializationMode::Binary; } + bool PushObject(std::string_view name) override; bool PopObject() override; bool PushArray(std::string_view name) override; diff --git a/include/Nazara/Core/EnumSerialization.hpp b/include/Nazara/Core/EnumSerialization.hpp new file mode 100644 index 000000000..6a3f27df1 --- /dev/null +++ b/include/Nazara/Core/EnumSerialization.hpp @@ -0,0 +1,64 @@ +#pragma once + +#include +#include + +#include + +namespace Nz +{ + template + concept Enum = std::is_enum_v; + + template TEnum EnumFromString(std::string_view) { return TEnum{}; } + +#define DEF_ENUM(Type) \ + NAZARA_CORE_API std::string_view EnumToString(Type t); \ + NAZARA_CORE_API Type EnumFromString_##Type(std::string_view); \ + template<> inline Type EnumFromString(std::string_view v) { return EnumFromString_##Type(v); } + + DEF_ENUM(AnimationType); + DEF_ENUM(BlendEquation); + DEF_ENUM(BlendFunc); + DEF_ENUM(BufferAccess); + DEF_ENUM(BufferType); + DEF_ENUM(BufferUsage); + DEF_ENUM(ComponentType); + DEF_ENUM(CoordSys); + DEF_ENUM(CursorPosition); + DEF_ENUM(CubemapFace); + DEF_ENUM(DataStorage); + DEF_ENUM(ErrorMode); + DEF_ENUM(ErrorType); + DEF_ENUM(FaceFilling); + DEF_ENUM(FaceCulling); + DEF_ENUM(FrontFace); + DEF_ENUM(ImageType); + DEF_ENUM(IndexType); + DEF_ENUM(HashType); + DEF_ENUM(OpenMode); + DEF_ENUM(ParameterType); + DEF_ENUM(PixelFormatContent); + DEF_ENUM(PixelFormat); + DEF_ENUM(PixelFormatSubType); + DEF_ENUM(PixelFlipping); + DEF_ENUM(PrimitiveMode); + DEF_ENUM(PrimitiveType); + DEF_ENUM(ProcessorCap); + DEF_ENUM(ProcessorVendor); + DEF_ENUM(RendererComparison); + DEF_ENUM(ResourceLoadingError); + DEF_ENUM(SamplerFilter); + DEF_ENUM(SamplerMipmapMode); + DEF_ENUM(SamplerWrap); + DEF_ENUM(SphereType); + DEF_ENUM(StencilOperation); + DEF_ENUM(StreamOption); + DEF_ENUM(TextAlign); + DEF_ENUM(TextStyle); + DEF_ENUM(VertexComponent); + DEF_ENUM(VertexInputRate); + DEF_ENUM(VertexLayout); + +#undef DEF_ENUM +} diff --git a/include/Nazara/Core/Serialization.hpp b/include/Nazara/Core/Serialization.hpp index 2c02c9c85..ab8be9b38 100644 --- a/include/Nazara/Core/Serialization.hpp +++ b/include/Nazara/Core/Serialization.hpp @@ -8,6 +8,7 @@ #define NAZARA_CORE_SERIALIZATION_HPP #include +#include #include #include #include @@ -21,9 +22,17 @@ namespace Nz template concept Numeric = std::is_arithmetic::value; + enum class EnumSerializationMode + { + Binary, + String, + }; + struct NAZARA_CORE_API SerializationContext { public: + virtual EnumSerializationMode GetEnumSerializationMode() const = 0; + virtual bool PushObject(std::string_view name) = 0; virtual bool PopObject() = 0; virtual bool PushArray(std::string_view name) = 0; @@ -83,6 +92,9 @@ namespace Nz template inline bool Serialize(SerializationContext& context, std::string_view name, const T& value, TypeTag); + template + inline bool Serialize(SerializationContext& context, std::string_view name, const T& value, TypeTag); + template inline bool Unserialize(SerializationContext&, T*, TypeTag) { return false; } @@ -113,6 +125,9 @@ namespace Nz template inline bool Unserialize(SerializationContext& context, std::string_view name, T* value, TypeTag); + + template + bool Unserialize(SerializationContext& context, std::string_view name, T* value, TypeTag); } #include diff --git a/include/Nazara/Core/Serialization.inl b/include/Nazara/Core/Serialization.inl index b41d07089..b7fd27b69 100644 --- a/include/Nazara/Core/Serialization.inl +++ b/include/Nazara/Core/Serialization.inl @@ -2,6 +2,7 @@ // This file is part of the "Nazara Engine - Core module" // For conditions of distribution and use, see copyright notice in Export.hpp +#include namespace Nz { @@ -127,6 +128,19 @@ namespace Nz return context.Write(name, value); } + template + inline bool Serialize(SerializationContext& context, std::string_view name, const T& value, TypeTag) + { + switch (context.GetEnumSerializationMode()) + { + case EnumSerializationMode::Binary: + return Serialize(context, name, std::underlying_type_t(value), TypeTag>>()); + case EnumSerializationMode::String: + return Serialize(context, name, std::string(EnumToString(value)), TypeTag()); + } + return false; + } + template inline bool Unserialize(SerializationContext& context, std::string_view name, T* value) @@ -250,5 +264,33 @@ namespace Nz { return context.Read(name, value); } + + template + bool Unserialize(SerializationContext& context, std::string_view name, T* value, TypeTag) + { + switch (context.GetEnumSerializationMode()) + { + case EnumSerializationMode::Binary: + { + std::underlying_type_t v = 0; + if (!Unserialize(context, name, &v, TypeTag>>())) + return false; + + *value = static_cast(v); + return true; + } + case EnumSerializationMode::String: + { + std::string str; + if (!Unserialize(context, name, &str, TypeTag())) + return false; + + *value = EnumFromString(str); + return true; + } + } + return false; + } + } diff --git a/src/Nazara/Core/EnumSerialization.cpp b/src/Nazara/Core/EnumSerialization.cpp new file mode 100644 index 000000000..9bab2dbc2 --- /dev/null +++ b/src/Nazara/Core/EnumSerialization.cpp @@ -0,0 +1,501 @@ +#include + +#include +#include + +namespace Nz +{ + template + inline TEnum Find(const std::unordered_map& m, std::string_view v) + { + auto it = std::find_if(m.begin(), m.end(), [v](const auto& kp) { return kp.second == v; }); + return it != m.end() ? it->first : TEnum{}; + } + +#define DEF_ENUM(Type) \ + namespace Type ## _Generated { \ + std::unordered_map ValuesToString = { + +#define DEF_ENUM_VALUE(Type, Value) \ + { Type::Value, #Value }, + +#define DEF_ENUM_END(Type) \ + }; \ + } \ + std::string_view EnumToString(Type v) { return Type ## _Generated::ValuesToString[v]; }; \ + Type EnumFromString_##Type(std::string_view v) { return Find(Type ## _Generated::ValuesToString, v);} + + + DEF_ENUM(AnimationType) + DEF_ENUM_VALUE(AnimationType, Skeletal) + DEF_ENUM_VALUE(AnimationType, Static) + DEF_ENUM_END(AnimationType) + + DEF_ENUM(BlendEquation) + DEF_ENUM_VALUE(BlendEquation, Add) + DEF_ENUM_VALUE(BlendEquation, Max) + DEF_ENUM_VALUE(BlendEquation, Min) + DEF_ENUM_VALUE(BlendEquation, ReverseSubtract) + DEF_ENUM_VALUE(BlendEquation, Subtract) + DEF_ENUM_END(BlendEquation) + + DEF_ENUM(BlendFunc) + DEF_ENUM_VALUE(BlendFunc, ConstantColor) + DEF_ENUM_VALUE(BlendFunc, ConstantAlpha) + DEF_ENUM_VALUE(BlendFunc, DstAlpha) + DEF_ENUM_VALUE(BlendFunc, DstColor) + DEF_ENUM_VALUE(BlendFunc, SrcAlpha) + DEF_ENUM_VALUE(BlendFunc, SrcColor) + DEF_ENUM_VALUE(BlendFunc, InvConstantColor) + DEF_ENUM_VALUE(BlendFunc, InvConstantAlpha) + DEF_ENUM_VALUE(BlendFunc, InvDstAlpha) + DEF_ENUM_VALUE(BlendFunc, InvDstColor) + DEF_ENUM_VALUE(BlendFunc, InvSrcAlpha) + DEF_ENUM_VALUE(BlendFunc, InvSrcColor) + DEF_ENUM_VALUE(BlendFunc, One) + DEF_ENUM_VALUE(BlendFunc, Zero) + DEF_ENUM_END(BlendFunc) + + DEF_ENUM(BufferAccess) + DEF_ENUM_VALUE(BufferAccess, DiscardAndWrite) + DEF_ENUM_VALUE(BufferAccess, ReadOnly) + DEF_ENUM_VALUE(BufferAccess, ReadWrite) + DEF_ENUM_VALUE(BufferAccess, WriteOnly) + DEF_ENUM_VALUE(BufferAccess, Max) + DEF_ENUM_END(BufferAccess) + + DEF_ENUM(BufferType) + DEF_ENUM_VALUE(BufferType, Index) + DEF_ENUM_VALUE(BufferType, Vertex) + DEF_ENUM_VALUE(BufferType, Storage) + DEF_ENUM_VALUE(BufferType, Uniform) + DEF_ENUM_VALUE(BufferType, Upload) + DEF_ENUM_VALUE(BufferType, Max) + DEF_ENUM_END(BufferType) + + DEF_ENUM(BufferUsage) + DEF_ENUM_VALUE(BufferUsage, DeviceLocal) + DEF_ENUM_VALUE(BufferUsage, DirectMapping) + DEF_ENUM_VALUE(BufferUsage, Dynamic) + DEF_ENUM_VALUE(BufferUsage, Read) + DEF_ENUM_VALUE(BufferUsage, PersistentMapping) + DEF_ENUM_VALUE(BufferUsage, Write) + DEF_ENUM_VALUE(BufferUsage, Max) + DEF_ENUM_END(BufferUsage) + + DEF_ENUM(ComponentType) + DEF_ENUM_VALUE(ComponentType, Color) + DEF_ENUM_VALUE(ComponentType, Double1) + DEF_ENUM_VALUE(ComponentType, Double2) + DEF_ENUM_VALUE(ComponentType, Double3) + DEF_ENUM_VALUE(ComponentType, Double4) + DEF_ENUM_VALUE(ComponentType, Float1) + DEF_ENUM_VALUE(ComponentType, Float2) + DEF_ENUM_VALUE(ComponentType, Float3) + DEF_ENUM_VALUE(ComponentType, Float4) + DEF_ENUM_VALUE(ComponentType, Int1) + DEF_ENUM_VALUE(ComponentType, Int2) + DEF_ENUM_VALUE(ComponentType, Int3) + DEF_ENUM_VALUE(ComponentType, Int4) + DEF_ENUM_VALUE(ComponentType, Max) + DEF_ENUM_END(ComponentType) + + DEF_ENUM(CoordSys) + DEF_ENUM_VALUE(CoordSys, Global) + DEF_ENUM_VALUE(CoordSys, Local) + DEF_ENUM_VALUE(CoordSys, Max) + DEF_ENUM_END(CoordSys) + + DEF_ENUM(CursorPosition) + DEF_ENUM_VALUE(CursorPosition, AtBegin) + DEF_ENUM_VALUE(CursorPosition, AtCurrent) + DEF_ENUM_VALUE(CursorPosition, AtEnd) + DEF_ENUM_VALUE(CursorPosition, Max) + DEF_ENUM_END(CursorPosition) + + DEF_ENUM(CubemapFace) + DEF_ENUM_VALUE(CubemapFace, PositiveX) + DEF_ENUM_VALUE(CubemapFace, PositiveY) + DEF_ENUM_VALUE(CubemapFace, PositiveZ) + DEF_ENUM_VALUE(CubemapFace, NegativeX) + DEF_ENUM_VALUE(CubemapFace, NegativeY) + DEF_ENUM_VALUE(CubemapFace, NegativeZ) + DEF_ENUM_VALUE(CubemapFace, Max) + DEF_ENUM_END(CubemapFace) + + DEF_ENUM(DataStorage) + DEF_ENUM_VALUE(DataStorage, Hardware) + DEF_ENUM_VALUE(DataStorage, Software) + DEF_ENUM_VALUE(DataStorage, Max) + DEF_ENUM_END(DataStorage) + + DEF_ENUM(ErrorMode) + DEF_ENUM_VALUE(ErrorMode, Silent) + DEF_ENUM_VALUE(ErrorMode, ThrowException) + DEF_ENUM_VALUE(ErrorMode, Max) + DEF_ENUM_END(ErrorMode) + + DEF_ENUM(ErrorType) + DEF_ENUM_VALUE(ErrorType, AssertFailed) + DEF_ENUM_VALUE(ErrorType, Internal) + DEF_ENUM_VALUE(ErrorType, Normal) + DEF_ENUM_VALUE(ErrorType, Warning) + DEF_ENUM_VALUE(ErrorType, Max) + DEF_ENUM_END(ErrorType) + + DEF_ENUM(FaceFilling) + DEF_ENUM_VALUE(FaceFilling, Fill) + DEF_ENUM_VALUE(FaceFilling, Line) + DEF_ENUM_VALUE(FaceFilling, Point) + DEF_ENUM_VALUE(FaceFilling, Max) + DEF_ENUM_END(FaceFilling) + + DEF_ENUM(FaceCulling) + DEF_ENUM_VALUE(FaceCulling, None) + DEF_ENUM_VALUE(FaceCulling, Back) + DEF_ENUM_VALUE(FaceCulling, Front) + DEF_ENUM_VALUE(FaceCulling, FrontAndBack) + DEF_ENUM_VALUE(FaceCulling, Max) + DEF_ENUM_END(FaceCulling) + + DEF_ENUM(FrontFace) + DEF_ENUM_VALUE(FrontFace, Clockwise) + DEF_ENUM_VALUE(FrontFace, CounterClockwise) + DEF_ENUM_VALUE(FrontFace, Max) + DEF_ENUM_END(FrontFace) + + DEF_ENUM(ImageType) + DEF_ENUM_VALUE(ImageType, E1D) + DEF_ENUM_VALUE(ImageType, E1D_Array) + DEF_ENUM_VALUE(ImageType, E2D) + DEF_ENUM_VALUE(ImageType, E2D_Array) + DEF_ENUM_VALUE(ImageType, E3D) + DEF_ENUM_VALUE(ImageType, Cubemap) + DEF_ENUM_VALUE(ImageType, Max) + DEF_ENUM_END(ImageType) + + DEF_ENUM(IndexType) + DEF_ENUM_VALUE(IndexType, U8) + DEF_ENUM_VALUE(IndexType, U16) + DEF_ENUM_VALUE(IndexType, U32) + DEF_ENUM_VALUE(IndexType, Max) + DEF_ENUM_END(IndexType) + + DEF_ENUM(HashType) + DEF_ENUM_VALUE(HashType, CRC32) + DEF_ENUM_VALUE(HashType, CRC64) + DEF_ENUM_VALUE(HashType, Fletcher16) + DEF_ENUM_VALUE(HashType, MD5) + DEF_ENUM_VALUE(HashType, SHA1) + DEF_ENUM_VALUE(HashType, SHA224) + DEF_ENUM_VALUE(HashType, SHA256) + DEF_ENUM_VALUE(HashType, SHA384) + DEF_ENUM_VALUE(HashType, SHA512) + DEF_ENUM_VALUE(HashType, Whirlpool) + DEF_ENUM_VALUE(HashType, Max) + DEF_ENUM_END(HashType) + + DEF_ENUM(OpenMode) + DEF_ENUM_VALUE(OpenMode, NotOpen) + DEF_ENUM_VALUE(OpenMode, Append) + DEF_ENUM_VALUE(OpenMode, Defer) + DEF_ENUM_VALUE(OpenMode, Lock) + DEF_ENUM_VALUE(OpenMode, MustExist) + DEF_ENUM_VALUE(OpenMode, Read) + DEF_ENUM_VALUE(OpenMode, Text) + DEF_ENUM_VALUE(OpenMode, Truncate) + DEF_ENUM_VALUE(OpenMode, Unbuffered) + DEF_ENUM_VALUE(OpenMode, Write) + DEF_ENUM_VALUE(OpenMode, Max) + DEF_ENUM_END(OpenMode) + + DEF_ENUM(ParameterType) + DEF_ENUM_VALUE(ParameterType, Boolean) + DEF_ENUM_VALUE(ParameterType, Color) + DEF_ENUM_VALUE(ParameterType, Double) + DEF_ENUM_VALUE(ParameterType, Integer) + DEF_ENUM_VALUE(ParameterType, None) + DEF_ENUM_VALUE(ParameterType, Pointer) + DEF_ENUM_VALUE(ParameterType, String) + DEF_ENUM_VALUE(ParameterType, Userdata) + DEF_ENUM_VALUE(ParameterType, Max) + DEF_ENUM_END(ParameterType) + + DEF_ENUM(PixelFormatContent) + DEF_ENUM_VALUE(PixelFormatContent, Undefined) + DEF_ENUM_VALUE(PixelFormatContent, ColorRGBA) + DEF_ENUM_VALUE(PixelFormatContent, Depth) + DEF_ENUM_VALUE(PixelFormatContent, DepthStencil) + DEF_ENUM_VALUE(PixelFormatContent, Stencil) + DEF_ENUM_VALUE(PixelFormatContent, Max) + DEF_ENUM_END(PixelFormatContent) + + DEF_ENUM(PixelFormat) + DEF_ENUM_VALUE(PixelFormat, Undefined) + DEF_ENUM_VALUE(PixelFormat, A8) + DEF_ENUM_VALUE(PixelFormat, BGR8) + DEF_ENUM_VALUE(PixelFormat, BGR8_SRGB) + DEF_ENUM_VALUE(PixelFormat, BGRA8) + DEF_ENUM_VALUE(PixelFormat, BGRA8_SRGB) + DEF_ENUM_VALUE(PixelFormat, DXT1) + DEF_ENUM_VALUE(PixelFormat, DXT3) + DEF_ENUM_VALUE(PixelFormat, DXT5) + DEF_ENUM_VALUE(PixelFormat, L8) + DEF_ENUM_VALUE(PixelFormat, LA8) + DEF_ENUM_VALUE(PixelFormat, R8) + DEF_ENUM_VALUE(PixelFormat, R8I) + DEF_ENUM_VALUE(PixelFormat, R8UI) + DEF_ENUM_VALUE(PixelFormat, R16) + DEF_ENUM_VALUE(PixelFormat, R16F) + DEF_ENUM_VALUE(PixelFormat, R16I) + DEF_ENUM_VALUE(PixelFormat, R16UI) + DEF_ENUM_VALUE(PixelFormat, R32F) + DEF_ENUM_VALUE(PixelFormat, R32I) + DEF_ENUM_VALUE(PixelFormat, R32UI) + DEF_ENUM_VALUE(PixelFormat, RG8) + DEF_ENUM_VALUE(PixelFormat, RG8I) + DEF_ENUM_VALUE(PixelFormat, RG8UI) + DEF_ENUM_VALUE(PixelFormat, RG16) + DEF_ENUM_VALUE(PixelFormat, RG16F) + DEF_ENUM_VALUE(PixelFormat, RG16I) + DEF_ENUM_VALUE(PixelFormat, RG16UI) + DEF_ENUM_VALUE(PixelFormat, RG32F) + DEF_ENUM_VALUE(PixelFormat, RG32I) + DEF_ENUM_VALUE(PixelFormat, RG32UI) + DEF_ENUM_VALUE(PixelFormat, RGB5A1) + DEF_ENUM_VALUE(PixelFormat, RGB8) + DEF_ENUM_VALUE(PixelFormat, RGB8_SRGB) + DEF_ENUM_VALUE(PixelFormat, RGB16F) + DEF_ENUM_VALUE(PixelFormat, RGB16I) + DEF_ENUM_VALUE(PixelFormat, RGB16UI) + DEF_ENUM_VALUE(PixelFormat, RGB32F) + DEF_ENUM_VALUE(PixelFormat, RGB32I) + DEF_ENUM_VALUE(PixelFormat, RGB32UI) + DEF_ENUM_VALUE(PixelFormat, RGBA4) + DEF_ENUM_VALUE(PixelFormat, RGBA8) + DEF_ENUM_VALUE(PixelFormat, RGBA8_SRGB) + DEF_ENUM_VALUE(PixelFormat, RGBA16F) + DEF_ENUM_VALUE(PixelFormat, RGBA16I) + DEF_ENUM_VALUE(PixelFormat, RGBA16UI) + DEF_ENUM_VALUE(PixelFormat, RGBA32F) + DEF_ENUM_VALUE(PixelFormat, RGBA32I) + DEF_ENUM_VALUE(PixelFormat, RGBA32UI) + DEF_ENUM_VALUE(PixelFormat, Depth16) + DEF_ENUM_VALUE(PixelFormat, Depth16Stencil8) + DEF_ENUM_VALUE(PixelFormat, Depth24) + DEF_ENUM_VALUE(PixelFormat, Depth24Stencil8) + DEF_ENUM_VALUE(PixelFormat, Depth32F) + DEF_ENUM_VALUE(PixelFormat, Depth32FStencil8) + DEF_ENUM_VALUE(PixelFormat, Stencil1) + DEF_ENUM_VALUE(PixelFormat, Stencil4) + DEF_ENUM_VALUE(PixelFormat, Stencil8) + DEF_ENUM_VALUE(PixelFormat, Stencil16) + DEF_ENUM_VALUE(PixelFormat, Max) + DEF_ENUM_END(PixelFormat) + + + DEF_ENUM(PixelFormatSubType) + DEF_ENUM_VALUE(PixelFormatSubType, Compressed) + DEF_ENUM_VALUE(PixelFormatSubType, Double) + DEF_ENUM_VALUE(PixelFormatSubType, Float) + DEF_ENUM_VALUE(PixelFormatSubType, Half) + DEF_ENUM_VALUE(PixelFormatSubType, Int) + DEF_ENUM_VALUE(PixelFormatSubType, Unsigned) + DEF_ENUM_VALUE(PixelFormatSubType, Max) + DEF_ENUM_END(PixelFormatSubType) + + DEF_ENUM(PixelFlipping) + DEF_ENUM_VALUE(PixelFlipping, Horizontally) + DEF_ENUM_VALUE(PixelFlipping, Vertically) + DEF_ENUM_VALUE(PixelFlipping, Max) + DEF_ENUM_END(PixelFlipping) + + DEF_ENUM(PrimitiveMode) + DEF_ENUM_VALUE(PrimitiveMode, LineList) + DEF_ENUM_VALUE(PrimitiveMode, LineStrip) + DEF_ENUM_VALUE(PrimitiveMode, PointList) + DEF_ENUM_VALUE(PrimitiveMode, TriangleList) + DEF_ENUM_VALUE(PrimitiveMode, TriangleStrip) + DEF_ENUM_VALUE(PrimitiveMode, TriangleFan) + DEF_ENUM_VALUE(PrimitiveMode, Max) + DEF_ENUM_END(PrimitiveMode) + + DEF_ENUM(PrimitiveType) + DEF_ENUM_VALUE(PrimitiveType, Box) + DEF_ENUM_VALUE(PrimitiveType, Cone) + DEF_ENUM_VALUE(PrimitiveType, Plane) + DEF_ENUM_VALUE(PrimitiveType, Sphere) + DEF_ENUM_VALUE(PrimitiveType, Max) + DEF_ENUM_END(PrimitiveType) + + DEF_ENUM(ProcessorCap) + DEF_ENUM_VALUE(ProcessorCap, x64) + DEF_ENUM_VALUE(ProcessorCap, AES) + DEF_ENUM_VALUE(ProcessorCap, AVX) + DEF_ENUM_VALUE(ProcessorCap, FMA3) + DEF_ENUM_VALUE(ProcessorCap, FMA4) + DEF_ENUM_VALUE(ProcessorCap, MMX) + DEF_ENUM_VALUE(ProcessorCap, Popcnt) + DEF_ENUM_VALUE(ProcessorCap, RDRAND) + DEF_ENUM_VALUE(ProcessorCap, XOP) + DEF_ENUM_VALUE(ProcessorCap, SSE) + DEF_ENUM_VALUE(ProcessorCap, SSE2) + DEF_ENUM_VALUE(ProcessorCap, SSE3) + DEF_ENUM_VALUE(ProcessorCap, SSSE3) + DEF_ENUM_VALUE(ProcessorCap, SSE41) + DEF_ENUM_VALUE(ProcessorCap, SSE42) + DEF_ENUM_VALUE(ProcessorCap, SSE4a) + DEF_ENUM_VALUE(ProcessorCap, Max) + DEF_ENUM_END(ProcessorCap) + + DEF_ENUM(ProcessorVendor) + DEF_ENUM_VALUE(ProcessorVendor, Unknown) + DEF_ENUM_VALUE(ProcessorVendor, ACRN) + DEF_ENUM_VALUE(ProcessorVendor, AMD) + DEF_ENUM_VALUE(ProcessorVendor, Ao486) + DEF_ENUM_VALUE(ProcessorVendor, AppleRosetta2) + DEF_ENUM_VALUE(ProcessorVendor, Bhyve) + DEF_ENUM_VALUE(ProcessorVendor, Centaur) + DEF_ENUM_VALUE(ProcessorVendor, Cyrix) + DEF_ENUM_VALUE(ProcessorVendor, Elbrus) + DEF_ENUM_VALUE(ProcessorVendor, Hygon) + DEF_ENUM_VALUE(ProcessorVendor, HyperV) + DEF_ENUM_VALUE(ProcessorVendor, Intel) + DEF_ENUM_VALUE(ProcessorVendor, KVM) + DEF_ENUM_VALUE(ProcessorVendor, MicrosoftXTA) + DEF_ENUM_VALUE(ProcessorVendor, NSC) + DEF_ENUM_VALUE(ProcessorVendor, NexGen) + DEF_ENUM_VALUE(ProcessorVendor, Parallels) + DEF_ENUM_VALUE(ProcessorVendor, QEMU) + DEF_ENUM_VALUE(ProcessorVendor, QNX) + DEF_ENUM_VALUE(ProcessorVendor, Rise) + DEF_ENUM_VALUE(ProcessorVendor, SIS) + DEF_ENUM_VALUE(ProcessorVendor, Transmeta) + DEF_ENUM_VALUE(ProcessorVendor, UMC) + DEF_ENUM_VALUE(ProcessorVendor, VIA) + DEF_ENUM_VALUE(ProcessorVendor, VMware) + DEF_ENUM_VALUE(ProcessorVendor, Vortex) + DEF_ENUM_VALUE(ProcessorVendor, XenHVM) + DEF_ENUM_VALUE(ProcessorVendor, Zhaoxin) + DEF_ENUM_VALUE(ProcessorVendor, Max) + DEF_ENUM_END(ProcessorVendor) + + DEF_ENUM(RendererComparison) + DEF_ENUM_VALUE(RendererComparison, Always) + DEF_ENUM_VALUE(RendererComparison, Equal) + DEF_ENUM_VALUE(RendererComparison, Greater) + DEF_ENUM_VALUE(RendererComparison, GreaterOrEqual) + DEF_ENUM_VALUE(RendererComparison, Less) + DEF_ENUM_VALUE(RendererComparison, LessOrEqual) + DEF_ENUM_VALUE(RendererComparison, Never) + DEF_ENUM_VALUE(RendererComparison, NotEqual) + DEF_ENUM_VALUE(RendererComparison, Max) + DEF_ENUM_END(RendererComparison) + + DEF_ENUM(ResourceLoadingError) + DEF_ENUM_VALUE(ResourceLoadingError, DecodingError) + DEF_ENUM_VALUE(ResourceLoadingError, FailedToOpenFile) + DEF_ENUM_VALUE(ResourceLoadingError, Internal) + DEF_ENUM_VALUE(ResourceLoadingError, Unsupported) + DEF_ENUM_VALUE(ResourceLoadingError, Unrecognized) + DEF_ENUM_END(ResourceLoadingError) + + DEF_ENUM(SamplerFilter) + DEF_ENUM_VALUE(SamplerFilter, Linear) + DEF_ENUM_VALUE(SamplerFilter, Nearest) + DEF_ENUM_VALUE(SamplerFilter, Max) + DEF_ENUM_END(SamplerFilter) + + DEF_ENUM(SamplerMipmapMode) + DEF_ENUM_VALUE(SamplerMipmapMode, Linear) + DEF_ENUM_VALUE(SamplerMipmapMode, Nearest) + DEF_ENUM_VALUE(SamplerMipmapMode, Max) + DEF_ENUM_END(SamplerMipmapMode) + + DEF_ENUM(SamplerWrap) + DEF_ENUM_VALUE(SamplerWrap, Clamp) + DEF_ENUM_VALUE(SamplerWrap, MirroredRepeat) + DEF_ENUM_VALUE(SamplerWrap, Repeat) + DEF_ENUM_VALUE(SamplerWrap, Max) + DEF_ENUM_END(SamplerWrap) + + DEF_ENUM(SphereType) + DEF_ENUM_VALUE(SphereType, Cubic) + DEF_ENUM_VALUE(SphereType, Ico) + DEF_ENUM_VALUE(SphereType, UV) + DEF_ENUM_VALUE(SphereType, Max) + DEF_ENUM_END(SphereType) + + DEF_ENUM(StencilOperation) + DEF_ENUM_VALUE(StencilOperation, Decrement) + DEF_ENUM_VALUE(StencilOperation, DecrementNoClamp) + DEF_ENUM_VALUE(StencilOperation, Increment) + DEF_ENUM_VALUE(StencilOperation, IncrementNoClamp) + DEF_ENUM_VALUE(StencilOperation, Invert) + DEF_ENUM_VALUE(StencilOperation, Keep) + DEF_ENUM_VALUE(StencilOperation, Replace) + DEF_ENUM_VALUE(StencilOperation, Zero) + DEF_ENUM_VALUE(StencilOperation, Max) + DEF_ENUM_END(StencilOperation) + + DEF_ENUM(StreamOption) + DEF_ENUM_VALUE(StreamOption, None) + DEF_ENUM_VALUE(StreamOption, MemoryMapped) + DEF_ENUM_VALUE(StreamOption, Sequential) + DEF_ENUM_VALUE(StreamOption, Text) + DEF_ENUM_VALUE(StreamOption, Unbuffered) + DEF_ENUM_VALUE(StreamOption, Max) + DEF_ENUM_END(StreamOption) + + DEF_ENUM(TextAlign) + DEF_ENUM_VALUE(TextAlign, Left) + DEF_ENUM_VALUE(TextAlign, Middle) + DEF_ENUM_VALUE(TextAlign, Right) + DEF_ENUM_VALUE(TextAlign, Max) + DEF_ENUM_END(TextAlign) + + DEF_ENUM(TextStyle) + DEF_ENUM_VALUE(TextStyle, Bold) + DEF_ENUM_VALUE(TextStyle, Italic) + DEF_ENUM_VALUE(TextStyle, StrikeThrough) + DEF_ENUM_VALUE(TextStyle, Underlined) + DEF_ENUM_VALUE(TextStyle, Max) + DEF_ENUM_END(TextStyle) + + DEF_ENUM(VertexComponent) + DEF_ENUM_VALUE(VertexComponent, Unused) + DEF_ENUM_VALUE(VertexComponent, Color) + DEF_ENUM_VALUE(VertexComponent, JointIndices) + DEF_ENUM_VALUE(VertexComponent, JointWeights) + DEF_ENUM_VALUE(VertexComponent, Normal) + DEF_ENUM_VALUE(VertexComponent, Position) + DEF_ENUM_VALUE(VertexComponent, SizeSinCos) + DEF_ENUM_VALUE(VertexComponent, Tangent) + DEF_ENUM_VALUE(VertexComponent, TexCoord) + DEF_ENUM_VALUE(VertexComponent, Userdata) + DEF_ENUM_VALUE(VertexComponent, Max) + DEF_ENUM_END(VertexComponent) + + DEF_ENUM(VertexInputRate) + DEF_ENUM_VALUE(VertexInputRate, Instance) + DEF_ENUM_VALUE(VertexInputRate, Vertex) + DEF_ENUM_END(VertexInputRate) + + DEF_ENUM(VertexLayout) + DEF_ENUM_VALUE(VertexLayout, UV_SizeSinCos) + DEF_ENUM_VALUE(VertexLayout, XY) + DEF_ENUM_VALUE(VertexLayout, XY_Color) + DEF_ENUM_VALUE(VertexLayout, XY_UV) + DEF_ENUM_VALUE(VertexLayout, XYZ) + DEF_ENUM_VALUE(VertexLayout, XYZ_Color) + DEF_ENUM_VALUE(VertexLayout, XYZ_Color_UV) + DEF_ENUM_VALUE(VertexLayout, XYZ_Normal) + DEF_ENUM_VALUE(VertexLayout, XYZ_Normal_UV) + DEF_ENUM_VALUE(VertexLayout, XYZ_Normal_UV_Tangent) + DEF_ENUM_VALUE(VertexLayout, XYZ_Normal_UV_Tangent_Skinning) + DEF_ENUM_VALUE(VertexLayout, UV_SizeSinCos_Color) + DEF_ENUM_VALUE(VertexLayout, XYZ_UV) + DEF_ENUM_VALUE(VertexLayout, Matrix4) + DEF_ENUM_VALUE(VertexLayout, Max) + DEF_ENUM_END(VertexLayout) +}