Crates.io | hektor |
lib.rs | hektor |
version | 0.2.2 |
source | src |
created_at | 2019-02-10 20:47:06.245486 |
updated_at | 2019-08-06 16:45:27.932687 |
description | A library for hekkin vectors. |
homepage | |
repository | https://github.com/Lokathor/hektor |
max_upload_size | |
id | 113957 |
size | 373,805 |
CI coverage:
x86
, x86_64
, wasm32
, armv7
, aarch64
, thumbv7neon
x86
, x86_64
, wasm32
If you're a CI pro, please submit a PR that gives even more CI coverage!
A library for hekkin vectors.
Goals:
f32
Vectors of dimension 2, 3, and 4.f32
Matrices with one vector per column (aka "column-major"). This is
optimal for uploading into OpenGL or Vulkan with a GLSL shader.f32
Quaternions.STATUS: NOT READY FOR USE
Code is largely organized with one type per module. These modules are made part
of the crate by having lib.rs
do the following for each one:
mod foo;
pub use foo::*;
The combination of a private module and a pub use
of the content of said
module causes the outside world see all of the content of the foo
module as
being directly within the crate's top level module. This is easiest on end
users, without forcing us to literally put the entire crate in a single file.
Tests are organized as one test file per operation group. This is a lot easier to keep track of when adding one operation at a time and checking that it's implemented for each appropriate type.
new, are marked
#[inline(always)]`.#[inline]
by default.#[inline(always)]
, but
there must first be some sort of benchmark demonstrating the issue.At the moment I'm using the adding of new operations to the library as a bit of a way to re-verify that I personally know how each thing works because it's sure been a bit since I had to do any of this. Accordingly, having other people add in large piles of functionality isn't something I'm super interested in.
That said, there are plenty of places where people who want to contribute can help speed up the process:
nalgebra-glm
handles, that isn't in the issue tracker then please add it to
the issue tracker.no_std
for as long as possible
which means that I end up having to rely on the
libm crate, so you can always
help out there.Vec3
/Vec4
we want to
take advantage of the individual components being parts of a "f32x4" SIMD lane
as much as we can. This means that we have to write custom versions of some
operations, particularly trigonometry, because normal branching code is far
less helpful to us. For example, when there's a brach in SIMD you have execute
both branches and then combine the results with a mask, so branching to exit
a function early is no help. This usually means that you have to re-think how
to handle things. Properly wide versions of things like trig are essential to
eventual good performance across the board. This isn't a hard blocker: when
a wide version isn't available I just call the necessary libm
function on
each component individually, but that's about 4x as long to execute.