33 releases (breaking)

0.34.0 Aug 7, 2020
0.33.0 Apr 5, 2020
0.32.0 Mar 14, 2020
0.31.0 Dec 8, 2019
0.5.4 Jan 25, 2017

#623 in Algorithms

Download history 50/week @ 2023-11-20 35/week @ 2023-11-27 22/week @ 2023-12-04 10/week @ 2023-12-11 96/week @ 2023-12-18 48/week @ 2023-12-25 18/week @ 2024-01-01 62/week @ 2024-01-08 41/week @ 2024-01-15 42/week @ 2024-01-22 40/week @ 2024-01-29 73/week @ 2024-02-05 116/week @ 2024-02-12 78/week @ 2024-02-19 96/week @ 2024-02-26 80/week @ 2024-03-04

377 downloads per month
Used in 2 crates (via dms-coordinates)

MIT license

665KB
14K SLoC

rust-3d

3D/2D library written in Rust. Offering useful containers, structures and algorithms for 2D and 3D space. Meant as basis for numeric algorithms, viewers, game engines, ...

Migration 0.29.0 -> 0.30.0

Note that the module structure changed. There's now only submodules for io and impls.
Also prelude was removed.
If you were using the prelude via rust_3d::prelude::*; you should now be able to just switch to rust_3d::*;.
If you were using explicit paths such as rust_3d::filters::combinators::FilterAll you should now use rust_3d::FilterAll.
Note that io and impls are still part of the module path.
This should make future usage easier, but might be painful for existing users.

Tour

Here's a little overview of some of rust-3d's features. The snippets / names might not be up-to-date, so please check tests/ for compiling examples.

Proper error handling

No .unwrap() where it's not 100% safe.

Strong / Smart Types

There's strong types for everything that might get mixed up easily.
This way e.g. ids of faces can't be mistaken for ids of vertices.

fn edges_of_face(&self, faceid: FId) -> Result<(EId, EId, EId)>;

There's also smart types which restrict the values they can hold.
This way distances can never be < 0.0, sizes can be enfored to be > 0.0 etc.

Positive  
NonNegative

Generic Code Base

I try and keep all algorithms and types as generic as possible.

  • Even rather basic types like Is2D are split into several versions: IsEditable2D, IsBuildable2D
  • IsMesh is defined for any vertex type and any number of vertices / face
  • There's traits for collections (no need to use Vec)

This makes it possible to require as little implementation work as possible if you want to use your own types.

Combinators / Transformers

  • Any IsFilter<T> can be combined via FilterAND, FilterOR, FilterAny, FilterNegate...
  • Any IsFilter<T> can be transformed to work for any collection of Ts (IsFilterRandomAccessible).
  • IsDirectionField2D might be transformed to an IsFilter<Is2D>, which can then be transformed to an IsFilterRandomAccessible<Is2D>.

IO

Any IO method is defined on traits, so if you implement these, you'll get read/write of different file formats for free.

Documentation

You can find the documentation here.

Examples

Please take a look at the tests in tests/. These will be up-to-date and compiling.
I might add extensive tutorials / examples / demo projects in the future.

crates.io
github.com
docs.rs

Contribute

Feel free to open an issue in case you're missing something or found a bug. Please avoid directly contributing since I might be working on breaking changes or the feature you want to implement. Open an issue or email me beforehand.

License

MIT (see LICENSE)

Dependencies

~1.5MB
~31K SLoC