Clutter Engine 0.0.1
Loading...
Searching...
No Matches
packing.inl
1
2
5#include "../common.hpp"
6#include "../vec2.hpp"
7#include "../vec3.hpp"
8#include "../vec4.hpp"
9#include "../detail/type_half.hpp"
10#include <cstring>
11#include <limits>
12
13namespace glm{
14namespace detail
15{
16 GLM_FUNC_QUALIFIER glm::uint16 float2half(glm::uint32 f)
17 {
18 // 10 bits => EE EEEFFFFF
19 // 11 bits => EEE EEFFFFFF
20 // Half bits => SEEEEEFF FFFFFFFF
21 // Float bits => SEEEEEEE EFFFFFFF FFFFFFFF FFFFFFFF
22
23 // 0x00007c00 => 00000000 00000000 01111100 00000000
24 // 0x000003ff => 00000000 00000000 00000011 11111111
25 // 0x38000000 => 00111000 00000000 00000000 00000000
26 // 0x7f800000 => 01111111 10000000 00000000 00000000
27 // 0x00008000 => 00000000 00000000 10000000 00000000
28 return
29 ((f >> 16) & 0x8000) | // sign
30 ((((f & 0x7f800000) - 0x38000000) >> 13) & 0x7c00) | // exponential
31 ((f >> 13) & 0x03ff); // Mantissa
32 }
33
34 GLM_FUNC_QUALIFIER glm::uint32 float2packed11(glm::uint32 f)
35 {
36 // 10 bits => EE EEEFFFFF
37 // 11 bits => EEE EEFFFFFF
38 // Half bits => SEEEEEFF FFFFFFFF
39 // Float bits => SEEEEEEE EFFFFFFF FFFFFFFF FFFFFFFF
40
41 // 0x000007c0 => 00000000 00000000 00000111 11000000
42 // 0x00007c00 => 00000000 00000000 01111100 00000000
43 // 0x000003ff => 00000000 00000000 00000011 11111111
44 // 0x38000000 => 00111000 00000000 00000000 00000000
45 // 0x7f800000 => 01111111 10000000 00000000 00000000
46 // 0x00008000 => 00000000 00000000 10000000 00000000
47 return
48 ((((f & 0x7f800000) - 0x38000000) >> 17) & 0x07c0) | // exponential
49 ((f >> 17) & 0x003f); // Mantissa
50 }
51
52 GLM_FUNC_QUALIFIER glm::uint32 packed11ToFloat(glm::uint32 p)
53 {
54 // 10 bits => EE EEEFFFFF
55 // 11 bits => EEE EEFFFFFF
56 // Half bits => SEEEEEFF FFFFFFFF
57 // Float bits => SEEEEEEE EFFFFFFF FFFFFFFF FFFFFFFF
58
59 // 0x000007c0 => 00000000 00000000 00000111 11000000
60 // 0x00007c00 => 00000000 00000000 01111100 00000000
61 // 0x000003ff => 00000000 00000000 00000011 11111111
62 // 0x38000000 => 00111000 00000000 00000000 00000000
63 // 0x7f800000 => 01111111 10000000 00000000 00000000
64 // 0x00008000 => 00000000 00000000 10000000 00000000
65 return
66 ((((p & 0x07c0) << 17) + 0x38000000) & 0x7f800000) | // exponential
67 ((p & 0x003f) << 17); // Mantissa
68 }
69
70 GLM_FUNC_QUALIFIER glm::uint32 float2packed10(glm::uint32 f)
71 {
72 // 10 bits => EE EEEFFFFF
73 // 11 bits => EEE EEFFFFFF
74 // Half bits => SEEEEEFF FFFFFFFF
75 // Float bits => SEEEEEEE EFFFFFFF FFFFFFFF FFFFFFFF
76
77 // 0x0000001F => 00000000 00000000 00000000 00011111
78 // 0x0000003F => 00000000 00000000 00000000 00111111
79 // 0x000003E0 => 00000000 00000000 00000011 11100000
80 // 0x000007C0 => 00000000 00000000 00000111 11000000
81 // 0x00007C00 => 00000000 00000000 01111100 00000000
82 // 0x000003FF => 00000000 00000000 00000011 11111111
83 // 0x38000000 => 00111000 00000000 00000000 00000000
84 // 0x7f800000 => 01111111 10000000 00000000 00000000
85 // 0x00008000 => 00000000 00000000 10000000 00000000
86 return
87 ((((f & 0x7f800000) - 0x38000000) >> 18) & 0x03E0) | // exponential
88 ((f >> 18) & 0x001f); // Mantissa
89 }
90
91 GLM_FUNC_QUALIFIER glm::uint32 packed10ToFloat(glm::uint32 p)
92 {
93 // 10 bits => EE EEEFFFFF
94 // 11 bits => EEE EEFFFFFF
95 // Half bits => SEEEEEFF FFFFFFFF
96 // Float bits => SEEEEEEE EFFFFFFF FFFFFFFF FFFFFFFF
97
98 // 0x0000001F => 00000000 00000000 00000000 00011111
99 // 0x0000003F => 00000000 00000000 00000000 00111111
100 // 0x000003E0 => 00000000 00000000 00000011 11100000
101 // 0x000007C0 => 00000000 00000000 00000111 11000000
102 // 0x00007C00 => 00000000 00000000 01111100 00000000
103 // 0x000003FF => 00000000 00000000 00000011 11111111
104 // 0x38000000 => 00111000 00000000 00000000 00000000
105 // 0x7f800000 => 01111111 10000000 00000000 00000000
106 // 0x00008000 => 00000000 00000000 10000000 00000000
107 return
108 ((((p & 0x03E0) << 18) + 0x38000000) & 0x7f800000) | // exponential
109 ((p & 0x001f) << 18); // Mantissa
110 }
111
112 GLM_FUNC_QUALIFIER glm::uint half2float(glm::uint h)
113 {
114 return ((h & 0x8000) << 16) | ((( h & 0x7c00) + 0x1C000) << 13) | ((h & 0x03FF) << 13);
115 }
116
117 GLM_FUNC_QUALIFIER glm::uint floatTo11bit(float x)
118 {
119 if(x == 0.0f)
120 return 0u;
121 else if(glm::isnan(x))
122 return ~0u;
123 else if(glm::isinf(x))
124 return 0x1Fu << 6u;
125
126 uint Pack = 0u;
127 memcpy(&Pack, &x, sizeof(Pack));
128 return float2packed11(Pack);
129 }
130
131 GLM_FUNC_QUALIFIER float packed11bitToFloat(glm::uint x)
132 {
133 if(x == 0)
134 return 0.0f;
135 else if(x == ((1 << 11) - 1))
136 return ~0;//NaN
137 else if(x == (0x1f << 6))
138 return ~0;//Inf
139
140 uint Result = packed11ToFloat(x);
141
142 float Temp = 0;
143 memcpy(&Temp, &Result, sizeof(Temp));
144 return Temp;
145 }
146
147 GLM_FUNC_QUALIFIER glm::uint floatTo10bit(float x)
148 {
149 if(x == 0.0f)
150 return 0u;
151 else if(glm::isnan(x))
152 return ~0u;
153 else if(glm::isinf(x))
154 return 0x1Fu << 5u;
155
156 uint Pack = 0;
157 memcpy(&Pack, &x, sizeof(Pack));
158 return float2packed10(Pack);
159 }
160
161 GLM_FUNC_QUALIFIER float packed10bitToFloat(glm::uint x)
162 {
163 if(x == 0)
164 return 0.0f;
165 else if(x == ((1 << 10) - 1))
166 return ~0;//NaN
167 else if(x == (0x1f << 5))
168 return ~0;//Inf
169
170 uint Result = packed10ToFloat(x);
171
172 float Temp = 0;
173 memcpy(&Temp, &Result, sizeof(Temp));
174 return Temp;
175 }
176
177// GLM_FUNC_QUALIFIER glm::uint f11_f11_f10(float x, float y, float z)
178// {
179// return ((floatTo11bit(x) & ((1 << 11) - 1)) << 0) | ((floatTo11bit(y) & ((1 << 11) - 1)) << 11) | ((floatTo10bit(z) & ((1 << 10) - 1)) << 22);
180// }
181
182 union u3u3u2
183 {
184 struct
185 {
186 uint x : 3;
187 uint y : 3;
188 uint z : 2;
189 } data;
190 uint8 pack;
191 };
192
193 union u4u4
194 {
195 struct
196 {
197 uint x : 4;
198 uint y : 4;
199 } data;
200 uint8 pack;
201 };
202
204 {
205 struct
206 {
207 uint x : 4;
208 uint y : 4;
209 uint z : 4;
210 uint w : 4;
211 } data;
212 uint16 pack;
213 };
214
215 union u5u6u5
216 {
217 struct
218 {
219 uint x : 5;
220 uint y : 6;
221 uint z : 5;
222 } data;
223 uint16 pack;
224 };
225
227 {
228 struct
229 {
230 uint x : 5;
231 uint y : 5;
232 uint z : 5;
233 uint w : 1;
234 } data;
235 uint16 pack;
236 };
237
239 {
240 struct
241 {
242 uint x : 10;
243 uint y : 10;
244 uint z : 10;
245 uint w : 2;
246 } data;
247 uint32 pack;
248 };
249
251 {
252 struct
253 {
254 int x : 10;
255 int y : 10;
256 int z : 10;
257 int w : 2;
258 } data;
259 uint32 pack;
260 };
261
263 {
264 struct
265 {
266 uint x : 9;
267 uint y : 9;
268 uint z : 9;
269 uint w : 5;
270 } data;
271 uint32 pack;
272 };
273
274 template<length_t L, qualifier Q>
276 {};
277
278 template<qualifier Q>
279 struct compute_half<1, Q>
280 {
281 GLM_FUNC_QUALIFIER static vec<1, uint16, Q> pack(vec<1, float, Q> const& v)
282 {
283 int16 const Unpack(detail::toFloat16(v.x));
284 u16vec1 Packed;
285 memcpy(&Packed, &Unpack, sizeof(Packed));
286 return Packed;
287 }
288
289 GLM_FUNC_QUALIFIER static vec<1, float, Q> unpack(vec<1, uint16, Q> const& v)
290 {
291 i16vec1 Unpack;
292 memcpy(&Unpack, &v, sizeof(Unpack));
293 return vec<1, float, Q>(detail::toFloat32(v.x));
294 }
295 };
296
297 template<qualifier Q>
298 struct compute_half<2, Q>
299 {
300 GLM_FUNC_QUALIFIER static vec<2, uint16, Q> pack(vec<2, float, Q> const& v)
301 {
302 vec<2, int16, Q> const Unpack(detail::toFloat16(v.x), detail::toFloat16(v.y));
303 u16vec2 Packed;
304 memcpy(&Packed, &Unpack, sizeof(Packed));
305 return Packed;
306 }
307
308 GLM_FUNC_QUALIFIER static vec<2, float, Q> unpack(vec<2, uint16, Q> const& v)
309 {
310 i16vec2 Unpack;
311 memcpy(&Unpack, &v, sizeof(Unpack));
312 return vec<2, float, Q>(detail::toFloat32(v.x), detail::toFloat32(v.y));
313 }
314 };
315
316 template<qualifier Q>
317 struct compute_half<3, Q>
318 {
319 GLM_FUNC_QUALIFIER static vec<3, uint16, Q> pack(vec<3, float, Q> const& v)
320 {
321 vec<3, int16, Q> const Unpack(detail::toFloat16(v.x), detail::toFloat16(v.y), detail::toFloat16(v.z));
322 u16vec3 Packed;
323 memcpy(&Packed, &Unpack, sizeof(Packed));
324 return Packed;
325 }
326
327 GLM_FUNC_QUALIFIER static vec<3, float, Q> unpack(vec<3, uint16, Q> const& v)
328 {
329 i16vec3 Unpack;
330 memcpy(&Unpack, &v, sizeof(Unpack));
331 return vec<3, float, Q>(detail::toFloat32(v.x), detail::toFloat32(v.y), detail::toFloat32(v.z));
332 }
333 };
334
335 template<qualifier Q>
336 struct compute_half<4, Q>
337 {
338 GLM_FUNC_QUALIFIER static vec<4, uint16, Q> pack(vec<4, float, Q> const& v)
339 {
340 vec<4, int16, Q> const Unpack(detail::toFloat16(v.x), detail::toFloat16(v.y), detail::toFloat16(v.z), detail::toFloat16(v.w));
341 u16vec4 Packed;
342 memcpy(&Packed, &Unpack, sizeof(Packed));
343 return Packed;
344 }
345
346 GLM_FUNC_QUALIFIER static vec<4, float, Q> unpack(vec<4, uint16, Q> const& v)
347 {
348 i16vec4 Unpack;
349 memcpy(&Unpack, &v, sizeof(Unpack));
350 return vec<4, float, Q>(detail::toFloat32(v.x), detail::toFloat32(v.y), detail::toFloat32(v.z), detail::toFloat32(v.w));
351 }
352 };
353}//namespace detail
354
355 GLM_FUNC_QUALIFIER uint8 packUnorm1x8(float v)
356 {
357 return static_cast<uint8>(round(clamp(v, 0.0f, 1.0f) * 255.0f));
358 }
359
360 GLM_FUNC_QUALIFIER float unpackUnorm1x8(uint8 p)
361 {
362 float const Unpack(p);
363 return Unpack * static_cast<float>(0.0039215686274509803921568627451); // 1 / 255
364 }
365
366 GLM_FUNC_QUALIFIER uint16 packUnorm2x8(vec2 const& v)
367 {
368 u8vec2 const Topack(round(clamp(v, 0.0f, 1.0f) * 255.0f));
369
370 uint16 Unpack = 0;
371 memcpy(&Unpack, &Topack, sizeof(Unpack));
372 return Unpack;
373 }
374
375 GLM_FUNC_QUALIFIER vec2 unpackUnorm2x8(uint16 p)
376 {
377 u8vec2 Unpack;
378 memcpy(&Unpack, &p, sizeof(Unpack));
379 return vec2(Unpack) * float(0.0039215686274509803921568627451); // 1 / 255
380 }
381
382 GLM_FUNC_QUALIFIER uint8 packSnorm1x8(float v)
383 {
384 int8 const Topack(static_cast<int8>(round(clamp(v ,-1.0f, 1.0f) * 127.0f)));
385 uint8 Packed = 0;
386 memcpy(&Packed, &Topack, sizeof(Packed));
387 return Packed;
388 }
389
390 GLM_FUNC_QUALIFIER float unpackSnorm1x8(uint8 p)
391 {
392 int8 Unpack = 0;
393 memcpy(&Unpack, &p, sizeof(Unpack));
394 return clamp(
395 static_cast<float>(Unpack) * 0.00787401574803149606299212598425f, // 1.0f / 127.0f
396 -1.0f, 1.0f);
397 }
398
399 GLM_FUNC_QUALIFIER uint16 packSnorm2x8(vec2 const& v)
400 {
401 i8vec2 const Topack(round(clamp(v, -1.0f, 1.0f) * 127.0f));
402 uint16 Packed = 0;
403 memcpy(&Packed, &Topack, sizeof(Packed));
404 return Packed;
405 }
406
407 GLM_FUNC_QUALIFIER vec2 unpackSnorm2x8(uint16 p)
408 {
409 i8vec2 Unpack;
410 memcpy(&Unpack, &p, sizeof(Unpack));
411 return clamp(
412 vec2(Unpack) * 0.00787401574803149606299212598425f, // 1.0f / 127.0f
413 -1.0f, 1.0f);
414 }
415
416 GLM_FUNC_QUALIFIER uint16 packUnorm1x16(float s)
417 {
418 return static_cast<uint16>(round(clamp(s, 0.0f, 1.0f) * 65535.0f));
419 }
420
421 GLM_FUNC_QUALIFIER float unpackUnorm1x16(uint16 p)
422 {
423 float const Unpack(p);
424 return Unpack * 1.5259021896696421759365224689097e-5f; // 1.0 / 65535.0
425 }
426
427 GLM_FUNC_QUALIFIER uint64 packUnorm4x16(vec4 const& v)
428 {
429 u16vec4 const Topack(round(clamp(v , 0.0f, 1.0f) * 65535.0f));
430 uint64 Packed = 0;
431 memcpy(&Packed, &Topack, sizeof(Packed));
432 return Packed;
433 }
434
435 GLM_FUNC_QUALIFIER vec4 unpackUnorm4x16(uint64 p)
436 {
437 u16vec4 Unpack;
438 memcpy(&Unpack, &p, sizeof(Unpack));
439 return vec4(Unpack) * 1.5259021896696421759365224689097e-5f; // 1.0 / 65535.0
440 }
441
442 GLM_FUNC_QUALIFIER uint16 packSnorm1x16(float v)
443 {
444 int16 const Topack = static_cast<int16>(round(clamp(v ,-1.0f, 1.0f) * 32767.0f));
445 uint16 Packed = 0;
446 memcpy(&Packed, &Topack, sizeof(Packed));
447 return Packed;
448 }
449
450 GLM_FUNC_QUALIFIER float unpackSnorm1x16(uint16 p)
451 {
452 int16 Unpack = 0;
453 memcpy(&Unpack, &p, sizeof(Unpack));
454 return clamp(
455 static_cast<float>(Unpack) * 3.0518509475997192297128208258309e-5f, //1.0f / 32767.0f,
456 -1.0f, 1.0f);
457 }
458
459 GLM_FUNC_QUALIFIER uint64 packSnorm4x16(vec4 const& v)
460 {
461 i16vec4 const Topack(round(clamp(v ,-1.0f, 1.0f) * 32767.0f));
462 uint64 Packed = 0;
463 memcpy(&Packed, &Topack, sizeof(Packed));
464 return Packed;
465 }
466
467 GLM_FUNC_QUALIFIER vec4 unpackSnorm4x16(uint64 p)
468 {
469 i16vec4 Unpack;
470 memcpy(&Unpack, &p, sizeof(Unpack));
471 return clamp(
472 vec4(Unpack) * 3.0518509475997192297128208258309e-5f, //1.0f / 32767.0f,
473 -1.0f, 1.0f);
474 }
475
476 GLM_FUNC_QUALIFIER uint16 packHalf1x16(float v)
477 {
478 int16 const Topack(detail::toFloat16(v));
479 uint16 Packed = 0;
480 memcpy(&Packed, &Topack, sizeof(Packed));
481 return Packed;
482 }
483
484 GLM_FUNC_QUALIFIER float unpackHalf1x16(uint16 v)
485 {
486 int16 Unpack = 0;
487 memcpy(&Unpack, &v, sizeof(Unpack));
488 return detail::toFloat32(Unpack);
489 }
490
491 GLM_FUNC_QUALIFIER uint64 packHalf4x16(glm::vec4 const& v)
492 {
493 i16vec4 const Unpack(
494 detail::toFloat16(v.x),
495 detail::toFloat16(v.y),
496 detail::toFloat16(v.z),
497 detail::toFloat16(v.w));
498 uint64 Packed = 0;
499 memcpy(&Packed, &Unpack, sizeof(Packed));
500 return Packed;
501 }
502
503 GLM_FUNC_QUALIFIER glm::vec4 unpackHalf4x16(uint64 v)
504 {
505 i16vec4 Unpack;
506 memcpy(&Unpack, &v, sizeof(Unpack));
507 return vec4(
508 detail::toFloat32(Unpack.x),
509 detail::toFloat32(Unpack.y),
510 detail::toFloat32(Unpack.z),
511 detail::toFloat32(Unpack.w));
512 }
513
514 GLM_FUNC_QUALIFIER uint32 packI3x10_1x2(ivec4 const& v)
515 {
516 detail::i10i10i10i2 Result;
517 Result.data.x = v.x;
518 Result.data.y = v.y;
519 Result.data.z = v.z;
520 Result.data.w = v.w;
521 return Result.pack;
522 }
523
524 GLM_FUNC_QUALIFIER ivec4 unpackI3x10_1x2(uint32 v)
525 {
526 detail::i10i10i10i2 Unpack;
527 Unpack.pack = v;
528 return ivec4(
529 Unpack.data.x,
530 Unpack.data.y,
531 Unpack.data.z,
532 Unpack.data.w);
533 }
534
535 GLM_FUNC_QUALIFIER uint32 packU3x10_1x2(uvec4 const& v)
536 {
537 detail::u10u10u10u2 Result;
538 Result.data.x = v.x;
539 Result.data.y = v.y;
540 Result.data.z = v.z;
541 Result.data.w = v.w;
542 return Result.pack;
543 }
544
545 GLM_FUNC_QUALIFIER uvec4 unpackU3x10_1x2(uint32 v)
546 {
547 detail::u10u10u10u2 Unpack;
548 Unpack.pack = v;
549 return uvec4(
550 Unpack.data.x,
551 Unpack.data.y,
552 Unpack.data.z,
553 Unpack.data.w);
554 }
555
556 GLM_FUNC_QUALIFIER uint32 packSnorm3x10_1x2(vec4 const& v)
557 {
558 ivec4 const Pack(round(clamp(v,-1.0f, 1.0f) * vec4(511.f, 511.f, 511.f, 1.f)));
559
560 detail::i10i10i10i2 Result;
561 Result.data.x = Pack.x;
562 Result.data.y = Pack.y;
563 Result.data.z = Pack.z;
564 Result.data.w = Pack.w;
565 return Result.pack;
566 }
567
568 GLM_FUNC_QUALIFIER vec4 unpackSnorm3x10_1x2(uint32 v)
569 {
570 detail::i10i10i10i2 Unpack;
571 Unpack.pack = v;
572
573 vec4 const Result(Unpack.data.x, Unpack.data.y, Unpack.data.z, Unpack.data.w);
574
575 return clamp(Result * vec4(1.f / 511.f, 1.f / 511.f, 1.f / 511.f, 1.f), -1.0f, 1.0f);
576 }
577
578 GLM_FUNC_QUALIFIER uint32 packUnorm3x10_1x2(vec4 const& v)
579 {
580 uvec4 const Unpack(round(clamp(v, 0.0f, 1.0f) * vec4(1023.f, 1023.f, 1023.f, 3.f)));
581
582 detail::u10u10u10u2 Result;
583 Result.data.x = Unpack.x;
584 Result.data.y = Unpack.y;
585 Result.data.z = Unpack.z;
586 Result.data.w = Unpack.w;
587 return Result.pack;
588 }
589
590 GLM_FUNC_QUALIFIER vec4 unpackUnorm3x10_1x2(uint32 v)
591 {
592 vec4 const ScaleFactors(1.0f / 1023.f, 1.0f / 1023.f, 1.0f / 1023.f, 1.0f / 3.f);
593
594 detail::u10u10u10u2 Unpack;
595 Unpack.pack = v;
596 return vec4(Unpack.data.x, Unpack.data.y, Unpack.data.z, Unpack.data.w) * ScaleFactors;
597 }
598
599 GLM_FUNC_QUALIFIER uint32 packF2x11_1x10(vec3 const& v)
600 {
601 return
602 ((detail::floatTo11bit(v.x) & ((1 << 11) - 1)) << 0) |
603 ((detail::floatTo11bit(v.y) & ((1 << 11) - 1)) << 11) |
604 ((detail::floatTo10bit(v.z) & ((1 << 10) - 1)) << 22);
605 }
606
607 GLM_FUNC_QUALIFIER vec3 unpackF2x11_1x10(uint32 v)
608 {
609 return vec3(
610 detail::packed11bitToFloat(v >> 0),
611 detail::packed11bitToFloat(v >> 11),
612 detail::packed10bitToFloat(v >> 22));
613 }
614
615 GLM_FUNC_QUALIFIER uint32 packF3x9_E1x5(vec3 const& v)
616 {
617 float const SharedExpMax = (pow(2.0f, 9.0f - 1.0f) / pow(2.0f, 9.0f)) * pow(2.0f, 31.f - 15.f);
618 vec3 const Color = clamp(v, 0.0f, SharedExpMax);
619 float const MaxColor = max(Color.x, max(Color.y, Color.z));
620
621 float const ExpSharedP = max(-15.f - 1.f, floor(log2(MaxColor))) + 1.0f + 15.f;
622 float const MaxShared = floor(MaxColor / pow(2.0f, (ExpSharedP - 15.f - 9.f)) + 0.5f);
623 float const ExpShared = equal(MaxShared, pow(2.0f, 9.0f), epsilon<float>()) ? ExpSharedP + 1.0f : ExpSharedP;
624
625 uvec3 const ColorComp(floor(Color / pow(2.f, (ExpShared - 15.f - 9.f)) + 0.5f));
626
627 detail::u9u9u9e5 Unpack;
628 Unpack.data.x = ColorComp.x;
629 Unpack.data.y = ColorComp.y;
630 Unpack.data.z = ColorComp.z;
631 Unpack.data.w = uint(ExpShared);
632 return Unpack.pack;
633 }
634
635 GLM_FUNC_QUALIFIER vec3 unpackF3x9_E1x5(uint32 v)
636 {
637 detail::u9u9u9e5 Unpack;
638 Unpack.pack = v;
639
640 return vec3(Unpack.data.x, Unpack.data.y, Unpack.data.z) * pow(2.0f, Unpack.data.w - 15.f - 9.f);
641 }
642
643 // Based on Brian Karis http://graphicrants.blogspot.fr/2009/04/rgbm-color-encoding.html
644 template<typename T, qualifier Q>
645 GLM_FUNC_QUALIFIER vec<4, T, Q> packRGBM(vec<3, T, Q> const& rgb)
646 {
647 vec<3, T, Q> const Color(rgb * static_cast<T>(1.0 / 6.0));
648 T Alpha = clamp(max(max(Color.x, Color.y), max(Color.z, static_cast<T>(1e-6))), static_cast<T>(0), static_cast<T>(1));
649 Alpha = ceil(Alpha * static_cast<T>(255.0)) / static_cast<T>(255.0);
650 return vec<4, T, Q>(Color / Alpha, Alpha);
651 }
652
653 template<typename T, qualifier Q>
654 GLM_FUNC_QUALIFIER vec<3, T, Q> unpackRGBM(vec<4, T, Q> const& rgbm)
655 {
656 return vec<3, T, Q>(rgbm.x, rgbm.y, rgbm.z) * rgbm.w * static_cast<T>(6);
657 }
658
659 template<length_t L, qualifier Q>
660 GLM_FUNC_QUALIFIER vec<L, uint16, Q> packHalf(vec<L, float, Q> const& v)
661 {
663 }
664
665 template<length_t L, qualifier Q>
666 GLM_FUNC_QUALIFIER vec<L, float, Q> unpackHalf(vec<L, uint16, Q> const& v)
667 {
669 }
670
671 template<typename uintType, length_t L, typename floatType, qualifier Q>
673 {
674 GLM_STATIC_ASSERT(std::numeric_limits<uintType>::is_integer, "uintType must be an integer type");
675 GLM_STATIC_ASSERT(std::numeric_limits<floatType>::is_iec559, "floatType must be a floating point type");
676
677 return vec<L, uintType, Q>(round(clamp(v, static_cast<floatType>(0), static_cast<floatType>(1)) * static_cast<floatType>(std::numeric_limits<uintType>::max())));
678 }
679
680 template<typename floatType, length_t L, typename uintType, qualifier Q>
682 {
683 GLM_STATIC_ASSERT(std::numeric_limits<uintType>::is_integer, "uintType must be an integer type");
684 GLM_STATIC_ASSERT(std::numeric_limits<floatType>::is_iec559, "floatType must be a floating point type");
685
686 return vec<L, float, Q>(v) * (static_cast<floatType>(1) / static_cast<floatType>(std::numeric_limits<uintType>::max()));
687 }
688
689 template<typename intType, length_t L, typename floatType, qualifier Q>
691 {
692 GLM_STATIC_ASSERT(std::numeric_limits<intType>::is_integer, "uintType must be an integer type");
693 GLM_STATIC_ASSERT(std::numeric_limits<floatType>::is_iec559, "floatType must be a floating point type");
694
695 return vec<L, intType, Q>(round(clamp(v , static_cast<floatType>(-1), static_cast<floatType>(1)) * static_cast<floatType>(std::numeric_limits<intType>::max())));
696 }
697
698 template<typename floatType, length_t L, typename intType, qualifier Q>
700 {
701 GLM_STATIC_ASSERT(std::numeric_limits<intType>::is_integer, "uintType must be an integer type");
702 GLM_STATIC_ASSERT(std::numeric_limits<floatType>::is_iec559, "floatType must be a floating point type");
703
704 return clamp(vec<L, floatType, Q>(v) * (static_cast<floatType>(1) / static_cast<floatType>(std::numeric_limits<intType>::max())), static_cast<floatType>(-1), static_cast<floatType>(1));
705 }
706
707 GLM_FUNC_QUALIFIER uint8 packUnorm2x4(vec2 const& v)
708 {
709 u32vec2 const Unpack(round(clamp(v, 0.0f, 1.0f) * 15.0f));
710 detail::u4u4 Result;
711 Result.data.x = Unpack.x;
712 Result.data.y = Unpack.y;
713 return Result.pack;
714 }
715
716 GLM_FUNC_QUALIFIER vec2 unpackUnorm2x4(uint8 v)
717 {
718 float const ScaleFactor(1.f / 15.f);
719 detail::u4u4 Unpack;
720 Unpack.pack = v;
721 return vec2(Unpack.data.x, Unpack.data.y) * ScaleFactor;
722 }
723
724 GLM_FUNC_QUALIFIER uint16 packUnorm4x4(vec4 const& v)
725 {
726 u32vec4 const Unpack(round(clamp(v, 0.0f, 1.0f) * 15.0f));
727 detail::u4u4u4u4 Result;
728 Result.data.x = Unpack.x;
729 Result.data.y = Unpack.y;
730 Result.data.z = Unpack.z;
731 Result.data.w = Unpack.w;
732 return Result.pack;
733 }
734
735 GLM_FUNC_QUALIFIER vec4 unpackUnorm4x4(uint16 v)
736 {
737 float const ScaleFactor(1.f / 15.f);
738 detail::u4u4u4u4 Unpack;
739 Unpack.pack = v;
740 return vec4(Unpack.data.x, Unpack.data.y, Unpack.data.z, Unpack.data.w) * ScaleFactor;
741 }
742
743 GLM_FUNC_QUALIFIER uint16 packUnorm1x5_1x6_1x5(vec3 const& v)
744 {
745 u32vec3 const Unpack(round(clamp(v, 0.0f, 1.0f) * vec3(31.f, 63.f, 31.f)));
746 detail::u5u6u5 Result;
747 Result.data.x = Unpack.x;
748 Result.data.y = Unpack.y;
749 Result.data.z = Unpack.z;
750 return Result.pack;
751 }
752
753 GLM_FUNC_QUALIFIER vec3 unpackUnorm1x5_1x6_1x5(uint16 v)
754 {
755 vec3 const ScaleFactor(1.f / 31.f, 1.f / 63.f, 1.f / 31.f);
756 detail::u5u6u5 Unpack;
757 Unpack.pack = v;
758 return vec3(Unpack.data.x, Unpack.data.y, Unpack.data.z) * ScaleFactor;
759 }
760
761 GLM_FUNC_QUALIFIER uint16 packUnorm3x5_1x1(vec4 const& v)
762 {
763 u32vec4 const Unpack(round(clamp(v, 0.0f, 1.0f) * vec4(31.f, 31.f, 31.f, 1.f)));
764 detail::u5u5u5u1 Result;
765 Result.data.x = Unpack.x;
766 Result.data.y = Unpack.y;
767 Result.data.z = Unpack.z;
768 Result.data.w = Unpack.w;
769 return Result.pack;
770 }
771
772 GLM_FUNC_QUALIFIER vec4 unpackUnorm3x5_1x1(uint16 v)
773 {
774 vec4 const ScaleFactor(1.f / 31.f, 1.f / 31.f, 1.f / 31.f, 1.f);
775 detail::u5u5u5u1 Unpack;
776 Unpack.pack = v;
777 return vec4(Unpack.data.x, Unpack.data.y, Unpack.data.z, Unpack.data.w) * ScaleFactor;
778 }
779
780 GLM_FUNC_QUALIFIER uint8 packUnorm2x3_1x2(vec3 const& v)
781 {
782 u32vec3 const Unpack(round(clamp(v, 0.0f, 1.0f) * vec3(7.f, 7.f, 3.f)));
783 detail::u3u3u2 Result;
784 Result.data.x = Unpack.x;
785 Result.data.y = Unpack.y;
786 Result.data.z = Unpack.z;
787 return Result.pack;
788 }
789
790 GLM_FUNC_QUALIFIER vec3 unpackUnorm2x3_1x2(uint8 v)
791 {
792 vec3 const ScaleFactor(1.f / 7.f, 1.f / 7.f, 1.f / 3.f);
793 detail::u3u3u2 Unpack;
794 Unpack.pack = v;
795 return vec3(Unpack.data.x, Unpack.data.y, Unpack.data.z) * ScaleFactor;
796 }
797
798 GLM_FUNC_QUALIFIER int16 packInt2x8(i8vec2 const& v)
799 {
800 int16 Pack = 0;
801 memcpy(&Pack, &v, sizeof(Pack));
802 return Pack;
803 }
804
805 GLM_FUNC_QUALIFIER i8vec2 unpackInt2x8(int16 p)
806 {
807 i8vec2 Unpack;
808 memcpy(&Unpack, &p, sizeof(Unpack));
809 return Unpack;
810 }
811
812 GLM_FUNC_QUALIFIER uint16 packUint2x8(u8vec2 const& v)
813 {
814 uint16 Pack = 0;
815 memcpy(&Pack, &v, sizeof(Pack));
816 return Pack;
817 }
818
819 GLM_FUNC_QUALIFIER u8vec2 unpackUint2x8(uint16 p)
820 {
821 u8vec2 Unpack;
822 memcpy(&Unpack, &p, sizeof(Unpack));
823 return Unpack;
824 }
825
826 GLM_FUNC_QUALIFIER int32 packInt4x8(i8vec4 const& v)
827 {
828 int32 Pack = 0;
829 memcpy(&Pack, &v, sizeof(Pack));
830 return Pack;
831 }
832
833 GLM_FUNC_QUALIFIER i8vec4 unpackInt4x8(int32 p)
834 {
835 i8vec4 Unpack;
836 memcpy(&Unpack, &p, sizeof(Unpack));
837 return Unpack;
838 }
839
840 GLM_FUNC_QUALIFIER uint32 packUint4x8(u8vec4 const& v)
841 {
842 uint32 Pack = 0;
843 memcpy(&Pack, &v, sizeof(Pack));
844 return Pack;
845 }
846
847 GLM_FUNC_QUALIFIER u8vec4 unpackUint4x8(uint32 p)
848 {
849 u8vec4 Unpack;
850 memcpy(&Unpack, &p, sizeof(Unpack));
851 return Unpack;
852 }
853
854 GLM_FUNC_QUALIFIER int packInt2x16(i16vec2 const& v)
855 {
856 int Pack = 0;
857 memcpy(&Pack, &v, sizeof(Pack));
858 return Pack;
859 }
860
861 GLM_FUNC_QUALIFIER i16vec2 unpackInt2x16(int p)
862 {
863 i16vec2 Unpack;
864 memcpy(&Unpack, &p, sizeof(Unpack));
865 return Unpack;
866 }
867
868 GLM_FUNC_QUALIFIER int64 packInt4x16(i16vec4 const& v)
869 {
870 int64 Pack = 0;
871 memcpy(&Pack, &v, sizeof(Pack));
872 return Pack;
873 }
874
875 GLM_FUNC_QUALIFIER i16vec4 unpackInt4x16(int64 p)
876 {
877 i16vec4 Unpack;
878 memcpy(&Unpack, &p, sizeof(Unpack));
879 return Unpack;
880 }
881
882 GLM_FUNC_QUALIFIER uint packUint2x16(u16vec2 const& v)
883 {
884 uint Pack = 0;
885 memcpy(&Pack, &v, sizeof(Pack));
886 return Pack;
887 }
888
889 GLM_FUNC_QUALIFIER u16vec2 unpackUint2x16(uint p)
890 {
891 u16vec2 Unpack;
892 memcpy(&Unpack, &p, sizeof(Unpack));
893 return Unpack;
894 }
895
896 GLM_FUNC_QUALIFIER uint64 packUint4x16(u16vec4 const& v)
897 {
898 uint64 Pack = 0;
899 memcpy(&Pack, &v, sizeof(Pack));
900 return Pack;
901 }
902
903 GLM_FUNC_QUALIFIER u16vec4 unpackUint4x16(uint64 p)
904 {
905 u16vec4 Unpack;
906 memcpy(&Unpack, &p, sizeof(Unpack));
907 return Unpack;
908 }
909
910 GLM_FUNC_QUALIFIER int64 packInt2x32(i32vec2 const& v)
911 {
912 int64 Pack = 0;
913 memcpy(&Pack, &v, sizeof(Pack));
914 return Pack;
915 }
916
917 GLM_FUNC_QUALIFIER i32vec2 unpackInt2x32(int64 p)
918 {
919 i32vec2 Unpack;
920 memcpy(&Unpack, &p, sizeof(Unpack));
921 return Unpack;
922 }
923
924 GLM_FUNC_QUALIFIER uint64 packUint2x32(u32vec2 const& v)
925 {
926 uint64 Pack = 0;
927 memcpy(&Pack, &v, sizeof(Pack));
928 return Pack;
929 }
930
931 GLM_FUNC_QUALIFIER u32vec2 unpackUint2x32(uint64 p)
932 {
933 u32vec2 Unpack;
934 memcpy(&Unpack, &p, sizeof(Unpack));
935 return Unpack;
936 }
937}//namespace glm
938
GLM_FUNC_DECL vec< L, bool, Q > isinf(vec< L, T, Q > const &x)
Definition func_common.inl:655
GLM_FUNC_DECL vec< L, T, Q > ceil(vec< L, T, Q > const &x)
Definition func_common.inl:380
GLM_FUNC_DECL vec< L, bool, Q > isnan(vec< L, T, Q > const &x)
Definition func_common.inl:613
GLM_FUNC_DECL vec< L, T, Q > round(vec< L, T, Q > const &x)
Definition func_common.inl:321
GLM_FUNC_DECL vec< L, T, Q > floor(vec< L, T, Q > const &x)
Definition func_common.inl:307
GLM_FUNC_DECL GLM_CONSTEXPR genType max(genType x, genType y)
Definition func_common.inl:25
GLM_FUNC_QUALIFIER vec< L, T, Q > pow(vec< L, T, Q > const &base, vec< L, T, Q > const &exponent)
Definition func_exponential.inl:72
GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec< L, bool, Q > equal(vec< L, T, Q > const &x, vec< L, T, Q > const &y)
Definition func_vector_relational.inl:40
vec< 4, float, defaultp > vec4
Definition vector_float4.hpp:15
vec< 3, float, defaultp > vec3
Definition vector_float3.hpp:15
vec< 2, float, defaultp > vec2
Definition vector_float2.hpp:15
vec< 4, unsigned int, defaultp > uvec4
Definition vector_uint4.hpp:15
vec< 4, int, defaultp > ivec4
Definition vector_int4.hpp:15
GLM_FUNC_DECL GLM_CONSTEXPR genType epsilon()
Return the epsilon constant for floating point types.
Definition scalar_constants.inl:6
detail::int16 int16
16 bit signed integer type.
Definition scalar_int_sized.hpp:61
detail::int64 int64
64 bit signed integer type.
Definition scalar_int_sized.hpp:67
detail::int8 int8
8 bit signed integer type.
Definition scalar_int_sized.hpp:58
detail::int32 int32
32 bit signed integer type.
Definition scalar_int_sized.hpp:64
detail::uint32 uint32
32 bit unsigned integer type.
Definition scalar_uint_sized.hpp:64
detail::uint8 uint8
8 bit unsigned integer type.
Definition scalar_uint_sized.hpp:58
detail::uint16 uint16
16 bit unsigned integer type.
Definition scalar_uint_sized.hpp:61
detail::uint64 uint64
64 bit unsigned integer type.
Definition scalar_uint_sized.hpp:67
GLM_FUNC_DECL GLM_CONSTEXPR genType e()
Definition constants.inl:102
GLM_FUNC_DECL int packInt2x16(i16vec2 const &v)
Definition packing.inl:854
GLM_FUNC_DECL uint32 packI3x10_1x2(ivec4 const &v)
Definition packing.inl:514
GLM_FUNC_DECL uint16 packSnorm2x8(vec2 const &v)
Definition packing.inl:399
GLM_FUNC_DECL u8vec2 unpackUint2x8(uint16 p)
Definition packing.inl:819
GLM_FUNC_DECL ivec4 unpackI3x10_1x2(uint32 p)
Definition packing.inl:524
GLM_FUNC_DECL uint32 packF3x9_E1x5(vec3 const &v)
Definition packing.inl:615
GLM_FUNC_DECL uint8 packUnorm2x3_1x2(vec3 const &v)
Definition packing.inl:780
GLM_FUNC_DECL uint32 packSnorm3x10_1x2(vec4 const &v)
Definition packing.inl:556
GLM_FUNC_DECL uint16 packUnorm1x5_1x6_1x5(vec3 const &v)
Definition packing.inl:743
GLM_FUNC_DECL uvec4 unpackU3x10_1x2(uint32 p)
Definition packing.inl:545
GLM_FUNC_DECL vec3 unpackF3x9_E1x5(uint32 p)
Definition packing.inl:635
GLM_FUNC_DECL uint64 packUint4x16(u16vec4 const &v)
Definition packing.inl:896
GLM_FUNC_DECL uint16 packUnorm3x5_1x1(vec4 const &v)
Definition packing.inl:761
GLM_FUNC_DECL vec4 unpackSnorm4x16(uint64 p)
Definition packing.inl:467
GLM_FUNC_DECL int64 packInt2x32(i32vec2 const &v)
Definition packing.inl:910
GLM_FUNC_DECL vec< L, uintType, Q > packUnorm(vec< L, floatType, Q > const &v)
Definition packing.inl:672
GLM_FUNC_DECL float unpackSnorm1x16(uint16 p)
Definition packing.inl:450
GLM_FUNC_DECL uint8 packSnorm1x8(float s)
Definition packing.inl:382
GLM_FUNC_DECL vec2 unpackSnorm2x8(uint16 p)
Definition packing.inl:407
GLM_FUNC_DECL uint32 packUnorm3x10_1x2(vec4 const &v)
Definition packing.inl:578
GLM_FUNC_DECL uint8 packUnorm1x8(float v)
Definition packing.inl:355
GLM_FUNC_DECL float unpackUnorm1x8(uint8 p)
Definition packing.inl:360
GLM_FUNC_DECL vec4 unpackUnorm4x4(uint16 p)
Definition packing.inl:735
GLM_FUNC_DECL vec2 unpackUnorm2x4(uint8 p)
Definition packing.inl:716
GLM_FUNC_DECL vec< L, intType, Q > packSnorm(vec< L, floatType, Q > const &v)
Definition packing.inl:690
GLM_FUNC_DECL vec< 4, T, Q > packRGBM(vec< 3, T, Q > const &rgb)
GLM_FUNC_DECL uint16 packUint2x8(u8vec2 const &v)
Definition packing.inl:812
GLM_FUNC_DECL uint64 packUint2x32(u32vec2 const &v)
Definition packing.inl:924
GLM_FUNC_DECL int16 packInt2x8(i8vec2 const &v)
Definition packing.inl:798
GLM_FUNC_DECL i8vec2 unpackInt2x8(int16 p)
Definition packing.inl:805
GLM_FUNC_DECL vec< L, floatType, Q > unpackSnorm(vec< L, intType, Q > const &v)
Definition packing.inl:699
GLM_FUNC_DECL uint16 packUnorm1x16(float v)
Definition packing.inl:416
GLM_FUNC_DECL vec< L, floatType, Q > unpackUnorm(vec< L, uintType, Q > const &v)
Definition packing.inl:681
GLM_FUNC_DECL i16vec4 unpackInt4x16(int64 p)
Definition packing.inl:875
GLM_FUNC_DECL i16vec2 unpackInt2x16(int p)
Definition packing.inl:861
GLM_FUNC_DECL i32vec2 unpackInt2x32(int64 p)
Definition packing.inl:917
GLM_FUNC_DECL vec3 unpackUnorm1x5_1x6_1x5(uint16 p)
Definition packing.inl:753
GLM_FUNC_DECL float unpackSnorm1x8(uint8 p)
Definition packing.inl:390
GLM_FUNC_DECL vec< L, uint16, Q > packHalf(vec< L, float, Q > const &v)
Definition packing.inl:660
GLM_FUNC_DECL float unpackUnorm1x16(uint16 p)
Definition packing.inl:421
GLM_FUNC_DECL u16vec2 unpackUint2x16(uint p)
Definition packing.inl:889
GLM_FUNC_DECL vec< L, float, Q > unpackHalf(vec< L, uint16, Q > const &p)
Definition packing.inl:666
GLM_FUNC_DECL uint64 packHalf4x16(vec4 const &v)
Definition packing.inl:491
GLM_FUNC_DECL uint16 packUnorm2x8(vec2 const &v)
Definition packing.inl:366
GLM_FUNC_DECL vec4 unpackSnorm3x10_1x2(uint32 p)
Definition packing.inl:568
GLM_FUNC_DECL vec3 unpackF2x11_1x10(uint32 p)
Definition packing.inl:607
GLM_FUNC_DECL uint32 packF2x11_1x10(vec3 const &v)
Definition packing.inl:599
GLM_FUNC_DECL vec2 unpackUnorm2x8(uint16 p)
Definition packing.inl:375
GLM_FUNC_DECL u8vec4 unpackUint4x8(uint32 p)
Definition packing.inl:847
GLM_FUNC_DECL uint64 packSnorm4x16(vec4 const &v)
Definition packing.inl:459
GLM_FUNC_DECL float unpackHalf1x16(uint16 v)
Definition packing.inl:484
GLM_FUNC_DECL vec4 unpackUnorm3x5_1x1(uint16 p)
Definition packing.inl:772
GLM_FUNC_DECL u32vec2 unpackUint2x32(uint64 p)
Definition packing.inl:931
GLM_FUNC_DECL uint16 packHalf1x16(float v)
Definition packing.inl:476
GLM_FUNC_DECL int32 packInt4x8(i8vec4 const &v)
Definition packing.inl:826
GLM_FUNC_DECL uint16 packSnorm1x16(float v)
Definition packing.inl:442
GLM_FUNC_DECL int64 packInt4x16(i16vec4 const &v)
Definition packing.inl:868
GLM_FUNC_DECL uint64 packUnorm4x16(vec4 const &v)
Definition packing.inl:427
GLM_FUNC_DECL uint16 packUnorm4x4(vec4 const &v)
Definition packing.inl:724
GLM_FUNC_DECL uint packUint2x16(u16vec2 const &v)
Definition packing.inl:882
GLM_FUNC_DECL uint8 packUnorm2x4(vec2 const &v)
Definition packing.inl:707
GLM_FUNC_DECL vec4 unpackHalf4x16(uint64 p)
Definition packing.inl:503
GLM_FUNC_DECL uint32 packUint4x8(u8vec4 const &v)
Definition packing.inl:840
GLM_FUNC_DECL vec3 unpackUnorm2x3_1x2(uint8 p)
Definition packing.inl:790
GLM_FUNC_DECL i8vec4 unpackInt4x8(int32 p)
Definition packing.inl:833
GLM_FUNC_DECL u16vec4 unpackUint4x16(uint64 p)
Definition packing.inl:903
GLM_FUNC_DECL uint32 packU3x10_1x2(uvec4 const &v)
Definition packing.inl:535
GLM_FUNC_DECL vec4 unpackUnorm3x10_1x2(uint32 p)
Definition packing.inl:590
GLM_FUNC_DECL vec4 unpackUnorm4x16(uint64 p)
Definition packing.inl:435
GLM_FUNC_DECL vec< 3, T, Q > unpackRGBM(vec< 4, T, Q > const &rgbm)
detail namespace with internal helper functions
Definition json.h:249
Core features
Definition common.hpp:21
Represents a color with red, green, blue, and alpha components.
Definition Color.h:10
Definition packing.inl:276
Definition qualifier.hpp:35
Definition packing.inl:251
Definition packing.inl:239
Definition packing.inl:183
Definition packing.inl:194
Definition packing.inl:204
Definition packing.inl:227
Definition packing.inl:216
Definition packing.inl:263