1///////////////////////////////////////////////////////////////////////////////////
2/// OpenGL Mathematics (glm.g-truc.net)
3///
4/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)
5/// Permission is hereby granted, free of charge, to any person obtaining a copy
6/// of this software and associated documentation files (the "Software"), to deal
7/// in the Software without restriction, including without limitation the rights
8/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9/// copies of the Software, and to permit persons to whom the Software is
10/// furnished to do so, subject to the following conditions:
11///
12/// The above copyright notice and this permission notice shall be included in
13/// all copies or substantial portions of the Software.
14///
15/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21/// THE SOFTWARE.
22///
23/// @ref gtc_packing
24/// @file glm/gtc/packing.hpp
25/// @date 2013-08-08 / 2013-08-08
26/// @author Christophe Riccio
27///
28/// @see core (dependence)
29///
30/// @defgroup gtc_packing GLM_GTC_packing
31/// @ingroup gtc
32///
33/// @brief This extension provides a set of function to convert vertors to packed
34/// formats.
35///
36/// <glm/gtc/packing.hpp> need to be included to use these features.
37///////////////////////////////////////////////////////////////////////////////////
38
39#ifndef GLM_GTC_packing
40#define GLM_GTC_packing
41
42// Dependency:
43#include "type_precision.hpp"
44
45#if(defined(GLM_MESSAGES) && !defined(GLM_EXT_INCLUDED))
46#	pragma message("GLM: GLM_GTC_packing extension included")
47#endif
48
49namespace glm
50{
51	/// @addtogroup gtc_packing
52	/// @{
53
54	/// First, converts the normalized floating-point value v into a 8-bit integer value.
55	/// Then, the results are packed into the returned 8-bit unsigned integer.
56	///
57	/// The conversion for component c of v to fixed point is done as follows:
58	/// packUnorm1x8:	round(clamp(c, 0, +1) * 255.0)
59	///
60	/// @see gtc_packing
61	/// @see uint16 packUnorm2x8(vec2 const & v)
62	/// @see uint32 packUnorm4x8(vec4 const & v)
63	/// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/packUnorm4x8.xml">GLSL packUnorm4x8 man page</a>
64	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions</a>
65	GLM_FUNC_DECL uint8 packUnorm1x8(float const & v);
66
67	/// Convert a single 8-bit integer to a normalized floating-point value.
68	///
69	/// The conversion for unpacked fixed-point value f to floating point is done as follows:
70	/// unpackUnorm4x8: f / 255.0
71	///
72	/// @see gtc_packing
73	/// @see vec2 unpackUnorm2x8(uint16 p)
74	/// @see vec4 unpackUnorm4x8(uint32 p)
75	/// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/unpackUnorm4x8.xml">GLSL unpackUnorm4x8 man page</a>
76	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions</a>
77	GLM_FUNC_DECL float unpackUnorm1x8(uint8 const & p);
78
79	/// First, converts each component of the normalized floating-point value v into 8-bit integer values.
80	/// Then, the results are packed into the returned 16-bit unsigned integer.
81	///
82	/// The conversion for component c of v to fixed point is done as follows:
83	/// packUnorm2x8:	round(clamp(c, 0, +1) * 255.0)
84	///
85	/// The first component of the vector will be written to the least significant bits of the output;
86	/// the last component will be written to the most significant bits.
87	///
88	/// @see gtc_packing
89	/// @see uint8 packUnorm1x8(float const & v)
90	/// @see uint32 packUnorm4x8(vec4 const & v)
91	/// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/packUnorm4x8.xml">GLSL packUnorm4x8 man page</a>
92	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions</a>
93	GLM_FUNC_DECL uint16 packUnorm2x8(vec2 const & v);
94
95	/// First, unpacks a single 16-bit unsigned integer p into a pair of 8-bit unsigned integers.
96	/// Then, each component is converted to a normalized floating-point value to generate the returned two-component vector.
97	///
98	/// The conversion for unpacked fixed-point value f to floating point is done as follows:
99	/// unpackUnorm4x8: f / 255.0
100	///
101	/// The first component of the returned vector will be extracted from the least significant bits of the input;
102	/// the last component will be extracted from the most significant bits.
103	///
104	/// @see gtc_packing
105	/// @see float unpackUnorm1x8(uint8 v)
106	/// @see vec4 unpackUnorm4x8(uint32 p)
107	/// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/unpackUnorm4x8.xml">GLSL unpackUnorm4x8 man page</a>
108	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions</a>
109	GLM_FUNC_DECL vec2 unpackUnorm2x8(uint16 const & p);
110
111	/// First, converts the normalized floating-point value v into 8-bit integer value.
112	/// Then, the results are packed into the returned 8-bit unsigned integer.
113	///
114	/// The conversion to fixed point is done as follows:
115	/// packSnorm1x8:	round(clamp(s, -1, +1) * 127.0)
116	///
117	/// @see gtc_packing
118	/// @see uint16 packSnorm2x8(vec2 const & v)
119	/// @see uint32 packSnorm4x8(vec4 const & v)
120	/// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/packSnorm4x8.xml">GLSL packSnorm4x8 man page</a>
121	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions</a>
122	GLM_FUNC_DECL uint8 packSnorm1x8(float const & s);
123
124	/// First, unpacks a single 8-bit unsigned integer p into a single 8-bit signed integers.
125	/// Then, the value is converted to a normalized floating-point value to generate the returned scalar.
126	///
127	/// The conversion for unpacked fixed-point value f to floating point is done as follows:
128	/// unpackSnorm1x8: clamp(f / 127.0, -1, +1)
129	///
130	/// @see gtc_packing
131	/// @see vec2 unpackSnorm2x8(uint16 p)
132	/// @see vec4 unpackSnorm4x8(uint32 p)
133	/// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/unpackSnorm4x8.xml">GLSL unpackSnorm4x8 man page</a>
134	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions</a>
135	GLM_FUNC_DECL float unpackSnorm1x8(uint8 const & p);
136
137	/// First, converts each component of the normalized floating-point value v into 8-bit integer values.
138	/// Then, the results are packed into the returned 16-bit unsigned integer.
139	///
140	/// The conversion for component c of v to fixed point is done as follows:
141	/// packSnorm2x8:	round(clamp(c, -1, +1) * 127.0)
142	///
143	/// The first component of the vector will be written to the least significant bits of the output;
144	/// the last component will be written to the most significant bits.
145	///
146	/// @see gtc_packing
147	/// @see uint8 packSnorm1x8(float const & v)
148	/// @see uint32 packSnorm4x8(vec4 const & v)
149	/// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/packSnorm4x8.xml">GLSL packSnorm4x8 man page</a>
150	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions</a>
151	GLM_FUNC_DECL uint16 packSnorm2x8(vec2 const & v);
152
153	/// First, unpacks a single 16-bit unsigned integer p into a pair of 8-bit signed integers.
154	/// Then, each component is converted to a normalized floating-point value to generate the returned two-component vector.
155	///
156	/// The conversion for unpacked fixed-point value f to floating point is done as follows:
157	/// unpackSnorm2x8: clamp(f / 127.0, -1, +1)
158	///
159	/// The first component of the returned vector will be extracted from the least significant bits of the input;
160	/// the last component will be extracted from the most significant bits.
161	///
162	/// @see gtc_packing
163	/// @see float unpackSnorm1x8(uint8 p)
164	/// @see vec4 unpackSnorm4x8(uint32 p)
165	/// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/unpackSnorm4x8.xml">GLSL unpackSnorm4x8 man page</a>
166	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions</a>
167	GLM_FUNC_DECL vec2 unpackSnorm2x8(uint16 const & p);
168
169	/// First, converts the normalized floating-point value v into a 16-bit integer value.
170	/// Then, the results are packed into the returned 16-bit unsigned integer.
171	///
172	/// The conversion for component c of v to fixed point is done as follows:
173	/// packUnorm1x16:	round(clamp(c, 0, +1) * 65535.0)
174	///
175	/// @see gtc_packing
176	/// @see uint16 packSnorm1x16(float const & v)
177	/// @see uint64 packSnorm4x16(vec4 const & v)
178	/// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/packUnorm4x8.xml">GLSL packUnorm4x8 man page</a>
179	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions</a>
180	GLM_FUNC_DECL uint16 packUnorm1x16(float const & v);
181
182	/// First, unpacks a single 16-bit unsigned integer p into a of 16-bit unsigned integers.
183	/// Then, the value is converted to a normalized floating-point value to generate the returned scalar.
184	///
185	/// The conversion for unpacked fixed-point value f to floating point is done as follows:
186	/// unpackUnorm1x16: f / 65535.0
187	///
188	/// @see gtc_packing
189	/// @see vec2 unpackUnorm2x16(uint32 p)
190	/// @see vec4 unpackUnorm4x16(uint64 p)
191	/// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/unpackUnorm2x16.xml">GLSL unpackUnorm2x16 man page</a>
192	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions</a>
193	GLM_FUNC_DECL float unpackUnorm1x16(uint16 const & p);
194
195	/// First, converts each component of the normalized floating-point value v into 16-bit integer values.
196	/// Then, the results are packed into the returned 64-bit unsigned integer.
197	///
198	/// The conversion for component c of v to fixed point is done as follows:
199	/// packUnorm4x16:	round(clamp(c, 0, +1) * 65535.0)
200	///
201	/// The first component of the vector will be written to the least significant bits of the output;
202	/// the last component will be written to the most significant bits.
203	///
204	/// @see gtc_packing
205	/// @see uint16 packUnorm1x16(float const & v)
206	/// @see uint32 packUnorm2x16(vec2 const & v)
207	/// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/packUnorm4x8.xml">GLSL packUnorm4x8 man page</a>
208	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions</a>
209	GLM_FUNC_DECL uint64 packUnorm4x16(vec4 const & v);
210
211	/// First, unpacks a single 64-bit unsigned integer p into four 16-bit unsigned integers.
212	/// Then, each component is converted to a normalized floating-point value to generate the returned four-component vector.
213	///
214	/// The conversion for unpacked fixed-point value f to floating point is done as follows:
215	/// unpackUnormx4x16: f / 65535.0
216	///
217	/// The first component of the returned vector will be extracted from the least significant bits of the input;
218	/// the last component will be extracted from the most significant bits.
219	///
220	/// @see gtc_packing
221	/// @see float unpackUnorm1x16(uint16 p)
222	/// @see vec2 unpackUnorm2x16(uint32 p)
223	/// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/unpackUnorm2x16.xml">GLSL unpackUnorm2x16 man page</a>
224	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions</a>
225	GLM_FUNC_DECL vec4 unpackUnorm4x16(uint64 const & p);
226
227	/// First, converts the normalized floating-point value v into 16-bit integer value.
228	/// Then, the results are packed into the returned 16-bit unsigned integer.
229	///
230	/// The conversion to fixed point is done as follows:
231	/// packSnorm1x8:	round(clamp(s, -1, +1) * 32767.0)
232	///
233	/// @see gtc_packing
234	/// @see uint32 packSnorm2x16(vec2 const & v)
235	/// @see uint64 packSnorm4x16(vec4 const & v)
236	/// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/packSnorm4x8.xml">GLSL packSnorm4x8 man page</a>
237	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions</a>
238	GLM_FUNC_DECL uint16 packSnorm1x16(float const & v);
239
240	/// First, unpacks a single 16-bit unsigned integer p into a single 16-bit signed integers.
241	/// Then, each component is converted to a normalized floating-point value to generate the returned scalar.
242	///
243	/// The conversion for unpacked fixed-point value f to floating point is done as follows:
244	/// unpackSnorm1x16: clamp(f / 32767.0, -1, +1)
245	///
246	/// @see gtc_packing
247	/// @see vec2 unpackSnorm2x16(uint32 p)
248	/// @see vec4 unpackSnorm4x16(uint64 p)
249	/// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/unpackSnorm1x16.xml">GLSL unpackSnorm4x8 man page</a>
250	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions</a>
251	GLM_FUNC_DECL float unpackSnorm1x16(uint16 const & p);
252
253	/// First, converts each component of the normalized floating-point value v into 16-bit integer values.
254	/// Then, the results are packed into the returned 64-bit unsigned integer.
255	///
256	/// The conversion for component c of v to fixed point is done as follows:
257	/// packSnorm2x8:	round(clamp(c, -1, +1) * 32767.0)
258	///
259	/// The first component of the vector will be written to the least significant bits of the output;
260	/// the last component will be written to the most significant bits.
261	///
262	/// @see gtc_packing
263	/// @see uint16 packSnorm1x16(float const & v)
264	/// @see uint32 packSnorm2x16(vec2 const & v)
265	/// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/packSnorm4x8.xml">GLSL packSnorm4x8 man page</a>
266	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions</a>
267	GLM_FUNC_DECL uint64 packSnorm4x16(vec4 const & v);
268
269	/// First, unpacks a single 64-bit unsigned integer p into four 16-bit signed integers.
270	/// Then, each component is converted to a normalized floating-point value to generate the returned four-component vector.
271	///
272	/// The conversion for unpacked fixed-point value f to floating point is done as follows:
273	/// unpackSnorm4x16: clamp(f / 32767.0, -1, +1)
274	///
275	/// The first component of the returned vector will be extracted from the least significant bits of the input;
276	/// the last component will be extracted from the most significant bits.
277	///
278	/// @see gtc_packing
279	/// @see float unpackSnorm1x16(uint16 p)
280	/// @see vec2 unpackSnorm2x16(uint32 p)
281	/// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/unpackSnorm2x16.xml">GLSL unpackSnorm4x8 man page</a>
282	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions</a>
283	GLM_FUNC_DECL vec4 unpackSnorm4x16(uint64 const & p);
284
285	/// Returns an unsigned integer obtained by converting the components of a floating-point scalar
286	/// to the 16-bit floating-point representation found in the OpenGL Specification,
287	/// and then packing this 16-bit value into a 16-bit unsigned integer.
288	///
289	/// @see gtc_packing
290	/// @see uint32 packHalf2x16(vec2 const & v)
291	/// @see uint64 packHalf4x16(vec4 const & v)
292	/// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/packHalf2x16.xml">GLSL packHalf2x16 man page</a>
293	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions</a>
294	GLM_FUNC_DECL uint16 packHalf1x16(float const & v);
295
296	/// Returns a floating-point scalar with components obtained by unpacking a 16-bit unsigned integer into a 16-bit value,
297	/// interpreted as a 16-bit floating-point number according to the OpenGL Specification,
298	/// and converting it to 32-bit floating-point values.
299	///
300	/// @see gtc_packing
301	/// @see vec2 unpackHalf2x16(uint32 const & v)
302	/// @see vec4 unpackHalf4x16(uint64 const & v)
303	/// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/unpackHalf2x16.xml">GLSL unpackHalf2x16 man page</a>
304	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions</a>
305	GLM_FUNC_DECL float unpackHalf1x16(uint16 const & v);
306
307	/// Returns an unsigned integer obtained by converting the components of a four-component floating-point vector
308	/// to the 16-bit floating-point representation found in the OpenGL Specification,
309	/// and then packing these four 16-bit values into a 64-bit unsigned integer.
310	/// The first vector component specifies the 16 least-significant bits of the result;
311	/// the forth component specifies the 16 most-significant bits.
312	///
313	/// @see gtc_packing
314	/// @see uint16 packHalf1x16(float const & v)
315	/// @see uint32 packHalf2x16(vec2 const & v)
316	/// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/packHalf2x16.xml">GLSL packHalf2x16 man page</a>
317	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions</a>
318	GLM_FUNC_DECL uint64 packHalf4x16(vec4 const & v);
319
320	/// Returns a four-component floating-point vector with components obtained by unpacking a 64-bit unsigned integer into four 16-bit values,
321	/// interpreting those values as 16-bit floating-point numbers according to the OpenGL Specification,
322	/// and converting them to 32-bit floating-point values.
323	/// The first component of the vector is obtained from the 16 least-significant bits of v;
324	/// the forth component is obtained from the 16 most-significant bits of v.
325	///
326	/// @see gtc_packing
327	/// @see float unpackHalf1x16(uint16 const & v)
328	/// @see vec2 unpackHalf2x16(uint32 const & v)
329	/// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/unpackHalf2x16.xml">GLSL unpackHalf2x16 man page</a>
330	/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions</a>
331	GLM_FUNC_DECL vec4 unpackHalf4x16(uint64 const & p);
332
333	/// Returns an unsigned integer obtained by converting the components of a four-component signed integer vector
334	/// to the 10-10-10-2-bit signed integer representation found in the OpenGL Specification,
335	/// and then packing these four values into a 32-bit unsigned integer.
336	/// The first vector component specifies the 10 least-significant bits of the result;
337	/// the forth component specifies the 2 most-significant bits.
338	///
339	/// @see gtc_packing
340	/// @see uint32 packI3x10_1x2(uvec4 const & v)
341	/// @see uint32 packSnorm3x10_1x2(vec4 const & v)
342	/// @see uint32 packUnorm3x10_1x2(vec4 const & v)
343	/// @see ivec4 unpackI3x10_1x2(uint32 const & p)
344	GLM_FUNC_DECL uint32 packI3x10_1x2(ivec4 const & v);
345
346	/// Unpacks a single 32-bit unsigned integer p into three 10-bit and one 2-bit signed integers.
347	///
348	/// The first component of the returned vector will be extracted from the least significant bits of the input;
349	/// the last component will be extracted from the most significant bits.
350	///
351	/// @see gtc_packing
352	/// @see uint32 packU3x10_1x2(uvec4 const & v)
353	/// @see vec4 unpackSnorm3x10_1x2(uint32 const & p);
354	/// @see uvec4 unpackI3x10_1x2(uint32 const & p);
355	GLM_FUNC_DECL ivec4 unpackI3x10_1x2(uint32 const & p);
356
357	/// Returns an unsigned integer obtained by converting the components of a four-component unsigned integer vector
358	/// to the 10-10-10-2-bit unsigned integer representation found in the OpenGL Specification,
359	/// and then packing these four values into a 32-bit unsigned integer.
360	/// The first vector component specifies the 10 least-significant bits of the result;
361	/// the forth component specifies the 2 most-significant bits.
362	///
363	/// @see gtc_packing
364	/// @see uint32 packI3x10_1x2(ivec4 const & v)
365	/// @see uint32 packSnorm3x10_1x2(vec4 const & v)
366	/// @see uint32 packUnorm3x10_1x2(vec4 const & v)
367	/// @see ivec4 unpackU3x10_1x2(uint32 const & p)
368	GLM_FUNC_DECL uint32 packU3x10_1x2(uvec4 const & v);
369
370	/// Unpacks a single 32-bit unsigned integer p into three 10-bit and one 2-bit unsigned integers.
371	///
372	/// The first component of the returned vector will be extracted from the least significant bits of the input;
373	/// the last component will be extracted from the most significant bits.
374	///
375	/// @see gtc_packing
376	/// @see uint32 packU3x10_1x2(uvec4 const & v)
377	/// @see vec4 unpackSnorm3x10_1x2(uint32 const & p);
378	/// @see uvec4 unpackI3x10_1x2(uint32 const & p);
379	GLM_FUNC_DECL uvec4 unpackU3x10_1x2(uint32 const & p);
380
381	/// First, converts the first three components of the normalized floating-point value v into 10-bit signed integer values.
382	/// Then, converts the forth component of the normalized floating-point value v into 2-bit signed integer values.
383	/// Then, the results are packed into the returned 32-bit unsigned integer.
384	///
385	/// The conversion for component c of v to fixed point is done as follows:
386	/// packSnorm3x10_1x2(xyz):	round(clamp(c, -1, +1) * 511.0)
387	/// packSnorm3x10_1x2(w):	round(clamp(c, -1, +1) * 1.0)
388	///
389	/// The first vector component specifies the 10 least-significant bits of the result;
390	/// the forth component specifies the 2 most-significant bits.
391	///
392	/// @see gtc_packing
393	/// @see vec4 unpackSnorm3x10_1x2(uint32 const & p)
394	/// @see uint32 packUnorm3x10_1x2(vec4 const & v)
395	/// @see uint32 packU3x10_1x2(uvec4 const & v)
396	/// @see uint32 packI3x10_1x2(ivec4 const & v)
397	GLM_FUNC_DECL uint32 packSnorm3x10_1x2(vec4 const & v);
398
399	/// First, unpacks a single 32-bit unsigned integer p into four 16-bit signed integers.
400	/// Then, each component is converted to a normalized floating-point value to generate the returned four-component vector.
401	///
402	/// The conversion for unpacked fixed-point value f to floating point is done as follows:
403	/// unpackSnorm3x10_1x2(xyz): clamp(f / 511.0, -1, +1)
404	/// unpackSnorm3x10_1x2(w): clamp(f / 511.0, -1, +1)
405	///
406	/// The first component of the returned vector will be extracted from the least significant bits of the input;
407	/// the last component will be extracted from the most significant bits.
408	///
409	/// @see gtc_packing
410	/// @see uint32 packSnorm3x10_1x2(vec4 const & v)
411	/// @see vec4 unpackUnorm3x10_1x2(uint32 const & p))
412	/// @see uvec4 unpackI3x10_1x2(uint32 const & p)
413	/// @see uvec4 unpackU3x10_1x2(uint32 const & p)
414	GLM_FUNC_DECL vec4 unpackSnorm3x10_1x2(uint32 const & p);
415
416	/// First, converts the first three components of the normalized floating-point value v into 10-bit unsigned integer values.
417	/// Then, converts the forth component of the normalized floating-point value v into 2-bit signed uninteger values.
418	/// Then, the results are packed into the returned 32-bit unsigned integer.
419	///
420	/// The conversion for component c of v to fixed point is done as follows:
421	/// packUnorm3x10_1x2(xyz):	round(clamp(c, 0, +1) * 1023.0)
422	/// packUnorm3x10_1x2(w):	round(clamp(c, 0, +1) * 3.0)
423	///
424	/// The first vector component specifies the 10 least-significant bits of the result;
425	/// the forth component specifies the 2 most-significant bits.
426	///
427	/// @see gtc_packing
428	/// @see vec4 unpackUnorm3x10_1x2(uint32 const & p)
429	/// @see uint32 packUnorm3x10_1x2(vec4 const & v)
430	/// @see uint32 packU3x10_1x2(uvec4 const & v)
431	/// @see uint32 packI3x10_1x2(ivec4 const & v)
432	GLM_FUNC_DECL uint32 packUnorm3x10_1x2(vec4 const & v);
433
434	/// First, unpacks a single 32-bit unsigned integer p into four 16-bit signed integers.
435	/// Then, each component is converted to a normalized floating-point value to generate the returned four-component vector.
436	///
437	/// The conversion for unpacked fixed-point value f to floating point is done as follows:
438	/// unpackSnorm3x10_1x2(xyz): clamp(f / 1023.0, 0, +1)
439	/// unpackSnorm3x10_1x2(w): clamp(f / 3.0, 0, +1)
440	///
441	/// The first component of the returned vector will be extracted from the least significant bits of the input;
442	/// the last component will be extracted from the most significant bits.
443	///
444	/// @see gtc_packing
445	/// @see uint32 packSnorm3x10_1x2(vec4 const & v)
446	/// @see vec4 unpackInorm3x10_1x2(uint32 const & p))
447	/// @see uvec4 unpackI3x10_1x2(uint32 const & p)
448	/// @see uvec4 unpackU3x10_1x2(uint32 const & p)
449	GLM_FUNC_DECL vec4 unpackUnorm3x10_1x2(uint32 const & p);
450
451	/// First, converts the first two components of the normalized floating-point value v into 11-bit signless floating-point values.
452	/// Then, converts the third component of the normalized floating-point value v into a 10-bit signless floating-point value.
453	/// Then, the results are packed into the returned 32-bit unsigned integer.
454	///
455	/// The first vector component specifies the 11 least-significant bits of the result;
456	/// the last component specifies the 10 most-significant bits.
457	///
458	/// @see gtc_packing
459	/// @see vec3 unpackF2x11_1x10(uint32 const & p)
460	GLM_FUNC_DECL uint32 packF2x11_1x10(vec3 const & v);
461
462	/// First, unpacks a single 32-bit unsigned integer p into two 11-bit signless floating-point values and one 10-bit signless floating-point value .
463	/// Then, each component is converted to a normalized floating-point value to generate the returned three-component vector.
464	///
465	/// The first component of the returned vector will be extracted from the least significant bits of the input;
466	/// the last component will be extracted from the most significant bits.
467	///
468	/// @see gtc_packing
469	/// @see uint32 packF2x11_1x10(vec3 const & v)
470	GLM_FUNC_DECL vec3 unpackF2x11_1x10(uint32 const & p);
471
472	/// @}
473}// namespace glm
474
475#include "packing.inl"
476
477#endif//GLM_GTC_packing
478
479