GLM is a header only library. Hence, there is nothing to build to use it. To use GLM, merely include <glm/glm.hpp> header. This include provides all the GLSL features implemented by GLM.
@ -166,7 +166,7 @@ Core GLM features can be included using individual headers to allow faster user
#include<glm/vector_relational.hpp> // all the GLSL vector relational functions
```
### 1.2. Faster program compilation <aname="section1_2"></a>
### <aname="section1_2"></a> 1.2. Faster program compilation
GLM is a header only library that makes a heavy usage of C++ templates.
This design may significantly increase the compile time for files that use GLM. Hence, it is important to limit GLM inclusion to header and source files that actually use it. Likewise, GLM extensions should be
@ -182,7 +182,7 @@ To further help compilation time, GLM 0.9.5 introduced <glm/fwd.hpp> that
#include<glm/glm.hpp>;
```
### 1.3. Use sample of GLM core <aname="section1_3"></a>
### <aname="section1_3"></a> 1.3. Use sample of GLM core
When <glm/glm.hpp> is included, GLM provides all the GLSL features it implements in C++.
@ -215,7 +215,7 @@ GLM is built with a C++ 11 compiler in which case [static\_assert](http://en.cpp
If neither are detected, GLM will rely on its own implementation of static assert.
---
## 2. Swizzle operators <aname="section2"></a>
## <aname="section2"></a> 2. Swizzle operators
A common feature of shader languages like GLSL is the swizzle operators. Those allow selecting multiple components of a vector and change their order. For example, “variable.x”, “variable.xzy” and “variable.zxyy”
form respectively a scalar, a three components vector and a four components vector. With GLSL, swizzle operators can be both R-values and L-values. Finally, vector components can be accessed using “xyzw”,
@ -235,7 +235,7 @@ vec3 C = A.bgr;
GLM supports a subset of this functionality as described in the following sub-sections. Swizzle operators are disabled by default. To enable them GLM\_SWIZZLE must be defined before any inclusion of
<glm/glm.hpp>. Enabling swizzle operators will massively increase the size of compiled files and the compilation time.
### 2.1. Standard C++98 implementation <aname="section2_1"></a>
### <aname="section2_1"></a> 2.1. Standard C++98 implementation
The C++98 implementation exposes the R-value swizzle operators as member functions of vector types.
@ -276,7 +276,7 @@ void foo()
}
```
### 2.2. Anonymous union member implementation <aname="section2_2"></a>
### <aname="section2_2"></a> 2.2. Anonymous union member implementation
Visual C++ supports anonymous structures in union, which is a non-standard language extension, but it enables a very powerful implementation of swizzle operators on Windows supporting both L-value
swizzle operators and a syntax that doesn’t require parentheses in some cases. This implementation is only enabled when the language extension is enabled and GLM\_SWIZZLE is defined.
GLM\_PRECISION\_HIGHP\_UINT: High precision (default)
### 3.2. Compile-time message system <aname="section3_2"></a>
### <aname="section3_2"></a> 3.2. Compile-time message system
GLM includes a notification system which can display some information at build time:
@ -390,7 +390,7 @@ only once per project build.
#include<glm/glm.hpp>
```
### 3.3. C++ language detection <aname="section3_3"></a>
### <aname="section3_3"></a> 3.3. C++ language detection
GLM will automatically take advantage of compilers’ language extensions when enabled. To increase cross platform compatibility and to avoid compiler extensions, a programmer can define GLM\_FORCE\_CXX98 before
any inclusion of <glm/glm.hpp> to restrict the language feature set C++98:
GLM\_FORCE\_CXX14 overrides GLM\_FORCE\_CXX11 and GLM\_FORCE\_CXX11
overrides GLM\_FORCE\_CXX98 defines.
### 3.4. SIMD support <aname="section3_4"></a>
### <aname="section3_4"></a> 3.4. SIMD support
GLM provides some SIMD optimizations based on [compiler intrinsics](https://msdn.microsoft.com/en-us/library/26td21ds.aspx).
These optimizations will be automatically thanks to compiler arguments.
@ -440,7 +440,7 @@ The use of intrinsic functions by GLM implementation can be avoided using the de
Additionally, GLM provides a low level SIMD API in glm/simd directory for users who are really interested in writing fast algorithms.
### 3.5. Force inline <aname="section3_5"></a>
### <aname="section3_5"></a> 3.5. Force inline
To push further the software performance, a programmer can define GLM\_FORCE\_INLINE before any inclusion of <glm/glm.hpp> to force the compiler to inline GLM code.
@ -449,7 +449,7 @@ To push further the software performance, a programmer can define GLM\_FORCE\_IN
#include<glm/glm.hpp>
```
### 3.6. Vector and matrix static size <aname="section3_6"></a>
### <aname="section3_6"></a> 3.6. Vector and matrix static size
GLSL supports the member function .length() for all vector and matrix types.
By default and following GLSL specifications, vector and matrix default constructors initialize the components to zero. This is a reliable behavior but initialization has a cost and it’s not always necessary.
This behavior can be disable at compilation time by define GLM\_FORCE\_NO\_CTOR\_INIT before any inclusion of <glm/glm.hpp> or other GLM include.
However, defining GLM\_FORCE\_UNRESTRICTED\_GENTYPE is not compatible with GLM\_FORCE\_SWIZZLE and will generate a compilation error if both are defined at the same time.
---
## 4. Stable extensions <aname="section4"></a>
## <aname="section4"></a> 4. Stable extensions
GLM extends the core GLSL feature set with extensions. These extensions include: quaternion, transformation, spline, matrix inverse, color spaces, etc.
@ -605,61 +605,61 @@ int foo()
When an extension is included, all the dependent core functionalities and extensions will be included as well.
Convert scalar and vector types to and from packed formats, saving space at the cost of precision. However, packing a value into a format that it was previously unpacked from is guaranteed to be lossless.
<glm/gtc/packing.hpp> need to be included to use these features.
Facilitate interactions between pointers to basic types (e.g. float*) and GLM types (e.g. mat4).
@ -878,22 +878,22 @@ implicit cast in this example. However cast operators may produce programs runni
<glm/gtc/type\_ptr.hpp> need to be included to use these features.
### 4.20. GLM\_GTC\_ulp <aname="section4_20"></a>
### <aname="section4_20"></a> 4.20. GLM\_GTC\_ulp
Measure a function's accuracy given a reference implementation of it. This extension works on floating-point data and provides results in [ULP](http://ljk.imag.fr/membres/Carine.Lucas/TPScilab/JMMuller/ulp-toms.pdf).
<glm/gtc/ulp.hpp> need to be included to use these features.
### 5.1. GLM replacements for deprecated OpenGL functions <aname="section5_1"></a>
### <aname="section5_1"></a> 5.1. GLM replacements for deprecated OpenGL functions
OpenGL 3.1 specification has deprecated some features that have been removed from OpenGL 3.2 core profile specification. GLM provides some replacement functions.
From GLM\_GTC\_matrix\_transform extension: <glm/gtc/matrix\_transform.hpp>
---
## 6. Known issues <aname="section6"></a>
## <aname="section6"></a> 6. Known issues
This section reports GLSL features that GLM can't accurately emulate due to language restrictions.
### 6.1. not function <aname="section6_1"></a>
### <aname="section6_1"></a> 6.1. not function
The GLSL function 'not' is a keyword in C++. To prevent name collisions and ensure a consistent API, the name not\_ (note the underscore) is used instead.
### 6.2. Precision qualifiers support <aname="section6_2"></a>
### <aname="section6_2"></a> 6.2. Precision qualifiers support
GLM supports GLSL precision qualifiers through prefixes instead of qualifiers. For example, GLM exposes \verb|lowp_vec4|, \verb|mediump_vec4| and \verb|highp_vec4| as variations of \verb|vec4|.
@ -1078,22 +1078,22 @@ ivec3 foo(const vec4 & v)
The syntax for default precision specifications in GLM differs from that in GLSL; for more information, see section Default Precision <aname="section3_1"></a>.
---
## 7. FAQ <aname="section7"></a>
## <aname="section7"></a> 7. FAQ
### 7.1 Why GLM follows GLSL specification and conventions? <aname="section7_1"></a>
### <aname="section7_1"></a> 7.1 Why GLM follows GLSL specification and conventions?
Following GLSL conventions is a really strict policy of GLM. It has been designed following the idea that everyone does its own math library with his own conventions. The idea is that brilliant developers (the OpenGL ARB) worked together and agreed to make GLSL. Following GLSL conventions
is a way to find consensus. Moreover, basically when a developer knows GLSL, he knows GLM.
### 7.2. Does GLM run GLSL program? <aname="section7_2"></a>
### <aname="section7_2"></a> 7.2. Does GLM run GLSL program?
No, GLM is a C++ implementation of a subset of GLSL.
### 7.3. Does a GLSL compiler build GLM codes? <aname="section7_3"></a>
### <aname="section7_3"></a> 7.3. Does a GLSL compiler build GLM codes?
No, this is not what GLM attends to do.
### 7.4. Should I use ‘GTX’ extensions? <aname="section7_4"></a>
### <aname="section7_4"></a> 7.4. Should I use ‘GTX’ extensions?
GTX extensions are qualified to be experimental extensions. In GLM this means that these extensions might change from version to version without any restriction. In practice, it doesn’t really change except time to
time. GTC extensions are stabled, tested and perfectly reliable in time. Many GTX extensions extend GTC extensions and provide a way to explore features and implementations and APIs and then are promoted to GTC
@ -1101,21 +1101,21 @@ extensions. This is fairly the way OpenGL features are developed; through extens
Stating with GLM 0.9.9, to use experimental extensions, an application but define GLM_ENABLE_EXPERIMENTAL.
### 7.5. Where can I ask my questions? <aname="section7_5"></a>
### <aname="section7_5"></a> 7.5. Where can I ask my questions?
A good place is [stackoverflow](http://stackoverflow.com/search?q=GLM) using the GLM tag.
### 7.6. Where can I find the documentation of extensions? <aname="section7_6"></a>
### <aname="section7_6"></a> 7.6. Where can I find the documentation of extensions?
The Doxygen generated documentation includes a complete list of all extensions available. Explore this [*API documentation*](http://glm.g-truc.net/html/index.html) to get a complete
view of all GLM capabilities!
### 7.7. Should I use ‘using namespace glm;’? <aname="section7_7"></a>
### <aname="section7_7"></a> 7.7. Should I use ‘using namespace glm;’?
NO! Chances are that if using namespace glm; is called, especially in a header file, name collisions will happen as GLM is based on GLSL which uses common tokens for types and functions. Avoiding using namespace
glm; will a higher compatibility with third party library and SDKs.
### 7.8. Is GLM fast? <aname="section7_8"></a>
### <aname="section7_8"></a> 7.8. Is GLM fast?
GLM is mainly designed to be convenient and that's why it is written against the GLSL specification.
@ -1124,26 +1124,26 @@ mediump and highp qualifiers, GLM provides approximations which trade precision
However, on performance critical code paths, we should expect that dedicated algorithms should be written to reach peak performance.
### 7.9. When I build with Visual C++ with /W4 warning level, I have warnings... <aname="section7_9"></a>
### <aname="section7_9"></a> 7.9. When I build with Visual C++ with /W4 warning level, I have warnings...
You should not have any warnings even in /W4 mode. However, if you expect such level for your code, then you should ask for the same level to the compiler by at least disabling the Visual C++ language extensions
(/Za) which generates warnings when used. If these extensions are enabled, then GLM will take advantage of them and the compiler will generate warnings.
### 7.10. Why some GLM functions can crash because of division by zero? <aname="section7_10"></a>
### <aname="section7_10"></a> 7.10. Why some GLM functions can crash because of division by zero?
GLM functions crashing is the result of a domain error. Such behavior follows the precedent set by C and C++'s standard library. For example, it’s a domain error to pass a null vector (all zeroes) to glm::normalize function, or to pass a negative number into std::sqrt.
### 7.11. What unit for angles is used in GLM? <aname="section7_11"></a>
### <aname="section7_11"></a> 7.11. What unit for angles is used in GLM?
GLSL is using radians but GLU is using degrees to express angles. This has caused GLM to use inconsistent units for angles. Starting with GLM 0.9.6, all GLM functions are using radians. For more information, follow
the [link](http://www.g-truc.net/post-0693.html#menu).
---
## 8. Code samples <aname="section8"></a>
## <aname="section8"></a> 8. Code samples
This series of samples only shows various GLM features without consideration of any sort.
### 8.1. Compute a triangle normal <aname="section8_1"></a>
### <aname="section8_1"></a> 8.1. Compute a triangle normal