Advertisement
Guest User

Untitled

a guest
Oct 14th, 2019
84
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.59 KB | None | 0 0
  1. #include <stdio.h>
  2. //#include <glm/detail/type_scalar.h>
  3. //#include <glm/detail/type_vec1.h>
  4. #include <glm/detail/qualifier.h>
  5.  
  6. #define GLM_VEC_DATA(L, T) T data[L]; T e[L];
  7. #define GLM_MAT_DATA(C, R, T) T data[C * R]; T e[R][C];
  8.  
  9. #define GLM_DEFINE_TVEC1(T)\
  10. typedef union\
  11. {\
  12.     GLM_VEC_DATA(1, T);\
  13.     T x;\
  14.     T s;\
  15.     T r;\
  16. } glm_vec(1, T);
  17.  
  18. #define GLM_DEFINE_TVEC2(T)\
  19. typedef union\
  20. {\
  21.     GLM_VEC_DATA(2, T);\
  22.     struct { T x, y; };\
  23.     struct { T s, t; };\
  24.     struct { T r, g; };\
  25. } glm_vec(2, T);
  26.  
  27. #define GLM_DEFINE_TVEC3(T)\
  28. typedef union\
  29. {\
  30.     GLM_VEC_DATA(3, T);\
  31.     struct { T x, y, z; };\
  32.     struct { T s, t, p; };\
  33.     struct { T r, g, b; };\
  34. } glm_vec(3, T);
  35.  
  36. #define GLM_DEFINE_TVEC4(T)\
  37. typedef union\
  38. {\
  39.     GLM_VEC_DATA(4, T);\
  40.     struct { T x, y, z, w; };\
  41.     struct { T s, t, p, q; };\
  42.     struct { T r, g, b, a; };\
  43. } glm_vec(4, T);
  44.  
  45. GLM_DEFINE_TVEC1(float)
  46. GLM_DEFINE_TVEC1(double)
  47. GLM_DEFINE_TVEC1(int)
  48. GLM_DEFINE_TVEC1(uint)
  49. GLM_DEFINE_TVEC1(bool)
  50.  
  51. GLM_DEFINE_TVEC2(float)
  52. GLM_DEFINE_TVEC2(double)
  53. GLM_DEFINE_TVEC2(int)
  54. GLM_DEFINE_TVEC2(uint)
  55. GLM_DEFINE_TVEC2(bool)
  56.  
  57. GLM_DEFINE_TVEC3(float)
  58. GLM_DEFINE_TVEC3(double)
  59. GLM_DEFINE_TVEC3(int)
  60. GLM_DEFINE_TVEC3(uint)
  61. GLM_DEFINE_TVEC3(bool)
  62.  
  63. GLM_DEFINE_TVEC4(float)
  64. GLM_DEFINE_TVEC4(double)
  65. GLM_DEFINE_TVEC4(int)
  66. GLM_DEFINE_TVEC4(uint)
  67. GLM_DEFINE_TVEC4(bool)
  68.  
  69. #define glm_vec1 glm_float1
  70. #define glm_vec2 glm_float2
  71. #define glm_vec3 glm_float3
  72. #define glm_vec4 glm_float4
  73.  
  74. #define glm_dvec1 glm_double1
  75. #define glm_dvec2 glm_double2
  76. #define glm_dvec3 glm_double3
  77. #define glm_dvec4 glm_double4
  78.  
  79. #define glm_ivec1 glm_int1
  80. #define glm_ivec2 glm_int2
  81. #define glm_ivec3 glm_int3
  82. #define glm_ivec4 glm_int4
  83.  
  84. #define glm_uvec1 glm_uint1
  85. #define glm_uvec2 glm_uint2
  86. #define glm_uvec3 glm_uint3
  87. #define glm_uvec4 glm_uint4
  88.  
  89. #define glm_bvec1 glm_bool1
  90. #define glm_bvec2 glm_bool2
  91. #define glm_bvec3 glm_bool3
  92. #define glm_bvec4 glm_bool4
  93.  
  94. #pragma GCC push_options
  95. #pragma GCC optimize ("unroll-loops")
  96.  
  97. #define GLM_CONVERT_VEC(L, T, IN)\
  98. ({\
  99.     __typeof__((IN)) in = (IN);\
  100.     glm_vec(L, T) out;\
  101.     for(size_t i = 0; i < L; ++i) out.data[i] = (T)in.data[i];\
  102.     out;\
  103. })
  104.  
  105. #define GLM_CONVERT_TVEC1(T, IN) GLM_CONVERT_VEC(1, T, IN)
  106. #define GLM_CONVERT_TVEC2(T, IN) GLM_CONVERT_VEC(2, T, IN)
  107. #define GLM_CONVERT_TVEC3(T, IN) GLM_CONVERT_VEC(3, T, IN)
  108. #define GLM_CONVERT_TVEC4(T, IN) GLM_CONVERT_VEC(4, T, IN)
  109.  
  110.  
  111. int main(int argc, char** argv)
  112. {
  113.     {
  114.         /* Vector casting */
  115.         glm_ivec4 v1 = {52, 0, 22, -24};
  116.         glm_bvec2 v2 = GLM_CONVERT_TVEC2(bool, v1);
  117.  
  118.         printf("bvec2(%d, %d)\n", v2.x, v2.y);
  119.     }
  120.  
  121.    
  122.     return 0;
  123. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement