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

bevy_spatial

A crate for tracking bevy entities in spatial indices

13 releases (8 breaking)

0.9.1 Sep 26, 2024
0.9.0 Jul 6, 2024
0.8.0 Mar 4, 2024
0.7.0 Nov 5, 2023
0.1.1 May 4, 2022

#332 in Data structures

Download history 71/week @ 2024-07-15 80/week @ 2024-07-22 103/week @ 2024-07-29 26/week @ 2024-08-05 30/week @ 2024-08-12 7/week @ 2024-08-26 38/week @ 2024-09-02 93/week @ 2024-09-09 38/week @ 2024-09-16 216/week @ 2024-09-23 71/week @ 2024-09-30 27/week @ 2024-10-07 29/week @ 2024-10-14 11/week @ 2024-10-21 7/week @ 2024-10-28

77 downloads per month

MIT/Apache

47KB
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.14 0.9.1
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

~26MB
~475K SLoC