cglm

[brief]

Highly Optimized Graphics Math (glm) for C


📚 Documentation

All functions and their parameters are documented above their declaration inside their corresponding headers. Alternatively, you can read the complete documentation here.

🔨 Building

cglm can be used in it's entirety as a header-only library simply by including cglm/cglm.h. If you wish to link against it instead, it can be built using one of the supported build systems. Detailed information about building on individual platforms and build systems along with the instructions for building the documentation can be found in BUILDING.md.

✅ Usage

Header-only

Include the cglm/cglm.h header and use functions with the glm_ prefix.

#include "cglm/cglm.h"

// ...

vec2 vector;
glm_vec2_zero(vector);

Struct API

Include cglm/struct.h and use glms_.

#include "cglm/struct.h"

// ...

vec2s vector = glms_vec2_zero();

Linked

Include cglm/call.h and use glmc_.

#include "cglm/call.h"

// ...

vec2 vector;
glmc_vec2_zero(vector);

❗ Alignment

While cglm by default aligns what's necessary, it is possible to disable this by defining CGLM_ALL_UNALIGNED. If you're targeting machines with any kind of SIMD support, make sure that all vec4, mat4 and mat2 arguments you pass to cglm functions are aligned to prevent unexpected crashes, alternatively use the unaligned versions if present.

Struct API

The struct API works as follows (note the s suffix on types, glms_ prefix on functions and GLMS_ on constants):

#include <cglm/struct.h>

mat4s mat = GLMS_MAT4_IDENTITY_INIT;
mat4s inv = glms_mat4_inv(mat);

Struct functions generally take parameters by copy and return the results rather than taking pointers and writing to out parameters. That means your variables can usually be const, if you're into that.

The types used are actually unions that allow access to the same data in multiple ways. One of these involves anonymous structures available since C11. MSVC supports them in earlier versions out of the box and GCC/Clang as well if you enable -fms-extensions. To explicitly enable anonymous structures #define CGLM_USE_ANONYMOUS_STRUCT 1, or 0 to disable them. For backwards compatibility, you can also #define CGLM_NO_ANONYMOUS_STRUCT to disable them. If you don't specify explicitly, cglm will attempt a best guess based on your compiler and C version.

📌 Migration notes:

🚀 Features



cglm contains general purpose mat4 product and inverse functions but also provides optimized versions for affine transformations. If you want to multiply two affine transformation matrices you can use glm_mul instead of glm_mat4_mul and glm_inv_tr (ROT + TR) instead glm_mat4_inv.

/* multiplication */
mat4 modelMat;
glm_mul(T, R, modelMat);

/* othonormal rot + tr matrix inverse (rigid-body) */
glm_inv_tr(modelMat);

Contributors

This project exists thanks to all the people who contribute. [Contribute]

Backers

Thank you to all our backers! 🙏 [Become a backer]

Sponsors

Support this project by becoming a sponsor. Your logo will show up here with a link to your website. [Become a sponsor]

license MIT
project cglm
url github.com/recp/cglm
3 Versions
version 0.9.6
repository https://pkg.cppget.org/1/testing
depends 0
reviews 0
version 0.9.2
repository https://pkg.cppget.org/1/alpha
depends 0
reviews 0
version 0.9.1+9
repository https://pkg.cppget.org/1/alpha
depends 0
reviews 0