README.md
1# glam
2
3[![Build Status]][github-ci] [![Coverage Status]][coveralls.io]
4[![Latest Version]][crates.io] [![docs]][docs.rs]
5[![Minimum Supported Rust Version]][Rust 1.68.2]
6
7A simple and fast 3D math library for games and graphics.
8
9## Development status
10
11`glam` is in beta stage. Base functionality has been implemented and the look
12and feel of the API has solidified.
13
14## Features
15
16* `f32` types
17 * vectors: `Vec2`, `Vec3`, `Vec3A` and `Vec4`
18 * square matrices: `Mat2`, `Mat3`, `Mat3A` and `Mat4`
19 * a quaternion type: `Quat`
20 * affine transformation types: `Affine2` and `Affine3A`
21* `f64` types
22 * vectors: `DVec2`, `DVec3` and `DVec4`
23 * square matrices: `DMat2`, `DMat3` and `DMat4`
24 * a quaternion type: `DQuat`
25 * affine transformation types: `DAffine2` and `DAffine3`
26* `i8` types
27 * vectors: `I8Vec2`, `I8Vec3` and `I8Vec4`
28* `u8` types
29 * vectors: `U16Vec2`, `U16Vec3` and `U16Vec4`
30* `i16` types
31 * vectors: `I16Vec2`, `I16Vec3` and `I16Vec4`
32* `u16` types
33 * vectors: `U16Vec2`, `U16Vec3` and `U16Vec4`
34* `i32` types
35 * vectors: `IVec2`, `IVec3` and `IVec4`
36* `u32` types
37 * vectors: `UVec2`, `UVec3` and `UVec4`
38* `i64` types
39 * vectors: `I64Vec2`, `I64Vec3` and `I64Vec4`
40* `u64` types
41 * vectors: `U64Vec2`, `U64Vec3` and `U64Vec4`
42* `bool` types
43 * vectors: `BVec2`, `BVec3` and `BVec4`
44
45### SIMD
46
47The `Vec3A`, `Vec4`, `Quat`, `Mat2`, `Mat3A`, `Mat4`, `Affine2` and `Affine3A`
48types use 128-bit wide SIMD vector types for storage on `x86`, `x86_64` and
49`wasm32` architectures. As a result, these types are all 16 byte aligned and
50depending on the size of the type or the type's members, they may contain
51internal padding. This results in some wasted space in the cases of `Vec3A`,
52`Mat3A`, `Affine2` and `Affine3A`. However, the use of SIMD generally results
53in better performance than scalar math.
54
55`glam` outperforms similar Rust libraries for common operations as tested by the
56[`mathbench`][mathbench] project.
57
58[mathbench]: https://github.com/bitshifter/mathbench-rs
59
60### Enabling SIMD
61
62SIMD is supported on `x86`, `x86_64` and `wasm32` targets.
63
64* `SSE2` is enabled by default on `x86_64` targets.
65* To enable `SSE2` on `x86` targets add `-C target-feature=+sse2` to
66 `RUSTCFLAGS`.
67* `NEON` is enabled by default on `aarch64` targets.
68* To enable `NEON` on `aarch64` targets add `-C target-feature=+neon` to `RUSTFLAGS`.
69* To enable `simd128` on `wasm32` targets add `-C target-feature=+simd128` to
70 `RUSTFLAGS`.
71* Experimental [portable simd] support can be enabled with the `core-simd`
72 feature. This requires the nightly compiler as it is still unstable in Rust.
73
74Note that SIMD on `wasm32` passes tests but has not been benchmarked,
75performance may or may not be better than scalar math.
76
77[portable simd]: https://doc.rust-lang.org/core/simd/index.html
78
79### `no_std` support
80
81`no_std` support can be enabled by compiling with `--no-default-features` to
82disable `std` support and `--features libm` for math functions that are only
83defined in `std`. For example:
84
85```toml
86[dependencies]
87glam = { version = "0.30.0", default-features = false, features = ["libm"] }
88```
89
90To support both `std` and `no_std` builds in project, you can use the following
91in your `Cargo.toml`:
92
93```toml
94[features]
95default = ["std"]
96
97std = ["glam/std"]
98libm = ["glam/libm"]
99
100[dependencies]
101glam = { version = "0.30.0", default-features = false }
102```
103
104### Optional features
105
106* [`approx`] - traits and macros for approximate float comparisons
107* [`bytemuck`] - for casting into slices of bytes
108* [`libm`] - uses `libm` math functions instead of `std`, required to compile
109 with `no_std`
110* [`mint`] - for interoperating with other 3D math libraries
111* [`rand`] - implementations of `Distribution` trait for all `glam` types.
112* [`serde`] - implementations of `Serialize` and `Deserialize` for all `glam`
113 types. Note that serialization should work between builds of `glam` with and
114 without SIMD enabled
115* [`rkyv`] - implementations of `Archive`, `Serialize` and `Deserialize` for
116 all `glam` types. Note that serialization is not interoperable with and
117 without the `scalar-math` feature. It should work between all other builds of
118 `glam`. Endian conversion is currently not supported
119* [`bytecheck`] - to perform archive validation when using the `rkyv` feature
120
121[`approx`]: https://docs.rs/approx
122[`bytemuck`]: https://docs.rs/bytemuck
123[`libm`]: https://github.com/rust-lang/libm
124[`mint`]: https://github.com/kvark/mint
125[`rand`]: https://github.com/rust-random/rand
126[`serde`]: https://serde.rs
127[`rkyv`]: https://github.com/rkyv/rkyv
128[`bytecheck`]: https://github.com/rkyv/bytecheck
129
130### Feature gates
131
132* `scalar-math` - compiles with SIMD support disabled
133* `debug-glam-assert` - adds assertions in debug builds which check the validity
134 of parameters passed to `glam` to help catch runtime errors
135* `glam-assert` - adds validation assertions to all builds
136* `cuda` - forces `glam` types to match expected [cuda alignment]
137* `fast-math` - By default, glam attempts to provide bit-for-bit identical
138 results on all platforms. Using this feature will enable platform specific
139 optimizations that may not be identical to other platforms. **Intermediate
140 libraries should not use this feature and defer the decision to the final
141 binary build**.
142* `core-simd` - enables SIMD support via the [portable simd] module. This is an
143 unstable feature which requires a nightly Rust toolchain and `std` support.
144
145[cuda alignment]: https://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html#built-in-vector-types
146
147### Minimum Supported Rust Version (MSRV)
148
149The minimum supported version of Rust for `glam` is `1.68.2`.
150
151## Conventions
152
153### Column vectors
154
155`glam` interprets vectors as column matrices (also known as "column vectors")
156meaning when transforming a vector with a matrix the matrix goes on the left,
157e.g. `v' = Mv`. DirectX uses row vectors, OpenGL uses column vectors. There
158are pros and cons to both.
159
160### Column-major order
161
162Matrices are stored in column major format. Each column vector is stored in
163contiguous memory.
164
165### Co-ordinate system
166
167`glam` is co-ordinate system agnostic and intends to support both right-handed
168and left-handed conventions.
169
170## Design Philosophy
171
172The design of this library is guided by a desire for simplicity and good
173performance.
174
175* No generics and minimal traits in the public API for simplicity of usage
176* All dependencies are optional (e.g. `mint`, `rand` and `serde`)
177* Follows the [Rust API Guidelines] where possible
178* Aiming for 100% test [coverage]
179* Common functionality is benchmarked using [Criterion.rs]
180
181[Rust API Guidelines]: https://rust-lang-nursery.github.io/api-guidelines/
182[coverage]: coveralls.io
183[Criterion.rs]: https://bheisler.github.io/criterion.rs/book/index.html
184
185## Architecture
186
187See [ARCHITECTURE.md] for details on `glam`'s internals.
188
189[ARCHITECTURE.md]: ARCHITECTURE.md
190
191## Inspirations
192
193There were many inspirations for the interface and internals of glam from the
194Rust and C++ worlds. In particular:
195
196* [How to write a maths library in 2016] inspired the initial `Vec3A`
197 implementation
198* [Realtime Math] - header only C++11 with SSE and NEON SIMD intrinsic support
199* [DirectXMath] - header only SIMD C++ linear algebra library for use in games
200 and graphics apps
201* `glam` is a play on the name of the popular C++ library [GLM]
202
203[How to write a maths library in 2016]: http://www.codersnotes.com/notes/maths-lib-2016/
204[Realtime Math]: https://github.com/nfrechette/rtm
205[DirectXMath]: https://docs.microsoft.com/en-us/windows/desktop/dxmath/directxmath-portal
206[GLM]: https://glm.g-truc.net
207
208## License
209
210Licensed under either of
211
212* Apache License, Version 2.0 ([LICENSE-APACHE](LICENSE-APACHE)
213 or http://www.apache.org/licenses/LICENSE-2.0)
214* MIT license ([LICENSE-MIT](LICENSE-MIT)
215 or http://opensource.org/licenses/MIT)
216
217at your option.
218
219## Contribution
220
221Contributions in any form (issues, pull requests, etc.) to this project must
222adhere to Rust's [Code of Conduct].
223
224Unless you explicitly state otherwise, any contribution intentionally submitted
225for inclusion in the work by you, as defined in the Apache-2.0 license, shall be
226dual licensed as above, without any additional terms or conditions.
227
228If you are interested in contributing or have a request or suggestion
229[start a discussion] on GitHub. See [CONTRIBUTING.md] for more information for
230contributors.
231
232Most code in `glam` is generated, see the [codegen README] for details.
233
234Thank you to all of the `glam` [contributors]!
235
236[Code of Conduct]: https://www.rust-lang.org/en-US/conduct.html
237[start a discussion]: https://github.com/bitshifter/glam-rs/discussions
238[CONTRIBUTING.md]: CONTRIBUTING.md
239[codegen README]: codegen/README.md
240[contributors]: https://github.com/bitshifter/glam-rs/graphs/contributors
241
242## Support
243
244The [Game Development in Rust Discord] and [Bevy Engine Discord] servers are
245not official support channels but can be good places to ask for help with
246`glam`.
247
248[Game Development in Rust Discord]: https://discord.gg/yNtPTb2
249[Bevy Engine Discord]: https://discord.gg/gMUk5Ph
250
251## Attribution
252
253`glam` contains code ported from the following C++ libraries:
254
255* [DirectXMath] - MIT License - Copyright (c) 2011-2020 Microsoft Corp
256* [Realtime Math] - MIT License - Copyright (c) 2018 Nicholas Frechette
257* [GLM] - MIT License - Copyright (c) 2005 - G-Truc Creation
258
259See [ATTRIBUTION.md] for details.
260
261[ATTRIBUTION.md]: ATTRIBUTION.md
262
263[Build Status]: https://github.com/bitshifter/glam-rs/actions/workflows/ci.yml/badge.svg
264[github-ci]: https://github.com/bitshifter/glam-rs/actions/workflows/ci.yml
265[Coverage Status]: https://coveralls.io/repos/github/bitshifter/glam-rs/badge.svg?branch=main
266[coveralls.io]: https://coveralls.io/github/bitshifter/glam-rs?branch=main
267[Latest Version]: https://img.shields.io/crates/v/glam.svg
268[crates.io]: https://crates.io/crates/glam/
269[docs]: https://docs.rs/glam/badge.svg
270[docs.rs]: https://docs.rs/glam/
271[Minimum Supported Rust Version]: https://img.shields.io/badge/Rust-1.68.2-blue?color=fc8d62&logo=rust
272[Rust 1.68.2]: https://github.com/rust-lang/rust/blob/master/RELEASES.md#version-1682-2023-03-28
273