This is a rewrite of the Mikkelsen Tangent Space Algorithm reference implementation in Rust. It is loosely based on mikktspace
, an existing port, except bevy_mikktspace
has:
- exact byte-for-byte output equivalence with the original C source under all conditions1.
- fully idiomatic rust with no unsafe code, to support building in no-unsafe contexts.
- no dependencies, to avoid needing perpetual dependency-version-bump releases in the future.
Requires at least Rust 1.85.1.
Demonstrates generating tangents for a cube with 4 triangular faces per side.
cargo run --example cube_tangents
The original reference implementation has a couple bugs,
which are largely inconsequential in most practical applications.
However, fixing them would mean diverging from exact output equivalence,
so bevy_mikktspace
offers features to control this behavior:
corrected-edge-sorting
: Correct a comparison in the reference's edge quicksort implementation. This can only differ on the last triangle in a model.corrected-vertex-welding
: Guarantees the smallest-index vertex is chosen when welding. This differs from the reference on NaN vertices.
Licensed under either of
- Apache License, Version 2.0 (LICENSE-APACHE or http://www.apache.org/licenses/LICENSE-2.0)
- MIT license (LICENSE-MIT or http://opensource.org/licenses/MIT)
at your option. AND parts of the code are licensed under:
- Zlib license https://opensource.org/licenses/Zlib
Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.
Footnotes
-
Extensive fuzz-testing against the reference implementation revealed divergence in NaN handling in https://github.com/gltf-rs/mikktspace, which is probably inconsequential for practical uses. ↩