1
0

common.h 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. /*
  2. * Copyright (c), Recep Aslantas.
  3. *
  4. * MIT License (MIT), http://opensource.org/licenses/MIT
  5. * Full license can be found in the LICENSE file
  6. */
  7. #ifndef cglm_common_h
  8. #define cglm_common_h
  9. #ifndef _USE_MATH_DEFINES
  10. # define _USE_MATH_DEFINES /* for windows */
  11. #endif
  12. #ifndef _CRT_SECURE_NO_WARNINGS
  13. # define _CRT_SECURE_NO_WARNINGS /* for windows */
  14. #endif
  15. #include <stdint.h>
  16. #include <stddef.h>
  17. #include <stdlib.h>
  18. #include <math.h>
  19. #include <float.h>
  20. #include <stdbool.h>
  21. #if defined(_MSC_VER)
  22. # ifdef CGLM_STATIC
  23. # define CGLM_EXPORT
  24. # elif defined(CGLM_EXPORTS)
  25. # define CGLM_EXPORT __declspec(dllexport)
  26. # else
  27. # define CGLM_EXPORT __declspec(dllimport)
  28. # endif
  29. # define CGLM_INLINE __forceinline
  30. #else
  31. # define CGLM_EXPORT __attribute__((visibility("default")))
  32. # define CGLM_INLINE static inline __attribute((always_inline))
  33. #endif
  34. #if defined(__GNUC__) || defined(__clang__)
  35. # define CGLM_UNLIKELY(expr) __builtin_expect(!!(expr), 0)
  36. # define CGLM_LIKELY(expr) __builtin_expect(!!(expr), 1)
  37. #else
  38. # define CGLM_UNLIKELY(expr) (expr)
  39. # define CGLM_LIKELY(expr) (expr)
  40. #endif
  41. #if defined(_M_FP_FAST) || defined(__FAST_MATH__)
  42. # define CGLM_FAST_MATH
  43. #endif
  44. #define GLM_SHUFFLE4(z, y, x, w) (((z) << 6) | ((y) << 4) | ((x) << 2) | (w))
  45. #define GLM_SHUFFLE3(z, y, x) (((z) << 4) | ((y) << 2) | (x))
  46. #define GLM_SHUFFLE2(y, x) (((y) << 2) | (x))
  47. #include "types.h"
  48. #include "simd/intrin.h"
  49. #ifndef CGLM_USE_DEFAULT_EPSILON
  50. # ifndef GLM_FLT_EPSILON
  51. # define GLM_FLT_EPSILON 1e-5f
  52. # endif
  53. #else
  54. # define GLM_FLT_EPSILON FLT_EPSILON
  55. #endif
  56. /*
  57. * Clip control: define CGLM_FORCE_DEPTH_ZERO_TO_ONE before including
  58. * CGLM to use a clip space between 0 to 1.
  59. * Coordinate system: define CGLM_FORCE_LEFT_HANDED before including
  60. * CGLM to use the left handed coordinate system by default.
  61. */
  62. #define CGLM_CLIP_CONTROL_ZO_BIT (1 << 0) /* ZERO_TO_ONE */
  63. #define CGLM_CLIP_CONTROL_NO_BIT (1 << 1) /* NEGATIVE_ONE_TO_ONE */
  64. #define CGLM_CLIP_CONTROL_LH_BIT (1 << 2) /* LEFT_HANDED, For DirectX, Metal, Vulkan */
  65. #define CGLM_CLIP_CONTROL_RH_BIT (1 << 3) /* RIGHT_HANDED, For OpenGL, default in GLM */
  66. #define CGLM_CLIP_CONTROL_LH_ZO (CGLM_CLIP_CONTROL_LH_BIT | CGLM_CLIP_CONTROL_ZO_BIT)
  67. #define CGLM_CLIP_CONTROL_LH_NO (CGLM_CLIP_CONTROL_LH_BIT | CGLM_CLIP_CONTROL_NO_BIT)
  68. #define CGLM_CLIP_CONTROL_RH_ZO (CGLM_CLIP_CONTROL_RH_BIT | CGLM_CLIP_CONTROL_ZO_BIT)
  69. #define CGLM_CLIP_CONTROL_RH_NO (CGLM_CLIP_CONTROL_RH_BIT | CGLM_CLIP_CONTROL_NO_BIT)
  70. #ifdef CGLM_FORCE_DEPTH_ZERO_TO_ONE
  71. # ifdef CGLM_FORCE_LEFT_HANDED
  72. # define CGLM_CONFIG_CLIP_CONTROL CGLM_CLIP_CONTROL_LH_ZO
  73. # else
  74. # define CGLM_CONFIG_CLIP_CONTROL CGLM_CLIP_CONTROL_RH_ZO
  75. # endif
  76. #else
  77. # ifdef CGLM_FORCE_LEFT_HANDED
  78. # define CGLM_CONFIG_CLIP_CONTROL CGLM_CLIP_CONTROL_LH_NO
  79. # else
  80. # define CGLM_CONFIG_CLIP_CONTROL CGLM_CLIP_CONTROL_RH_NO
  81. # endif
  82. #endif
  83. /* struct API configurator */
  84. /* TODO: move struct/common.h? */
  85. /* WARN: dont use concant helpers outside cglm headers, because they may be changed */
  86. #define CGLM_MACRO_CONCAT_HELPER(A, B, C, D, E, ...) A ## B ## C ## D ## E ## __VA_ARGS__
  87. #define CGLM_MACRO_CONCAT(A, B, C, D, E, ...) CGLM_MACRO_CONCAT_HELPER(A, B, C, D, E,__VA_ARGS__)
  88. #ifndef CGLM_OMIT_NS_FROM_STRUCT_API
  89. # ifndef CGLM_STRUCT_API_NS
  90. # define CGLM_STRUCT_API_NS glms
  91. # endif
  92. # ifndef CGLM_STRUCT_API_NS_SEPERATOR
  93. # define CGLM_STRUCT_API_NS_SEPERATOR _
  94. # endif
  95. #else
  96. # define CGLM_STRUCT_API_NS
  97. # define CGLM_STRUCT_API_NS_SEPERATOR
  98. #endif
  99. #ifndef CGLM_STRUCT_API_NAME_SUFFIX
  100. # define CGLM_STRUCT_API_NAME_SUFFIX
  101. #endif
  102. #define CGLM_STRUCTAPI(A, ...) CGLM_MACRO_CONCAT(CGLM_STRUCT_API_NS, \
  103. CGLM_STRUCT_API_NS_SEPERATOR, \
  104. A, \
  105. CGLM_STRUCT_API_NAME_SUFFIX, \
  106. _, \
  107. __VA_ARGS__)
  108. #endif /* cglm_common_h */