#kdtree #bevy #bevy-plugin #gamedev #knn #nearest-neighbour

bevy_spatial

A crate for tracking bevy entities in spatial indices

11 releases (7 breaking)

0.8.0 Mar 4, 2024
0.7.0 Nov 5, 2023
0.6.0 Aug 5, 2023
0.5.1 May 1, 2023
0.1.1 May 4, 2022

#280 in Data structures

Download history 3/week @ 2023-12-29 2/week @ 2024-01-05 27/week @ 2024-02-16 34/week @ 2024-02-23 191/week @ 2024-03-01 91/week @ 2024-03-08 30/week @ 2024-03-15 6/week @ 2024-03-22 97/week @ 2024-03-29 35/week @ 2024-04-05

174 downloads per month

MIT/Apache

45KB
528 lines

bevy_spatial

A bevy plugin to track your entities in spatial indices and query them.

crates.io

Currently implemented features:

Feature Description
kdtree (default) KD-Tree for spatial lookups which is fully recreated on update, but fast to recreate. Works well in most situations.
use bevy_spatial::{AutomaticUpdate, KDTree3, TransformMode, SpatialAccess};

#[derive(Component, Default)]
struct TrackedByKDTree;

fn main() {
    App::new()
        .add_plugins(AutomaticUpdate::<TrackedByKDTree>::new()
            .with_frequency(Duration::from_secs_f32(0.3))
            .with_transform(TransformMode::GlobalTransform))
        .add_systems(Update, use_neighbour);
    // ...
}

type NNTree = KDTree3<TrackedByKDTree>; // type alias for later

// spawn some entities with the TrackedByKDTree component

fn use_neighbour(tree: Res<NNTree>){
    if let Some((pos, entity)) = tree.nearest_neighbour(Vec3::ZERO) {
        // pos: Vec3
        // do something with the nearest entity here
    }
}

For more details on usage see Examples

compatible bevy versions

bevy bevy_spatial
0.13 0.8.0
0.12 0.7.0
0.11 0.6.0
0.10 0.5.0
0.9 0.4.0
0.8 0.3.0
0.8 0.2.1
0.7 0.1

wasm caveats: the rayon acceleration for kdtree is disabled on wasm, making it a bit slower.

Dependencies

~17–47MB
~739K SLoC