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