Strongly typed vector math with glam

![Build Status] ![codecov-badge] ![Latest Version] ![docs] ![Minimum Supported Rust Version]

This crate uses bytemuck to implement a zero-cost[^zero_cost] strongly typed interface on top of glam.

The API is similar to euclid, but more ergonomic (although YMMV).

One of the API design goals of glam is to avoid complexity by not going bananas with traits and generics. This crate is the opposite. But it does allow you to easily drop down to plain glam when needed.

See the docs module for detailed documentation.

compile times and make debug builds slower due to increased code size.

Step-By-Step Quickstart Guide

  1. Declare your units by defining a "unit" type (can be empty, doesn't need any traits to be derived).
  2. Implement [Unit] for that struct. [Unit::Scalar] determines the primitive type used in vector components.
  3. The scalar must be f32, f64, i32, or u32 (or bitwise compatible with one of them)[^custom_scalar].
  4. The basic primitive scalars are also units in their own right ("untyped").

    [Angle<T>] is an example of a generic custom scalar.

Example

```rust use glamour::prelude::*;

struct MyUnit; impl Unit for MyUnit { type Scalar = f32; }

// Start using your new unit: let vector: Vector4 = Vector4 { x: 1.0, y: 2.0, z: 3.0, w: 4.0 }; let size: Size2 = Size2 { width: 100.0, height: 200.0 };

// Use untyped units when needed: let vectoruntyped: &Vector4 = vector.asuntyped();

// Use glam when needed: let vectorraw: &glam::Vec4 = vector.asraw(); ```

See the documentation module for more examples.

Advantages

Over plain glam
Over euclid

Disadvantages

Compared to glam
Compared to euclid

Goals

Non-goals

Performance

All operations should perform exactly the same as their glam counterparts. There is a zero-tolerance policy for overhead in release builds.

However, debug build performance is also important in some cases. For example, for a video game it can make the difference between being playable or not in debug mode.

This crate should be expected to incur an overhead of about a factor 2 compared to glam in debug builds. This may be alleviated in the future, but it seems that even glam itself does not go out of its way to perform well in debug builds.