/* Hurry Curry! - a game about cooking Copyright 2024 metamuffin This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, version 3 of the License only. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ 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) { 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 { cb(e, pos) } } 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) } }) } } impl Default for SpatialIndex { fn default() -> Self { Self { entries: Default::default(), bins: Default::default(), } } }