Skip to main content

SpatialHash

Struct SpatialHash 

Source
pub struct SpatialHash { /* private fields */ }
Expand description

Flat counting-sort grid over agent positions, rebuilt every tick.

Implementations§

Source§

impl SpatialHash

Source

pub fn new(cell_size: f32, world_w: f32, world_h: f32) -> SpatialHash

Creates an empty hash over a world_w by world_h world, with cells about cell_size wide.

Source

pub fn cell_index(&self, x: f32, y: f32) -> u32

Returns the flat index of the cell holding (x, y).

The position wraps, so a position outside the world still falls in a cell.

Source

pub fn build(&mut self, pos_x: &[f32], pos_y: &[f32])

Sorts the agents at pos_x and pos_y into their cells.

Source

pub fn build_where( &mut self, pos_x: &[f32], pos_y: &[f32], include: impl Fn(usize) -> bool, )

Like Self::build, but skips agents that include rejects.

Skipped agents are not returned by any query.

Source

pub fn query_radius( &self, x: f32, y: f32, r: f32, pos_x: &[f32], pos_y: &[f32], result: &mut Vec<u32>, )

Fills result with every agent within r of (x, y), clearing it first.

Distances wrap at the world’s edges, as for Self::for_each_within.

Source

pub fn for_each_within<F>( &self, x: f32, y: f32, r: f32, pos_x: &[f32], pos_y: &[f32], f: F, )
where F: FnMut(u32, f32, f32, f32),

Visits every agent within r of (x, y), passing the callback its index, the toroidal deltas to it and their squared length.

The deltas come out of the range test either way. A kernel that needs them uses this method and computes each delta once, whereas a list of indices makes it recompute them all.

Source

pub fn cell_size_is(&self, cell_size: f32) -> bool

Returns whether this hash was built with cell_size.

Source

pub fn world_is(&self, world_w: f32, world_h: f32) -> bool

Returns whether this hash was built for a world_w by world_h world.

Source

pub fn grid_dims(&self) -> (u32, u32)

Cells along each axis, fitted to the world from the requested cell size.

Source

pub fn cell_extents(&self) -> (f32, f32)

World distance one cell spans on each axis.

Source

pub fn buckets(&self) -> (&[u32], &[u32])

Returns (cell_start, sorted_agents), where cell c owns sorted_agents[cell_start[c]..cell_start[c + 1]].

Source

pub fn rebuild_with_cell_size( &mut self, new_cell_size: f32, pos_x: &[f32], pos_y: &[f32], )

Rebuilds the hash for new_cell_size and sorts the agents again, if the cell size changed.

Source

pub fn heap_bytes(&self) -> usize

Heap memory held by the hash, in bytes.

Trait Implementations§

Source§

impl Debug for SpatialHash

Prints the cell geometry and the agent count, not the sorted agents.

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
Source§

impl NeighborIndex for SpatialHash

Source§

const KIND: &'static str = "Spatial hash"

Name of this index in the Model panel.
Source§

fn new(extent: Extent, cell_size: f32) -> SpatialHash

Creates an empty index over extent, with cells cell_size wide.
Source§

fn rebuild(&mut self, pos_x: &[f32], pos_y: &[f32], cell_size: f32)

Rebuilds the index from agent positions, with cells cell_size wide.
Source§

fn heap_bytes(&self) -> usize

Heap memory held by the index, in bytes.

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> Downcast for T
where T: Any,

Source§

fn into_any(self: Box<T>) -> Box<dyn Any>

Convert Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>. Box<dyn Any> can then be further downcast into Box<ConcreteType> where ConcreteType implements Trait.
Source§

fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>

Convert Rc<Trait> (where Trait: Downcast) to Rc<Any>. Rc<Any> can then be further downcast into Rc<ConcreteType> where ConcreteType implements Trait.
Source§

fn as_any(&self) -> &(dyn Any + 'static)

Convert &Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &Any’s vtable from &Trait’s.
Source§

fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)

Convert &mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &mut Any’s vtable from &mut Trait’s.
Source§

impl<T> Downcast<T> for T

Source§

fn downcast(&self) -> &T

Source§

impl<T> DowncastSync for T
where T: Any + Send + Sync,

Source§

fn into_any_arc(self: Arc<T>) -> Arc<dyn Any + Sync + Send> ⓘ

Convert Arc<Trait> (where Trait: Downcast) to Arc<Any>. Arc<Any> can then be further downcast into Arc<ConcreteType> where ConcreteType implements Trait.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self> ⓘ

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self> ⓘ

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ

Converts self into a Left variant of Either<Self, Self> if into_left is true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
where F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> if into_left(&self) returns true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

impl<T> Pointable for T

Source§

const ALIGN: usize

The alignment of pointer.
Source§

type Init = T

The type for initializers.
Source§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
Source§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
Source§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
Source§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
Source§

impl<T, S> SimdFrom<T, S> for T
where S: Simd,

Source§

fn simd_from(_simd: S, value: T) -> T

Source§

impl<F, T, S> SimdInto<T, S> for F
where T: SimdFrom<F, S>, S: Simd,

Source§

fn simd_into(self, simd: S) -> T

Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = !

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, !>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> Upcast<T> for T

Source§

fn upcast(&self) -> Option<&T>

Source§

impl<T> WasmNotSend for T
where T: Send,

Source§

impl<T> WasmNotSend for T
where T: Send,

Source§

impl<T> WasmNotSendSync for T

Source§

impl<T> WasmNotSync for T
where T: Sync,

Source§

impl<T> WasmNotSync for T
where T: Sync,

Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more