[][src]Crate broccoli

Broccoli is a broadphase collision detection library. The base data structure is a hybrid between a KD Tree and 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

  • (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 collections modules 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. In which case use TreeRefInd.

Checkout the github examples.


Parallel versions of construction and colliding pair finding functions are provided. They use rayon under the hood which uses work stealing to parallelize divide and conquer style recursive functions.

Floating Point

The Num trait used for the aabbs inserted into the tree must implement Ord, thus you can't add f32 or f64. However, you can use the ordered_float crate, which is re-exported at [axgeom::ordered_float]. The broccoli book mentioned above compares performance. For best performance, you will likely want to convert the floats to integers anyway.

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.


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 Aabb trait is unsafe.


If you shorten "broadphase collision" to "broad colli" and say it fast, it sounds like broccoli. Broccoli also have tree like properties and broccoli uses a tree data structure.


pub use axgeom;
pub use compt;
pub use rayon;



Contains code to help analyze the Tree structure. Only used to measure the performance of the structure.


Container trees that deref to Tree


Helper functions to convert aabbs in floats to integers


Contains node-level building block structs and visitors used for a Tree.


Contains code to write generic code that can be run in parallel, or sequentially. The api is exposed in case users find it useful when writing parallel query code to operate on the tree.


Provides a mutable pointer type that is more restrictive that &mut T, in order to protect tree invariants. PMut is short for protected mutable reference.


The broccoli prelude.


Module contains query related structs.



A bounding box container object that implements Aabb and HasInner. Note that &mut BBox<N,T> also implements Aabb and HasInner.


A version of Tree where the elements are not sorted along each axis, like a KD Tree. For comparison, a normal kd-tree is provided by NotSorted. In this tree, the elements are not sorted along an axis at each level. Construction of NotSorted is faster than Tree since it does not have to sort bots that belong to each node along an axis. But most query algorithms can usually take advantage of this extra property to be faster.


A 1D range. Internally represented as start and end. (as opposed to a start and length) This means that subdivision does not result in any floating point calculations. The start value must be <= the end value. There is no protection against "degenerate" Ranges where start>end. Behavior of any of the functions with degenrate Ranges is unspecified.


An axis aligned rectangle. Stored as two Ranges. It is a semi-closed rectangle. A point is considered inside the rectangle if it is in [start,end) for both x and y.


The data structure this crate revoles around.



Trait to signify that this object has an axis aligned bounding box. Aabb::get() must return a aabb with the same value in it while the element is in the tree. This is hard for the user not to do, this the user does not have &mut self, but it is still possible through the use of static objects or RefCell / Mutex, etc. Using these type of methods the user could make different calls to get() return different aabbs. This is unsafe since we allow query algorithms to assume the following: If two object's aabb's don't intersect, then they can be mutated at the same time.


Trait exposes an api where you can return a read-only reference to the axis-aligned bounding box and at the same time return a mutable reference to a seperate inner section.


The underlying number type used for the tree. It is auto implemented by all types that satisfy the type constraints. Notice that no arithmatic is possible. The tree is constructed using only comparisons and copying.



Shorthand constructor of BBox


Returns the default axis type.


Create a Tree using the default axis.


Create a Tree using the default axis in parallel.


Convenience function to create a Rect.


Create a Tree using a specified axis.


Create a Tree using a specified axis in parallel.

Type Definitions


The default starting axis of a Tree. It is set to be the Y axis. This means that the first divider is a horizontal line since it is partitioning space based off of the aabb's Y value.