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