summaryrefslogtreecommitdiff
path: root/include/cglm/common.h
diff options
context:
space:
mode:
authorAaditya Dhruv <[email protected]>2026-01-25 15:10:37 -0600
committerAaditya Dhruv <[email protected]>2026-01-25 15:10:37 -0600
commit118980e02e59ff31871df59dce257075394f3533 (patch)
tree26fba4492bb4b561d21bf49b35d892a821d54fab /include/cglm/common.h
parent0e6e1245b70df4dfcba135d50e1b53d1a8ef7eb8 (diff)
wip
Diffstat (limited to 'include/cglm/common.h')
-rw-r--r--include/cglm/common.h130
1 files changed, 130 insertions, 0 deletions
diff --git a/include/cglm/common.h b/include/cglm/common.h
new file mode 100644
index 0000000..1af754d
--- /dev/null
+++ b/include/cglm/common.h
@@ -0,0 +1,130 @@
+/*
+ * Copyright (c), Recep Aslantas.
+ *
+ * MIT License (MIT), http://opensource.org/licenses/MIT
+ * Full license can be found in the LICENSE file
+ */
+
+#ifndef cglm_common_h
+#define cglm_common_h
+
+#define __cglm__ 1
+
+#ifndef _USE_MATH_DEFINES
+# define _USE_MATH_DEFINES /* for windows */
+#endif
+
+#ifndef _CRT_SECURE_NO_WARNINGS
+# define _CRT_SECURE_NO_WARNINGS /* for windows */
+#endif
+
+#include <stdint.h>
+#include <stddef.h>
+#include <stdlib.h>
+#include <math.h>
+#include <float.h>
+#include <stdbool.h>
+
+#if defined(_MSC_VER)
+# ifdef CGLM_STATIC
+# define CGLM_EXPORT
+# elif defined(CGLM_EXPORTS)
+# define CGLM_EXPORT __declspec(dllexport)
+# else
+# define CGLM_EXPORT __declspec(dllimport)
+# endif
+# define CGLM_INLINE __forceinline
+#else
+# define CGLM_EXPORT __attribute__((visibility("default")))
+# define CGLM_INLINE static inline __attribute((always_inline))
+#endif
+
+#if defined(__GNUC__) || defined(__clang__)
+# define CGLM_UNLIKELY(expr) __builtin_expect(!!(expr), 0)
+# define CGLM_LIKELY(expr) __builtin_expect(!!(expr), 1)
+#else
+# define CGLM_UNLIKELY(expr) (expr)
+# define CGLM_LIKELY(expr) (expr)
+#endif
+
+#if defined(_M_FP_FAST) || defined(__FAST_MATH__)
+# define CGLM_FAST_MATH
+#endif
+
+#define GLM_SHUFFLE4(z, y, x, w) (((z) << 6) | ((y) << 4) | ((x) << 2) | (w))
+#define GLM_SHUFFLE3(z, y, x) (((z) << 4) | ((y) << 2) | (x))
+#define GLM_SHUFFLE2(y, x) (((y) << 2) | (x))
+
+#include "types.h"
+#include "simd/intrin.h"
+
+#ifndef CGLM_USE_DEFAULT_EPSILON
+# ifndef GLM_FLT_EPSILON
+# define GLM_FLT_EPSILON 1e-5f
+# endif
+#else
+# define GLM_FLT_EPSILON FLT_EPSILON
+#endif
+
+/*
+ * Clip control: define CGLM_FORCE_DEPTH_ZERO_TO_ONE before including
+ * CGLM to use a clip space between 0 to 1.
+ * Coordinate system: define CGLM_FORCE_LEFT_HANDED before including
+ * CGLM to use the left handed coordinate system by default.
+ */
+
+#define CGLM_CLIP_CONTROL_ZO_BIT (1 << 0) /* ZERO_TO_ONE */
+#define CGLM_CLIP_CONTROL_NO_BIT (1 << 1) /* NEGATIVE_ONE_TO_ONE */
+#define CGLM_CLIP_CONTROL_LH_BIT (1 << 2) /* LEFT_HANDED, For DirectX, Metal, Vulkan */
+#define CGLM_CLIP_CONTROL_RH_BIT (1 << 3) /* RIGHT_HANDED, For OpenGL, default in GLM */
+
+#define CGLM_CLIP_CONTROL_LH_ZO (CGLM_CLIP_CONTROL_LH_BIT | CGLM_CLIP_CONTROL_ZO_BIT)
+#define CGLM_CLIP_CONTROL_LH_NO (CGLM_CLIP_CONTROL_LH_BIT | CGLM_CLIP_CONTROL_NO_BIT)
+#define CGLM_CLIP_CONTROL_RH_ZO (CGLM_CLIP_CONTROL_RH_BIT | CGLM_CLIP_CONTROL_ZO_BIT)
+#define CGLM_CLIP_CONTROL_RH_NO (CGLM_CLIP_CONTROL_RH_BIT | CGLM_CLIP_CONTROL_NO_BIT)
+
+#ifdef CGLM_FORCE_DEPTH_ZERO_TO_ONE
+# ifdef CGLM_FORCE_LEFT_HANDED
+# define CGLM_CONFIG_CLIP_CONTROL CGLM_CLIP_CONTROL_LH_ZO
+# else
+# define CGLM_CONFIG_CLIP_CONTROL CGLM_CLIP_CONTROL_RH_ZO
+# endif
+#else
+# ifdef CGLM_FORCE_LEFT_HANDED
+# define CGLM_CONFIG_CLIP_CONTROL CGLM_CLIP_CONTROL_LH_NO
+# else
+# define CGLM_CONFIG_CLIP_CONTROL CGLM_CLIP_CONTROL_RH_NO
+# endif
+#endif
+
+/* struct API configurator */
+/* TODO: move struct/common.h? */
+/* WARN: dont use concant helpers outside cglm headers, because they may be changed */
+
+#define CGLM_MACRO_CONCAT_HELPER(A, B, C, D, E, ...) A ## B ## C ## D ## E ## __VA_ARGS__
+#define CGLM_MACRO_CONCAT(A, B, C, D, E, ...) CGLM_MACRO_CONCAT_HELPER(A, B, C, D, E,__VA_ARGS__)
+
+#ifndef CGLM_OMIT_NS_FROM_STRUCT_API
+# ifndef CGLM_STRUCT_API_NS
+# define CGLM_STRUCT_API_NS glms
+# endif
+# ifndef CGLM_STRUCT_API_NS_SEPERATOR
+# define CGLM_STRUCT_API_NS_SEPERATOR _
+# endif
+#else
+# define CGLM_STRUCT_API_NS
+# define CGLM_STRUCT_API_NS_SEPERATOR
+#endif
+
+#ifndef CGLM_STRUCT_API_NAME_SUFFIX
+# define CGLM_STRUCT_API_NAME_SUFFIX
+#endif
+
+#define CGLM_STRUCTAPI(A, ...) CGLM_MACRO_CONCAT(CGLM_STRUCT_API_NS, \
+ CGLM_STRUCT_API_NS_SEPERATOR, \
+ A, \
+ CGLM_STRUCT_API_NAME_SUFFIX, \
+ _, \
+ __VA_ARGS__)
+
+#endif /* cglm_common_h */