From c764975c56f191db577aa65169c8b71fa2b2a5c6 Mon Sep 17 00:00:00 2001 From: metamuffin Date: Wed, 25 Sep 2024 00:31:56 +0200 Subject: begin actually implementing spatial index --- server/client-lib/src/spatial_index.rs | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) (limited to 'server/client-lib/src') diff --git a/server/client-lib/src/spatial_index.rs b/server/client-lib/src/spatial_index.rs index d4bd1776..3f0d5ad0 100644 --- a/server/client-lib/src/spatial_index.rs +++ b/server/client-lib/src/spatial_index.rs @@ -15,20 +15,30 @@ along with this program. If not, see . */ -use hurrycurry_protocol::glam::Vec2; +use hurrycurry_protocol::glam::{IVec2, Vec2}; use std::{collections::HashMap, hash::Hash}; // TODO stub implementation. please implement pub struct SpatialIndex { entries: HashMap, + bins: HashMap>, } impl SpatialIndex { pub fn update_entry(&mut self, id: T, position: Vec2) { self.entries.insert(id, position); + let e = self.bins.entry(position.as_ivec2()).or_default(); + if !e.contains(&id) { + e.push(id); + } } pub fn remove_entry(&mut self, id: T) { - self.entries.remove(&id); + if let Some(pos) = self.entries.remove(&id) { + self.bins + .entry(pos.as_ivec2()) + .or_default() + .retain(|e| *e != id); + } } pub fn all(&self, mut cb: impl FnMut(T, Vec2)) { for (&e, &pos) in &self.entries { @@ -36,6 +46,7 @@ impl SpatialIndex { } } pub fn query(&self, position: Vec2, radius: f32, mut cb: impl FnMut(T, Vec2)) { + // TODO query bins self.all(|pl, p| { if p.distance(position) < radius { cb(pl, p) @@ -47,6 +58,7 @@ impl Default for SpatialIndex { fn default() -> Self { Self { entries: Default::default(), + bins: Default::default(), } } } -- cgit v1.2.3-70-g09d2