12#define EENG_NULL_INDEX -1
16#define EENG_MSAA_SAMPLES 4
18#define EENG_ANISO_SAMPLES 8
22#define EENG_PLATFORM_WINDOWS
24#define EENG_PLATFORM_UNIX
25#define EENG_PLATFORM_LINUX
26#define EENG_PLATFORM_APPLE
30#if __cplusplus >= 201103L
31#define CPP11_SUPPORTED
33#if __cplusplus >= 201402L
34#define CPP14_SUPPORTED
36#if __cplusplus >= 201703L
37#define CPP17_SUPPORTED
39#if __cplusplus >= 202002L
40#define CPP20_SUPPORTED
45#define EENG_COMPILER_MSVC
48#define EENG_COMPILER_CLANG
51#define EENG_COMPILER_GCC
55#if !defined(NDEBUG) || defined(_DEBUG)
57#define EENG_ENABLE_ASSERTS
61#ifdef EENG_PLATFORM_WINDOWS
62#define EENG_DEBUG_BREAK() __debugbreak()
64#if defined(__ARM_ARCH) || defined(__aarch64__)
65#define EENG_DEBUG_BREAK() __asm__ volatile("svc #0")
66#elif defined(__x86_64__) || defined(__i386__)
67#define EENG_DEBUG_BREAK() __asm__ volatile("int $0x03")
69#error "Unsupported architecture"
74#if defined(EENG_ENABLE_ASSERTS) && defined(CPP20_SUPPORTED)
75template <
class... Args>
76static void EENG_ERROR(std::string_view fmt, Args &&...args)
78 auto msg = std::vformat(fmt, std::make_format_args(args...));
79 std::cerr <<
"Error: " << msg << std::endl;
81#define EENG_ASSERT(x, ...) \
85 EENG_ERROR(__VA_ARGS__); \
89#elif defined(EENG_ENABLE_ASSERTS)
91#define EENG_ASSERT(x, ...) assert(x);
93#define EENG_ASSERT(x, ...)
97#ifdef EENG_PLATFORM_APPLE
98#define EENG_GLVERSION_MAJOR 4
99#define EENG_GLVERSION_MINOR 1
101#define EENG_GLVERSION_MAJOR 4
102#define EENG_GLVERSION_MINOR 3
105#if EENG_GLVERSION_MAJOR >= 4
106#if EENG_GLVERSION_MINOR >= 1
107#define EENG_GLVERSION_41
109#if EENG_GLVERSION_MINOR >= 3
110#define EENG_GLVERSION_43
113#ifndef EENG_GLVERSION_41
114static_assert(
false,
"OpenGL 4.1 is required");
118static void LOG_DEFINES(
auto& LogFunc)
121 LogFunc(
"Mode DEBUG");
123 LogFunc(
"Mode RELEASE");
126#ifdef EENG_COMPILER_MSVC
127 LogFunc(
"Compiler MSVC");
128#elif defined(EENG_COMPILER_CLANG)
129 LogFunc(
"Compiler Clang");
130#elif defined(EENG_COMPILER_GCC)
131 LogFunc(
"Compiler GCC");
134#ifdef CPP20_SUPPORTED
135 LogFunc(
"C++ version 20");
136#elif defined(CPP17_SUPPORTED)
137 LogFunc(
"C++ version 17");
138#elif defined(CPP14_SUPPORTED)
139 LogFunc(
"C++ version: 14");
140#elif defined(CPP11_SUPPORTED)
141 LogFunc(
"C++ version 11");
147constexpr auto to_integral(E e) ->
typename std::underlying_type<E>::type
149 return static_cast<typename std::underlying_type<E>::type
>(e);