1///////////////////////////////////////////////////////////////////////////////////////////////////
2// OpenGL Mathematics Copyright (c) 2005 - 2012 G-Truc Creation (www.g-truc.net)
3///////////////////////////////////////////////////////////////////////////////////////////////////
4// Created : 2007-06-21
5// Updated : 2007-08-03
6// Licence : This source is under MIT License
7// File    : glm/gtx/color_cast.inl
8///////////////////////////////////////////////////////////////////////////////////////////////////
9
10namespace glm
11{
12	template <typename T>
13	GLM_FUNC_QUALIFIER uint8 u8channel_cast(T a)
14	{
15		return static_cast<uint8>(a * T(255));
16	}
17
18	template <typename T>
19	GLM_FUNC_QUALIFIER uint16 u16channel_cast(T a)
20	{
21		return static_cast<uint16>(a * T(65535));
22	}
23
24	template <typename T>
25	GLM_FUNC_QUALIFIER uint32 u32_rgbx_cast(const detail::tvec3<T>& c)
26	{
27		uint32 result = 0;
28		result += static_cast<uint32>(c.x * detail::tvec3<T>::value_type(255)) <<  0;
29		result += static_cast<uint32>(c.y * detail::tvec3<T>::value_type(255)) <<  8;
30		result += static_cast<uint32>(c.z * detail::tvec3<T>::value_type(255)) << 16;
31		return result;
32	}
33
34	template <typename T>
35	GLM_FUNC_QUALIFIER uint32 u32_xrgb_cast(const detail::tvec3<T>& c)
36	{
37		uint32 result = 0;
38		result += static_cast<uint32>(c.x * detail::tvec3<T>::value_type(255)) <<  8;
39		result += static_cast<uint32>(c.y * detail::tvec3<T>::value_type(255)) << 16;
40		result += static_cast<uint32>(c.z * detail::tvec3<T>::value_type(255)) << 24;
41		return result;
42	}
43
44	template <typename T>
45	GLM_FUNC_QUALIFIER uint32 u32_bgrx_cast(const detail::tvec3<T>& c)
46	{
47		uint32 result = 0;
48		result += static_cast<uint32>(c.x * detail::tvec3<T>::value_type(255)) << 16;
49		result += static_cast<uint32>(c.y * detail::tvec3<T>::value_type(255)) <<  8;
50		result += static_cast<uint32>(c.z * detail::tvec3<T>::value_type(255)) <<  0;
51		return result;
52	}
53
54	template <typename T>
55	GLM_FUNC_QUALIFIER uint32 u32_xbgr_cast(const detail::tvec3<T>& c)
56	{
57		uint32 result = 0;
58		result += static_cast<uint32>(c.x * detail::tvec3<T>::value_type(255)) << 24;
59		result += static_cast<uint32>(c.y * detail::tvec3<T>::value_type(255)) << 16;
60		result += static_cast<uint32>(c.z * detail::tvec3<T>::value_type(255)) <<  8;
61		result += static_cast<uint32>(c.w * detail::tvec3<T>::value_type(255)) <<  0;
62		return result;
63	}
64
65	template <typename T>
66	GLM_FUNC_QUALIFIER uint32 u32_rgba_cast(const detail::tvec4<T>& c)
67	{
68		uint32 result = 0;
69		result += static_cast<uint32>(c.x * detail::tvec4<T>::value_type(255)) <<  0;
70		result += static_cast<uint32>(c.y * detail::tvec4<T>::value_type(255)) <<  8;
71		result += static_cast<uint32>(c.z * detail::tvec4<T>::value_type(255)) << 16;
72		result += static_cast<uint32>(c.w * detail::tvec4<T>::value_type(255)) << 24;
73		return result;
74	}
75
76	template <typename T>
77	GLM_FUNC_QUALIFIER uint32 u32_argb_cast(const detail::tvec4<T>& c)
78	{
79		uint32 result = 0;
80		result += static_cast<uint32>(c.x * detail::tvec4<T>::value_type(255)) <<  8;
81		result += static_cast<uint32>(c.y * detail::tvec4<T>::value_type(255)) << 16;
82		result += static_cast<uint32>(c.z * detail::tvec4<T>::value_type(255)) << 24;
83		result += static_cast<uint32>(c.w * detail::tvec4<T>::value_type(255)) <<  0;
84		return result;
85	}
86
87	template <typename T>
88	GLM_FUNC_QUALIFIER uint32 u32_bgra_cast(const detail::tvec4<T>& c)
89	{
90		uint32 result = 0;
91		result += static_cast<uint32>(c.x * detail::tvec4<T>::value_type(255)) << 16;
92		result += static_cast<uint32>(c.y * detail::tvec4<T>::value_type(255)) <<  8;
93		result += static_cast<uint32>(c.z * detail::tvec4<T>::value_type(255)) <<  0;
94		result += static_cast<uint32>(c.w * detail::tvec4<T>::value_type(255)) << 24;
95		return result;
96	}
97
98	template <typename T>
99	GLM_FUNC_QUALIFIER uint32 u32_abgr_cast(const detail::tvec4<T>& c)
100	{
101		uint32 result = 0;
102		result += static_cast<uint32>(c.x * detail::tvec4<T>::value_type(255)) << 24;
103		result += static_cast<uint32>(c.y * detail::tvec4<T>::value_type(255)) << 16;
104		result += static_cast<uint32>(c.z * detail::tvec4<T>::value_type(255)) <<  8;
105		result += static_cast<uint32>(c.w * detail::tvec4<T>::value_type(255)) <<  0;
106		return result;
107	}
108
109	template <typename T>
110	GLM_FUNC_QUALIFIER uint64 u64_rgbx_cast(const detail::tvec3<T>& c)
111	{
112		uint64 result = 0;
113		result += static_cast<uint64>(c.x * detail::tvec3<T>::value_type(65535)) <<  0;
114		result += static_cast<uint64>(c.y * detail::tvec3<T>::value_type(65535)) << 16;
115		result += static_cast<uint64>(c.z * detail::tvec3<T>::value_type(65535)) << 32;
116		return result;
117	}
118
119	template <typename T>
120	GLM_FUNC_QUALIFIER uint64 u32_xrgb_cast(const detail::tvec3<T>& c)
121	{
122		uint64 result = 0;
123		result += static_cast<uint64>(c.x * detail::tvec3<T>::value_type(65535)) << 16;
124		result += static_cast<uint64>(c.y * detail::tvec3<T>::value_type(65535)) << 32;
125		result += static_cast<uint64>(c.z * detail::tvec3<T>::value_type(65535)) << 48;
126		return result;
127	}
128
129	template <typename T>
130	GLM_FUNC_QUALIFIER uint64 u32_bgrx_cast(const detail::tvec3<T>& c)
131	{
132		uint64 result = 0;
133		result += static_cast<uint64>(c.x * detail::tvec3<T>::value_type(65535)) << 32;
134		result += static_cast<uint64>(c.y * detail::tvec3<T>::value_type(65535)) << 16;
135		result += static_cast<uint64>(c.z * detail::tvec3<T>::value_type(65535)) <<  0;
136		return result;
137	}
138
139	template <typename T>
140	GLM_FUNC_QUALIFIER uint64 u32_xbgr_cast(const detail::tvec3<T>& c)
141	{
142		uint64 result = 0;
143		result += static_cast<uint64>(c.x * detail::tvec3<T>::value_type(65535)) << 48;
144		result += static_cast<uint64>(c.y * detail::tvec3<T>::value_type(65535)) << 32;
145		result += static_cast<uint64>(c.z * detail::tvec3<T>::value_type(65535)) << 16;
146		result += static_cast<uint64>(c.w * detail::tvec3<T>::value_type(65535)) <<  0;
147		return result;
148	}
149
150	template <typename T>
151	GLM_FUNC_QUALIFIER uint64 u64_rgba_cast(const detail::tvec4<T>& c)
152	{
153		uint64 result = 0;
154		result += static_cast<uint64>(c.x * detail::tvec4<T>::value_type(65535)) <<  0;
155		result += static_cast<uint64>(c.y * detail::tvec4<T>::value_type(65535)) << 16;
156		result += static_cast<uint64>(c.z * detail::tvec4<T>::value_type(65535)) << 32;
157		result += static_cast<uint64>(c.w * detail::tvec4<T>::value_type(65535)) << 48;
158		return result;
159	}
160
161	template <typename T>
162	GLM_FUNC_QUALIFIER uint64 u64_argb_cast(const detail::tvec4<T>& c)
163	{
164		uint64 result = 0;
165		result += static_cast<uint64>(c.x * detail::tvec4<T>::value_type(65535)) << 16;
166		result += static_cast<uint64>(c.y * detail::tvec4<T>::value_type(65535)) << 32;
167		result += static_cast<uint64>(c.z * detail::tvec4<T>::value_type(65535)) << 48;
168		result += static_cast<uint64>(c.w * detail::tvec4<T>::value_type(65535)) <<  0;
169		return result;
170	}
171
172	template <typename T>
173	GLM_FUNC_QUALIFIER uint64 u64_bgra_cast(const detail::tvec4<T>& c)
174	{
175		uint64 result = 0;
176		result += static_cast<uint64>(c.x * detail::tvec4<T>::value_type(65535)) << 32;
177		result += static_cast<uint64>(c.y * detail::tvec4<T>::value_type(65535)) << 16;
178		result += static_cast<uint64>(c.z * detail::tvec4<T>::value_type(65535)) <<  0;
179		result += static_cast<uint64>(c.w * detail::tvec4<T>::value_type(65535)) << 48;
180		return result;
181	}
182
183	template <typename T>
184	GLM_FUNC_QUALIFIER uint64 u64_abgr_cast(const detail::tvec4<T>& c)
185	{
186		uint64 result = 0;
187		result += static_cast<uint64>(c.x * detail::tvec4<T>::value_type(65535)) << 48;
188		result += static_cast<uint64>(c.y * detail::tvec4<T>::value_type(65535)) << 32;
189		result += static_cast<uint64>(c.z * detail::tvec4<T>::value_type(65535)) << 16;
190		result += static_cast<uint64>(c.w * detail::tvec4<T>::value_type(65535)) <<  0;
191		return result;
192	}
193
194	template <>
195	GLM_FUNC_QUALIFIER f16 f16_channel_cast<uint32>(uint32 color)
196	{
197		return f16(static_cast<float>(color >>  0) / static_cast<float>(255));
198	}
199
200	template <>
201	GLM_FUNC_QUALIFIER f16vec3 f16_rgbx_cast<uint32>(uint32 color)
202	{
203		f16vec3 result;
204		result.x = f16(static_cast<float>((color >>  0) & 0xFF) / static_cast<float>(255));
205		result.y = f16(static_cast<float>((color >>  8) & 0xFF) / static_cast<float>(255));
206		result.z = f16(static_cast<float>((color >> 16) & 0xFF) / static_cast<float>(255));
207		return result;
208	}
209
210	template <>
211	GLM_FUNC_QUALIFIER f16vec3 f16_xrgb_cast<uint32>(uint32 color)
212	{
213		f16vec3 result;
214		result.x = f16(static_cast<float>((color >>  8) & 0xFF) / static_cast<float>(255));
215		result.y = f16(static_cast<float>((color >> 16) & 0xFF) / static_cast<float>(255));
216		result.z = f16(static_cast<float>((color >> 24) & 0xFF) / static_cast<float>(255));
217		return result;
218	}
219
220	template <>
221	GLM_FUNC_QUALIFIER f16vec3 f16_bgrx_cast<uint32>(uint32 color)
222	{
223		f16vec3 result;
224		result.x = f16(static_cast<float>((color >> 16) & 0xFF) / static_cast<float>(255));
225		result.y = f16(static_cast<float>((color >>  8) & 0xFF) / static_cast<float>(255));
226		result.z = f16(static_cast<float>((color >>  0) & 0xFF) / static_cast<float>(255));
227		return result;
228	}
229
230	template <>
231	GLM_FUNC_QUALIFIER f16vec3 f16_xbgr_cast<uint32>(uint32 color)
232	{
233		f16vec3 result;
234		result.x = f16(static_cast<float>((color >> 24) & 0xFF) / static_cast<float>(255));
235		result.y = f16(static_cast<float>((color >> 16) & 0xFF) / static_cast<float>(255));
236		result.z = f16(static_cast<float>((color >>  8) & 0xFF) / static_cast<float>(255));
237		return result;
238	}
239
240	template <>
241	GLM_FUNC_QUALIFIER f16vec4 f16_rgba_cast<uint32>(uint32 color)
242	{
243		f16vec4 result;
244		result.x = f16(static_cast<float>((color >>  0) & 0xFF) / static_cast<float>(255));
245		result.y = f16(static_cast<float>((color >>  8) & 0xFF) / static_cast<float>(255));
246		result.z = f16(static_cast<float>((color >> 16) & 0xFF) / static_cast<float>(255));
247		result.w = f16(static_cast<float>((color >> 24) & 0xFF) / static_cast<float>(255));
248		return result;
249	}
250
251	template <>
252	GLM_FUNC_QUALIFIER f16vec4 f16_argb_cast<uint32>(uint32 color)
253	{
254		f16vec4 result;
255		result.x = f16(static_cast<float>((color >>  8) & 0xFF) / static_cast<float>(255));
256		result.y = f16(static_cast<float>((color >> 16) & 0xFF) / static_cast<float>(255));
257		result.z = f16(static_cast<float>((color >> 24) & 0xFF) / static_cast<float>(255));
258		result.w = f16(static_cast<float>((color >>  0) & 0xFF) / static_cast<float>(255));
259		return result;
260	}
261
262	template <>
263	GLM_FUNC_QUALIFIER f16vec4 f16_bgra_cast<uint32>(uint32 color)
264	{
265		f16vec4 result;
266		result.x = f16(static_cast<float>((color >> 16) & 0xFF) / static_cast<float>(255));
267		result.y = f16(static_cast<float>((color >>  8) & 0xFF) / static_cast<float>(255));
268		result.z = f16(static_cast<float>((color >>  0) & 0xFF) / static_cast<float>(255));
269		result.w = f16(static_cast<float>((color >> 24) & 0xFF) / static_cast<float>(255));
270		return result;
271	}
272
273	template <>
274	GLM_FUNC_QUALIFIER f16vec4 f16_abgr_cast<uint32>(uint32 color)
275	{
276		f16vec4 result;
277		result.x = f16(static_cast<float>((color >> 24) & 0xFF) / static_cast<float>(255));
278		result.y = f16(static_cast<float>((color >> 16) & 0xFF) / static_cast<float>(255));
279		result.z = f16(static_cast<float>((color >>  8) & 0xFF) / static_cast<float>(255));
280		result.w = f16(static_cast<float>((color >>  0) & 0xFF) / static_cast<float>(255));
281		return result;
282	}
283
284	template <>
285	GLM_FUNC_QUALIFIER float f32_channel_cast<uint8>(uint8 color)
286	{
287		return static_cast<float>(color >>  0) / static_cast<float>(255);
288	}
289
290	template <>
291	GLM_FUNC_QUALIFIER detail::tvec3<float> f32_rgbx_cast<uint32>(uint32 color)
292	{
293		detail::tvec3<float> result;
294		result.x = static_cast<float>((color >>  0) & 0xFF) / static_cast<float>(255);
295		result.y = static_cast<float>((color >>  8) & 0xFF) / static_cast<float>(255);
296		result.z = static_cast<float>((color >> 16) & 0xFF) / static_cast<float>(255);
297		return result;
298	}
299
300	template <>
301	GLM_FUNC_QUALIFIER detail::tvec3<float> f32_xrgb_cast<uint32>(uint32 color)
302	{
303		detail::tvec3<float> result;
304		result.x = static_cast<float>((color >>  8) & 0xFF) / static_cast<float>(255);
305		result.y = static_cast<float>((color >> 16) & 0xFF) / static_cast<float>(255);
306		result.z = static_cast<float>((color >> 24) & 0xFF) / static_cast<float>(255);
307		return result;
308	}
309
310	template <>
311	GLM_FUNC_QUALIFIER detail::tvec3<float> f32_bgrx_cast<uint32>(uint32 color)
312	{
313		detail::tvec3<float> result;
314		result.x = static_cast<float>((color >> 16) & 0xFF) / static_cast<float>(255);
315		result.y = static_cast<float>((color >>  8) & 0xFF) / static_cast<float>(255);
316		result.z = static_cast<float>((color >>  0) & 0xFF) / static_cast<float>(255);
317		return result;
318	}
319
320	template <>
321	GLM_FUNC_QUALIFIER detail::tvec3<float> f32_xbgr_cast<uint32>(uint32 color)
322	{
323		detail::tvec3<float> result;
324		result.x = static_cast<float>((color >> 24) & 0xFF) / static_cast<float>(255);
325		result.y = static_cast<float>((color >> 16) & 0xFF) / static_cast<float>(255);
326		result.z = static_cast<float>((color >>  8) & 0xFF) / static_cast<float>(255);
327		return result;
328	}
329
330	template <>
331	GLM_FUNC_QUALIFIER detail::tvec4<float> f32_rgba_cast<uint32>(uint32 color)
332	{
333		detail::tvec4<float> result;
334		result.x = static_cast<float>((color >>  0) & 0xFF) / static_cast<float>(255);
335		result.y = static_cast<float>((color >>  8) & 0xFF) / static_cast<float>(255);
336		result.z = static_cast<float>((color >> 16) & 0xFF) / static_cast<float>(255);
337		result.w = static_cast<float>((color >> 24) & 0xFF) / static_cast<float>(255);
338		return result;
339	}
340
341	template <>
342	GLM_FUNC_QUALIFIER detail::tvec4<float> f32_argb_cast<uint32>(uint32 color)
343	{
344		detail::tvec4<float> result;
345		result.x = static_cast<float>((color >>  8) & 0xFF) / static_cast<float>(255);
346		result.y = static_cast<float>((color >> 16) & 0xFF) / static_cast<float>(255);
347		result.z = static_cast<float>((color >> 24) & 0xFF) / static_cast<float>(255);
348		result.w = static_cast<float>((color >>  0) & 0xFF) / static_cast<float>(255);
349		return result;
350	}
351
352	template <>
353	GLM_FUNC_QUALIFIER detail::tvec4<float> f32_bgra_cast<uint32>(uint32 color)
354	{
355		detail::tvec4<float> result;
356		result.x = static_cast<float>((color >> 16) & 0xFF) / static_cast<float>(255);
357		result.y = static_cast<float>((color >>  8) & 0xFF) / static_cast<float>(255);
358		result.z = static_cast<float>((color >>  0) & 0xFF) / static_cast<float>(255);
359		result.w = static_cast<float>((color >> 24) & 0xFF) / static_cast<float>(255);
360		return result;
361	}
362
363	template <>
364	GLM_FUNC_QUALIFIER detail::tvec4<float> f32_abgr_cast<uint32>(uint32 color)
365	{
366		detail::tvec4<float> result;
367		result.x = static_cast<float>((color >> 24) & 0xFF) / static_cast<float>(255);
368		result.y = static_cast<float>((color >> 16) & 0xFF) / static_cast<float>(255);
369		result.z = static_cast<float>((color >>  8) & 0xFF) / static_cast<float>(255);
370		result.w = static_cast<float>((color >>  0) & 0xFF) / static_cast<float>(255);
371		return result;
372	}
373
374	template <>
375	GLM_FUNC_QUALIFIER double f64_channel_cast<uint8>(uint8 color)
376	{
377		return static_cast<double>(color >>  0) / static_cast<double>(255);
378	}
379
380	template <>
381	GLM_FUNC_QUALIFIER detail::tvec3<double> f64_rgbx_cast<uint32>(uint32 color)
382	{
383		detail::tvec3<double> result;
384		result.x = static_cast<double>((color >>  0) & 0xFF) / static_cast<double>(255);
385		result.y = static_cast<double>((color >>  8) & 0xFF) / static_cast<double>(255);
386		result.z = static_cast<double>((color >> 16) & 0xFF) / static_cast<double>(255);
387		return result;
388	}
389
390	template <>
391	GLM_FUNC_QUALIFIER detail::tvec3<double> f64_xrgb_cast<uint32>(uint32 color)
392	{
393		detail::tvec3<double> result;
394		result.x = static_cast<double>((color >>  8) & 0xFF) / static_cast<double>(255);
395		result.y = static_cast<double>((color >> 16) & 0xFF) / static_cast<double>(255);
396		result.z = static_cast<double>((color >> 24) & 0xFF) / static_cast<double>(255);
397		return result;
398	}
399
400	template <>
401	GLM_FUNC_QUALIFIER detail::tvec3<double> f64_bgrx_cast<uint32>(uint32 color)
402	{
403		detail::tvec3<double> result;
404		result.x = static_cast<double>((color >> 16) & 0xFF) / static_cast<double>(255);
405		result.y = static_cast<double>((color >>  8) & 0xFF) / static_cast<double>(255);
406		result.z = static_cast<double>((color >>  0) & 0xFF) / static_cast<double>(255);
407		return result;
408	}
409
410	template <>
411	GLM_FUNC_QUALIFIER detail::tvec3<double> f64_xbgr_cast<uint32>(uint32 color)
412	{
413		detail::tvec3<double> result;
414		result.x = static_cast<double>((color >> 24) & 0xFF) / static_cast<double>(255);
415		result.y = static_cast<double>((color >> 16) & 0xFF) / static_cast<double>(255);
416		result.z = static_cast<double>((color >>  8) & 0xFF) / static_cast<double>(255);
417		return result;
418	}
419
420	template <>
421	GLM_FUNC_QUALIFIER detail::tvec4<double> f64_rgba_cast<uint32>(uint32 color)
422	{
423		detail::tvec4<double> result;
424		result.x = static_cast<double>((color >>  0) & 0xFF) / static_cast<double>(255);
425		result.y = static_cast<double>((color >>  8) & 0xFF) / static_cast<double>(255);
426		result.z = static_cast<double>((color >> 16) & 0xFF) / static_cast<double>(255);
427		result.w = static_cast<double>((color >> 24) & 0xFF) / static_cast<double>(255);
428		return result;
429	}
430
431	template <>
432	GLM_FUNC_QUALIFIER detail::tvec4<double> f64_argb_cast<uint32>(uint32 color)
433	{
434		detail::tvec4<double> result;
435		result.x = static_cast<double>((color >>  8) & 0xFF) / static_cast<double>(255);
436		result.y = static_cast<double>((color >> 16) & 0xFF) / static_cast<double>(255);
437		result.z = static_cast<double>((color >> 24) & 0xFF) / static_cast<double>(255);
438		result.w = static_cast<double>((color >>  0) & 0xFF) / static_cast<double>(255);
439		return result;
440	}
441
442	template <>
443	GLM_FUNC_QUALIFIER detail::tvec4<double> f64_bgra_cast<uint32>(uint32 color)
444	{
445		detail::tvec4<double> result;
446		result.x = static_cast<double>((color >> 16) & 0xFF) / static_cast<double>(255);
447		result.y = static_cast<double>((color >>  8) & 0xFF) / static_cast<double>(255);
448		result.z = static_cast<double>((color >>  0) & 0xFF) / static_cast<double>(255);
449		result.w = static_cast<double>((color >> 24) & 0xFF) / static_cast<double>(255);
450		return result;
451	}
452
453	template <>
454	GLM_FUNC_QUALIFIER detail::tvec4<double> f64_abgr_cast<uint32>(uint32 color)
455	{
456		detail::tvec4<double> result;
457		result.x = static_cast<double>((color >> 24) & 0xFF) / static_cast<double>(255);
458		result.y = static_cast<double>((color >> 16) & 0xFF) / static_cast<double>(255);
459		result.z = static_cast<double>((color >>  8) & 0xFF) / static_cast<double>(255);
460		result.w = static_cast<double>((color >>  0) & 0xFF) / static_cast<double>(255);
461		return result;
462	}
463
464	template <>
465	GLM_FUNC_QUALIFIER detail::half f16_channel_cast<uint16>(uint16 color)
466	{
467		return detail::half(static_cast<float>(color >>  0) / static_cast<float>(65535));
468	}
469
470	template <>
471	GLM_FUNC_QUALIFIER detail::tvec3<detail::half> f16_rgbx_cast<uint64>(uint64 color)
472	{
473		detail::tvec3<detail::half> result;
474		result.x = detail::half(static_cast<float>((color >>  0) & 0xFFFF) / static_cast<float>(65535));
475		result.y = detail::half(static_cast<float>((color >> 16) & 0xFFFF) / static_cast<float>(65535));
476		result.z = detail::half(static_cast<float>((color >> 32) & 0xFFFF) / static_cast<float>(65535));
477		return result;
478	}
479
480	template <>
481	GLM_FUNC_QUALIFIER detail::tvec3<detail::half> f16_xrgb_cast<uint64>(uint64 color)
482	{
483		detail::tvec3<detail::half> result;
484		result.x = detail::half(static_cast<float>((color >> 16) & 0xFFFF) / static_cast<float>(65535));
485		result.y = detail::half(static_cast<float>((color >> 32) & 0xFFFF) / static_cast<float>(65535));
486		result.z = detail::half(static_cast<float>((color >> 48) & 0xFFFF) / static_cast<float>(65535));
487		return result;
488	}
489
490	template <>
491	GLM_FUNC_QUALIFIER detail::tvec3<detail::half> f16_bgrx_cast<uint64>(uint64 color)
492	{
493		detail::tvec3<detail::half> result;
494		result.x = detail::half(static_cast<float>((color >> 32) & 0xFFFF) / static_cast<float>(65535));
495		result.y = detail::half(static_cast<float>((color >> 16) & 0xFFFF) / static_cast<float>(65535));
496		result.z = detail::half(static_cast<float>((color >>  0) & 0xFFFF) / static_cast<float>(65535));
497		return result;
498	}
499
500	template <>
501	GLM_FUNC_QUALIFIER detail::tvec3<detail::half> f16_xbgr_cast<uint64>(uint64 color)
502	{
503		detail::tvec3<detail::half> result;
504		result.x = detail::half(static_cast<float>((color >> 48) & 0xFFFF) / static_cast<float>(65535));
505		result.y = detail::half(static_cast<float>((color >> 32) & 0xFFFF) / static_cast<float>(65535));
506		result.z = detail::half(static_cast<float>((color >> 16) & 0xFFFF) / static_cast<float>(65535));
507		return result;
508	}
509
510	template <>
511	GLM_FUNC_QUALIFIER detail::tvec4<detail::half> f16_rgba_cast<uint64>(uint64 color)
512	{
513		detail::tvec4<detail::half> result;
514		result.x = detail::half(static_cast<float>((color >>  0) & 0xFFFF) / static_cast<float>(65535));
515		result.y = detail::half(static_cast<float>((color >> 16) & 0xFFFF) / static_cast<float>(65535));
516		result.z = detail::half(static_cast<float>((color >> 32) & 0xFFFF) / static_cast<float>(65535));
517		result.w = detail::half(static_cast<float>((color >> 48) & 0xFFFF) / static_cast<float>(65535));
518		return result;
519	}
520
521	template <>
522	GLM_FUNC_QUALIFIER detail::tvec4<detail::half> f16_argb_cast<uint64>(uint64 color)
523	{
524		detail::tvec4<detail::half> result;
525		result.x = detail::half(static_cast<float>((color >> 16) & 0xFFFF) / static_cast<float>(65535));
526		result.y = detail::half(static_cast<float>((color >> 32) & 0xFFFF) / static_cast<float>(65535));
527		result.z = detail::half(static_cast<float>((color >> 48) & 0xFFFF) / static_cast<float>(65535));
528		result.w = detail::half(static_cast<float>((color >>  0) & 0xFFFF) / static_cast<float>(65535));
529		return result;
530	}
531
532	template <>
533	GLM_FUNC_QUALIFIER detail::tvec4<detail::half> f16_bgra_cast<uint64>(uint64 color)
534	{
535		detail::tvec4<detail::half> result;
536		result.x = detail::half(static_cast<float>((color >> 32) & 0xFFFF) / static_cast<float>(65535));
537		result.y = detail::half(static_cast<float>((color >> 16) & 0xFFFF) / static_cast<float>(65535));
538		result.z = detail::half(static_cast<float>((color >>  0) & 0xFFFF) / static_cast<float>(65535));
539		result.w = detail::half(static_cast<float>((color >> 48) & 0xFFFF) / static_cast<float>(65535));
540		return result;
541	}
542
543	template <>
544	GLM_FUNC_QUALIFIER detail::tvec4<detail::half> f16_abgr_cast<uint64>(uint64 color)
545	{
546		detail::tvec4<detail::half> result;
547		result.x = detail::half(static_cast<float>((color >> 48) & 0xFFFF) / static_cast<float>(65535));
548		result.y = detail::half(static_cast<float>((color >> 32) & 0xFFFF) / static_cast<float>(65535));
549		result.z = detail::half(static_cast<float>((color >> 16) & 0xFFFF) / static_cast<float>(65535));
550		result.w = detail::half(static_cast<float>((color >>  0) & 0xFFFF) / static_cast<float>(65535));
551		return result;
552	}
553
554	template <>
555	GLM_FUNC_QUALIFIER float f32_channel_cast<uint16>(uint16 color)
556	{
557		return static_cast<float>(color >>  0) / static_cast<float>(65535);
558	}
559
560	template <>
561	GLM_FUNC_QUALIFIER detail::tvec3<float> f32_rgbx_cast<uint64>(uint64 color)
562	{
563		detail::tvec3<float> result;
564		result.x = static_cast<float>((color >>  0) & 0xFFFF) / static_cast<float>(65535);
565		result.y = static_cast<float>((color >> 16) & 0xFFFF) / static_cast<float>(65535);
566		result.z = static_cast<float>((color >> 32) & 0xFFFF) / static_cast<float>(65535);
567		return result;
568	}
569
570	template <>
571	GLM_FUNC_QUALIFIER detail::tvec3<float> f32_xrgb_cast<uint64>(uint64 color)
572	{
573		detail::tvec3<float> result;
574		result.x = static_cast<float>((color >> 16) & 0xFFFF) / static_cast<float>(65535);
575		result.y = static_cast<float>((color >> 32) & 0xFFFF) / static_cast<float>(65535);
576		result.z = static_cast<float>((color >> 48) & 0xFFFF) / static_cast<float>(65535);
577		return result;
578	}
579
580	template <>
581	GLM_FUNC_QUALIFIER detail::tvec3<float> f32_bgrx_cast<uint64>(uint64 color)
582	{
583		detail::tvec3<float> result;
584		result.x = static_cast<float>((color >> 32) & 0xFFFF) / static_cast<float>(65535);
585		result.y = static_cast<float>((color >> 16) & 0xFFFF) / static_cast<float>(65535);
586		result.z = static_cast<float>((color >>  0) & 0xFFFF) / static_cast<float>(65535);
587		return result;
588	}
589
590	template <>
591	GLM_FUNC_QUALIFIER detail::tvec3<float> f32_xbgr_cast<uint64>(uint64 color)
592	{
593		detail::tvec3<float> result;
594		result.x = static_cast<float>((color >> 48) & 0xFFFF) / static_cast<float>(65535);
595		result.y = static_cast<float>((color >> 32) & 0xFFFF) / static_cast<float>(65535);
596		result.z = static_cast<float>((color >> 16) & 0xFFFF) / static_cast<float>(65535);
597		return result;
598	}
599
600	template <>
601	GLM_FUNC_QUALIFIER detail::tvec4<float> f32_rgba_cast<uint64>(uint64 color)
602	{
603		detail::tvec4<float> result;
604		result.x = static_cast<float>((color >>  0) & 0xFFFF) / static_cast<float>(65535);
605		result.y = static_cast<float>((color >> 16) & 0xFFFF) / static_cast<float>(65535);
606		result.z = static_cast<float>((color >> 32) & 0xFFFF) / static_cast<float>(65535);
607		result.w = static_cast<float>((color >> 48) & 0xFFFF) / static_cast<float>(65535);
608		return result;
609	}
610
611	template <>
612	GLM_FUNC_QUALIFIER detail::tvec4<float> f32_argb_cast<uint64>(uint64 color)
613	{
614		detail::tvec4<float> result;
615		result.x = static_cast<float>((color >> 16) & 0xFFFF) / static_cast<float>(65535);
616		result.y = static_cast<float>((color >> 32) & 0xFFFF) / static_cast<float>(65535);
617		result.z = static_cast<float>((color >> 48) & 0xFFFF) / static_cast<float>(65535);
618		result.w = static_cast<float>((color >>  0) & 0xFFFF) / static_cast<float>(65535);
619		return result;
620	}
621
622	template <>
623	GLM_FUNC_QUALIFIER detail::tvec4<float> f32_bgra_cast<uint64>(uint64 color)
624	{
625		detail::tvec4<float> result;
626		result.x = static_cast<float>((color >> 32) & 0xFFFF) / static_cast<float>(65535);
627		result.y = static_cast<float>((color >> 16) & 0xFFFF) / static_cast<float>(65535);
628		result.z = static_cast<float>((color >>  0) & 0xFFFF) / static_cast<float>(65535);
629		result.w = static_cast<float>((color >> 48) & 0xFFFF) / static_cast<float>(65535);
630		return result;
631	}
632
633	template <>
634	GLM_FUNC_QUALIFIER detail::tvec4<float> f32_abgr_cast<uint64>(uint64 color)
635	{
636		detail::tvec4<float> result;
637		result.x = static_cast<float>((color >> 48) & 0xFFFF) / static_cast<float>(65535);
638		result.y = static_cast<float>((color >> 32) & 0xFFFF) / static_cast<float>(65535);
639		result.z = static_cast<float>((color >> 16) & 0xFFFF) / static_cast<float>(65535);
640		result.w = static_cast<float>((color >>  0) & 0xFFFF) / static_cast<float>(65535);
641		return result;
642	}
643
644	template <>
645	GLM_FUNC_QUALIFIER double f64_channel_cast<uint16>(uint16 color)
646	{
647		return static_cast<double>(color >>  0) / static_cast<double>(65535);
648	}
649
650	template <>
651	GLM_FUNC_QUALIFIER detail::tvec3<double> f64_rgbx_cast<uint64>(uint64 color)
652	{
653		detail::tvec3<double> result;
654		result.x = static_cast<double>((color >>  0) & 0xFFFF) / static_cast<double>(65535);
655		result.y = static_cast<double>((color >> 16) & 0xFFFF) / static_cast<double>(65535);
656		result.z = static_cast<double>((color >> 32) & 0xFFFF) / static_cast<double>(65535);
657		return result;
658	}
659
660	template <>
661	GLM_FUNC_QUALIFIER detail::tvec3<double> f64_xrgb_cast<uint64>(uint64 color)
662	{
663		detail::tvec3<double> result;
664		result.x = static_cast<double>((color >> 16) & 0xFFFF) / static_cast<double>(65535);
665		result.y = static_cast<double>((color >> 32) & 0xFFFF) / static_cast<double>(65535);
666		result.z = static_cast<double>((color >> 48) & 0xFFFF) / static_cast<double>(65535);
667		return result;
668	}
669
670	template <>
671	GLM_FUNC_QUALIFIER detail::tvec3<double> f64_bgrx_cast<uint64>(uint64 color)
672	{
673		detail::tvec3<double> result;
674		result.x = static_cast<double>((color >> 32) & 0xFFFF) / static_cast<double>(65535);
675		result.y = static_cast<double>((color >> 16) & 0xFFFF) / static_cast<double>(65535);
676		result.z = static_cast<double>((color >>  0) & 0xFFFF) / static_cast<double>(65535);
677		return result;
678	}
679
680	template <>
681	GLM_FUNC_QUALIFIER detail::tvec3<double> f64_xbgr_cast<uint64>(uint64 color)
682	{
683		detail::tvec3<double> result;
684		result.x = static_cast<double>((color >> 48) & 0xFFFF) / static_cast<double>(65535);
685		result.y = static_cast<double>((color >> 32) & 0xFFFF) / static_cast<double>(65535);
686		result.z = static_cast<double>((color >> 16) & 0xFFFF) / static_cast<double>(65535);
687		return result;
688	}
689
690	template <>
691	GLM_FUNC_QUALIFIER detail::tvec4<double> f64_rgba_cast<uint64>(uint64 color)
692	{
693		detail::tvec4<double> result;
694		result.x = static_cast<double>((color >>  0) & 0xFFFF) / static_cast<double>(65535);
695		result.y = static_cast<double>((color >> 16) & 0xFFFF) / static_cast<double>(65535);
696		result.z = static_cast<double>((color >> 32) & 0xFFFF) / static_cast<double>(65535);
697		result.w = static_cast<double>((color >> 48) & 0xFFFF) / static_cast<double>(65535);
698		return result;
699	}
700
701	template <>
702	GLM_FUNC_QUALIFIER detail::tvec4<double> f64_argb_cast<uint64>(uint64 color)
703	{
704		detail::tvec4<double> result;
705		result.x = static_cast<double>((color >> 16) & 0xFFFF) / static_cast<double>(65535);
706		result.y = static_cast<double>((color >> 32) & 0xFFFF) / static_cast<double>(65535);
707		result.z = static_cast<double>((color >> 48) & 0xFFFF) / static_cast<double>(65535);
708		result.w = static_cast<double>((color >>  0) & 0xFFFF) / static_cast<double>(65535);
709		return result;
710	}
711
712	template <>
713	GLM_FUNC_QUALIFIER detail::tvec4<double> f64_bgra_cast<uint64>(uint64 color)
714	{
715		detail::tvec4<double> result;
716		result.x = static_cast<double>((color >> 32) & 0xFFFF) / static_cast<double>(65535);
717		result.y = static_cast<double>((color >> 16) & 0xFFFF) / static_cast<double>(65535);
718		result.z = static_cast<double>((color >>  0) & 0xFFFF) / static_cast<double>(65535);
719		result.w = static_cast<double>((color >> 48) & 0xFFFF) / static_cast<double>(65535);
720		return result;
721	}
722
723	template <>
724	GLM_FUNC_QUALIFIER detail::tvec4<double> f64_abgr_cast<uint64>(uint64 color)
725	{
726		detail::tvec4<double> result;
727		result.x = static_cast<double>((color >> 48) & 0xFFFF) / static_cast<double>(65535);
728		result.y = static_cast<double>((color >> 32) & 0xFFFF) / static_cast<double>(65535);
729		result.z = static_cast<double>((color >> 16) & 0xFFFF) / static_cast<double>(65535);
730		result.w = static_cast<double>((color >>  0) & 0xFFFF) / static_cast<double>(65535);
731		return result;
732	}
733}//namespace glm
734