Collection of DPF-based plugins for packaging
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

191 lines
2.8KB

  1. /// @ref core
  2. /// @file glm/detail/func_packing.inl
  3. #include "../common.hpp"
  4. #include "type_half.hpp"
  5. #include "../fwd.hpp"
  6. namespace glm
  7. {
  8. GLM_FUNC_QUALIFIER uint packUnorm2x16(vec2 const& v)
  9. {
  10. union
  11. {
  12. u16 in[2];
  13. uint out;
  14. } u;
  15. u16vec2 result(round(clamp(v, 0.0f, 1.0f) * 65535.0f));
  16. u.in[0] = result[0];
  17. u.in[1] = result[1];
  18. return u.out;
  19. }
  20. GLM_FUNC_QUALIFIER vec2 unpackUnorm2x16(uint p)
  21. {
  22. union
  23. {
  24. uint in;
  25. u16 out[2];
  26. } u;
  27. u.in = p;
  28. return vec2(u.out[0], u.out[1]) * 1.5259021896696421759365224689097e-5f;
  29. }
  30. GLM_FUNC_QUALIFIER uint packSnorm2x16(vec2 const& v)
  31. {
  32. union
  33. {
  34. i16 in[2];
  35. uint out;
  36. } u;
  37. i16vec2 result(round(clamp(v, -1.0f, 1.0f) * 32767.0f));
  38. u.in[0] = result[0];
  39. u.in[1] = result[1];
  40. return u.out;
  41. }
  42. GLM_FUNC_QUALIFIER vec2 unpackSnorm2x16(uint p)
  43. {
  44. union
  45. {
  46. uint in;
  47. i16 out[2];
  48. } u;
  49. u.in = p;
  50. return clamp(vec2(u.out[0], u.out[1]) * 3.0518509475997192297128208258309e-5f, -1.0f, 1.0f);
  51. }
  52. GLM_FUNC_QUALIFIER uint packUnorm4x8(vec4 const& v)
  53. {
  54. union
  55. {
  56. u8 in[4];
  57. uint out;
  58. } u;
  59. u8vec4 result(round(clamp(v, 0.0f, 1.0f) * 255.0f));
  60. u.in[0] = result[0];
  61. u.in[1] = result[1];
  62. u.in[2] = result[2];
  63. u.in[3] = result[3];
  64. return u.out;
  65. }
  66. GLM_FUNC_QUALIFIER vec4 unpackUnorm4x8(uint p)
  67. {
  68. union
  69. {
  70. uint in;
  71. u8 out[4];
  72. } u;
  73. u.in = p;
  74. return vec4(u.out[0], u.out[1], u.out[2], u.out[3]) * 0.0039215686274509803921568627451f;
  75. }
  76. GLM_FUNC_QUALIFIER uint packSnorm4x8(vec4 const& v)
  77. {
  78. union
  79. {
  80. i8 in[4];
  81. uint out;
  82. } u;
  83. i8vec4 result(round(clamp(v, -1.0f, 1.0f) * 127.0f));
  84. u.in[0] = result[0];
  85. u.in[1] = result[1];
  86. u.in[2] = result[2];
  87. u.in[3] = result[3];
  88. return u.out;
  89. }
  90. GLM_FUNC_QUALIFIER glm::vec4 unpackSnorm4x8(uint p)
  91. {
  92. union
  93. {
  94. uint in;
  95. i8 out[4];
  96. } u;
  97. u.in = p;
  98. return clamp(vec4(u.out[0], u.out[1], u.out[2], u.out[3]) * 0.0078740157480315f, -1.0f, 1.0f);
  99. }
  100. GLM_FUNC_QUALIFIER double packDouble2x32(uvec2 const& v)
  101. {
  102. union
  103. {
  104. uint in[2];
  105. double out;
  106. } u;
  107. u.in[0] = v[0];
  108. u.in[1] = v[1];
  109. return u.out;
  110. }
  111. GLM_FUNC_QUALIFIER uvec2 unpackDouble2x32(double v)
  112. {
  113. union
  114. {
  115. double in;
  116. uint out[2];
  117. } u;
  118. u.in = v;
  119. return uvec2(u.out[0], u.out[1]);
  120. }
  121. GLM_FUNC_QUALIFIER uint packHalf2x16(vec2 const& v)
  122. {
  123. union
  124. {
  125. i16 in[2];
  126. uint out;
  127. } u;
  128. u.in[0] = detail::toFloat16(v.x);
  129. u.in[1] = detail::toFloat16(v.y);
  130. return u.out;
  131. }
  132. GLM_FUNC_QUALIFIER vec2 unpackHalf2x16(uint v)
  133. {
  134. union
  135. {
  136. uint in;
  137. i16 out[2];
  138. } u;
  139. u.in = v;
  140. return vec2(
  141. detail::toFloat32(u.out[0]),
  142. detail::toFloat32(u.out[1]));
  143. }
  144. }//namespace glm
  145. #if GLM_ARCH != GLM_ARCH_PURE && GLM_HAS_UNRESTRICTED_UNIONS
  146. # include "func_packing_simd.inl"
  147. #endif