1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127
//! Broccoli is a broadphase collision detection library. //! The base data structure is a hybrid between a [KD Tree](https://en.wikipedia.org/wiki/K-d_tree) and [Sweep and Prune](https://en.wikipedia.org/wiki/Sweep_and_prune). //! //! ### Data Structure //! //! Using this crate, the user can create three flavors of the same fundamental data structure. //! The different characteristics are exlored more in depth in the [broccoli book](https://tiby312.github.io/broccoli_report) //! //! //! - `(Rect<N>,&mut T)` Semi-direct //! - `(Rect<N>,T)` Direct //! - `&mut (Rect<N>,T)` Indirect //! //! ### There are so many Tree types which one do I use? //! //! The [`container`] module lists the tree types and they are all described there, but the //! TL;DR is use [`Tree`] and fill it with `BBox<N,&mut T>` unless you want //! to use functions like [`collect_colliding_pairs`](crate::container::TreeRefInd::collect_colliding_pairs). //! In which case use [`TreeRefInd`](crate::container::TreeRefInd). //! //! Checkout the github [examples](https://github.com/tiby312/broccoli/tree/master/examples). //! //! ### Parallelism //! //! Parallel versions of construction and colliding pair finding functions //! are provided. They use [rayon](https://crates.io/crates/rayon) under the hood which uses work stealing to //! parallelize divide and conquer style recursive functions. //! //! ### Floating Point //! //! Broccoli only requires `PartialOrd` for its number type. Instead of panicking on comparisons //! it doesnt understand, it will just arbitrary pick a result. So if you use regular float primitive types //! and there is even just one `NaN`, tree construction and querying will not panic, //! but would have unspecified results. //! If using floats, it's the users responsibility to not pass `NaN` values into the tree. //! There is no static protection against this, though if this is desired you can use //! the [ordered-float](https://crates.io/crates/ordered-float) crate. The Ord trait was not //! enforced to give users the option to use primitive floats directly which can be easier to //! work with. //! //! ### Protecting Invariants Statically //! //! A lot is done to forbid the user from violating the invariants of the tree once constructed //! while still allowing them to mutate parts of each element of the tree. The user can mutably traverse //! the tree but the mutable references returns are hidden behind the `PMut<T>` type that forbids //! mutating the aabbs. //! //! ### Unsafety //! //! Raw pointers are used for the container types in the container module //! and for caching the results of finding colliding pairs. //! //! [`query::Queries::multi_rect`] uses unsafety to allow the user to have mutable references to elements //! that belong to rectangle regions that don't intersect at the same time. This is why //! the [`node::Aabb`] trait is unsafe. #![doc( html_logo_url = "https://raw.githubusercontent.com/tiby312/broccoli/master/assets/logo.png", html_favicon_url = "https://raw.githubusercontent.com/tiby312/broccoli/master/assets/logo.png" )] #![no_std] #[macro_use] extern crate alloc; extern crate is_sorted; extern crate pdqselect; pub use axgeom; pub use compt; pub use rayon; mod inner_prelude { pub(crate) use crate::par; pub(crate) use crate::tree::*; pub(crate) use crate::query; pub(crate) use crate::node::*; pub(crate) use crate::pmut::*; pub(crate) use crate::tree::analyze::*; pub use alloc::vec::Vec; pub use axgeom::*; pub(crate) use compt::Visitor; pub use core::marker::PhantomData; } mod par; pub mod query; ///Contains generic tree construction code mod tree; pub use tree::*; pub mod pmut; ///Contains node-level building block structs and visitors used for a [`Tree`]. pub mod node; ///A collection of different bounding box containers. //pub mod bbox; //pub use crate::bbox::*; ///Generic slice utillity functions. mod util; ///Helper functions to convert aabbs in floats to integers pub mod convert; ///The broccoli prelude. pub mod prelude { pub use crate::query::Queries; } pub use axgeom::rect; ///Shorthand constructor of [`node::BBox`] #[inline(always)] #[must_use] pub fn bbox<N, T>(rect: axgeom::Rect<N>, inner: T) -> node::BBox<N, T> { node::BBox::new(rect, inner) }