diff --git a/Cargo.lock b/Cargo.lock index 3531a1e..f8495ee 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -8,6 +8,7 @@ version = "0.30.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "50a99dbe56b72736564cfa4b85bf9a33079f16ae8b74983ab06af3b1a3696b11" dependencies = [ + "libm", "serde", ] @@ -17,6 +18,12 @@ version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" +[[package]] +name = "libm" +version = "0.2.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9627da5196e5d8ed0b0495e61e518847578da83483c37288316d9b2e03a7f72" + [[package]] name = "memchr" version = "2.7.5" diff --git a/Cargo.toml b/Cargo.toml index 65905f4..5b12d9f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -8,10 +8,14 @@ repository = "https://github.com/benbaarber/quadtree" keywords = ["quadtree", "barnes-hut"] [features] +default = ["std"] + serde = ["dep:serde", "glam/serde"] +std = ["glam/std"] +libm = ["glam/libm"] [dependencies] -glam = "0.30.4" +glam = { version = "0.30.4", default-features = false, features = ["nostd-libm"] } serde = { version = "1.0.219", optional = true, features = ["derive"] } [dev-dependencies] diff --git a/src/lib.rs b/src/lib.rs index 25dc830..fbf36c2 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,10 +1,12 @@ +#![no_std] + mod quadtree; pub mod shapes; mod util; -pub use glam::{Vec2, vec2}; -pub use quadtree::Quadtree; +pub use glam::{vec2, Vec2}; pub use quadtree::barnes_hut::{BHQuadtree, WeightedPoint}; +pub use quadtree::Quadtree; /// Trait for getting a 2d point position of data stored in the [`Quadtree`] pub trait Point { diff --git a/src/quadtree/barnes_hut.rs b/src/quadtree/barnes_hut.rs index ed6eee2..f35fb0e 100644 --- a/src/quadtree/barnes_hut.rs +++ b/src/quadtree/barnes_hut.rs @@ -1,10 +1,13 @@ use crate::{ - Point, shapes::Rect, - util::{Partition, bound_items}, + util::{bound_items, Partition}, + Point, }; use glam::Vec2; -use std::ops::Range; + +extern crate alloc; +use alloc::vec::Vec; +use core::ops::Range; /// A point with mass #[derive(Debug, Default, Clone, Copy, PartialEq)] diff --git a/src/quadtree/mod.rs b/src/quadtree/mod.rs index 2d00b1f..4d0c2a9 100644 --- a/src/quadtree/mod.rs +++ b/src/quadtree/mod.rs @@ -1,13 +1,17 @@ pub mod barnes_hut; use glam::Vec2; + +extern crate alloc; +use alloc::{boxed::Box, vec, vec::Vec}; + #[cfg(feature = "serde")] -use serde::{Serialize, Serializer, ser::SerializeSeq}; +use serde::{ser::SerializeSeq, Serialize, Serializer}; use crate::{ - Point, shapes::{Rect, Shape}, util::{determine_overlap_quadrants, group_by_quadrant}, + Point, }; /// A generic Quadtree implementation for spatial indexing of 2D points @@ -229,7 +233,7 @@ impl Node { return true; } - let mut data = std::mem::take(data); + let mut data = core::mem::take(data); data.push(item.clone()); let children = self.subdivide(); *self = Self::Internal { bound, children }; @@ -510,9 +514,9 @@ mod tests { use glam::vec2; use crate::{ - Point, shapes::Circle, util::tests::{make_circle, make_rect}, + Point, }; use super::*; diff --git a/src/shapes.rs b/src/shapes.rs index 899817b..f9ccef3 100644 --- a/src/shapes.rs +++ b/src/shapes.rs @@ -1,4 +1,4 @@ -use glam::{Vec2, vec2}; +use glam::{vec2, Vec2}; #[cfg(feature = "serde")] use serde::Serialize; diff --git a/src/util.rs b/src/util.rs index c478a14..86b7555 100644 --- a/src/util.rs +++ b/src/util.rs @@ -1,8 +1,11 @@ use glam::vec2; +extern crate alloc; +use alloc::vec::Vec; + use crate::{ - Point, shapes::{Rect, Shape}, + Point, }; /// Get bounding rect for a list of items @@ -56,7 +59,7 @@ impl Partition for [T] { } pub(crate) fn group_by_quadrant(rect: Rect, items: Vec) -> [Vec; 5] { - let mut groups: [Vec; 5] = std::array::from_fn(|_| Vec::with_capacity(items.len())); + let mut groups: [Vec; 5] = core::array::from_fn(|_| Vec::with_capacity(items.len())); for item in items { match rect.quadrant(item.point()) { Some(q) => groups[q].push(item), @@ -68,7 +71,7 @@ pub(crate) fn group_by_quadrant(rect: Rect, items: Vec) -> [Vec; #[allow(unused)] pub(crate) fn group_by_quadrant_slice<'a, T: Point>(rect: Rect, items: &'a [T]) -> [Vec<&'a T>; 5] { - let mut groups: [Vec<&T>; 5] = std::array::from_fn(|_| Vec::with_capacity(items.len())); + let mut groups: [Vec<&T>; 5] = core::array::from_fn(|_| Vec::with_capacity(items.len())); for item in items { match rect.quadrant(item.point()) { Some(q) => groups[q].push(item),