Skip to content

Commit 1f1904b

Browse files
committed
- simplify CollisionQuery trait
- improve documentation - simplify dependencies
1 parent be5ccdf commit 1f1904b

File tree

14 files changed

+101
-68
lines changed

14 files changed

+101
-68
lines changed

CHANGELOG.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,12 @@ Note: In this file, do not use the hard wrap in the middle of a sentence for com
99
-->
1010

1111
## [Unreleased]
12+
## [0.15.1-alpha6] - 2025-01-20
13+
14+
- simplify `CollisionQuery` trait
15+
- improve documentation
16+
- simplify dependencies
17+
1218
## [0.15.1-alpha5] - 2025-01-20
1319

1420
- decouple `Disassemble` from `CollisionQuery`

Cargo.toml

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ members = ["bevy_quadtree"]
33
resolver = "2"
44

55
[workspace.package]
6-
version = "0.15.1-alpha5"
6+
version = "0.15.1-alpha6"
77
authors = ["Louis <[email protected]>"]
88
description = "A quadtree plugin for bevy"
99
license = "MIT"
@@ -13,7 +13,15 @@ documentation = "https://docs.rs/bevy_quadtree"
1313

1414
[workspace.dependencies]
1515
bevy_quadtree = { path = "bevy_quadtree" }
16-
bevy = { version = "0.15.1", default-features = false }
16+
bevy_app = { version = "0.15.1", default-features = false }
17+
bevy_ecs = { version = "0.15.1", default-features = false }
18+
bevy_math = { version = "0.15.1", default-features = false }
19+
bevy_gizmos = { version = "0.15.1", default-features = false }
20+
bevy_sprite = { version = "0.15.1", default-features = false }
21+
bevy_transform = { version = "0.15.1", default-features = false }
22+
bevy_color = { version = "0.15.1", default-features = false }
23+
bevy_log = { version = "0.15.1", default-features = false }
24+
1725

1826
[profile.dev]
1927
opt-level = 3

bevy_quadtree/Cargo.toml

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,14 @@ all-features = true
1313
rustdoc-args = ["--cfg", "docsrs"]
1414

1515
[dependencies]
16-
bevy = { workspace = true }
16+
bevy_app = { workspace = true }
17+
bevy_ecs = { workspace = true }
18+
bevy_math = { workspace = true }
19+
bevy_transform = { workspace = true, features = ["bevy-support"] }
20+
bevy_log = { workspace = true }
21+
bevy_gizmos = { workspace = true, optional = true }
22+
bevy_color = { workspace = true, optional = true }
23+
bevy_sprite = { workspace = true, optional = true }
1724
parking_lot = { version = "0.12.3", default-features = false }
1825
paste = { version = "1.0.15", default-features = false }
1926

@@ -23,5 +30,5 @@ rand_chacha = { version = "0.3.1", default-features = false }
2330

2431
[features]
2532
default = []
26-
sprite = ["bevy/bevy_sprite"]
27-
gizmos = ["bevy/bevy_gizmos"]
33+
sprite = ["dep:bevy_sprite"]
34+
gizmos = ["dep:bevy_gizmos", "dep:bevy_color"]

bevy_quadtree/README.md

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -99,13 +99,15 @@ bevy_quadtree = { version = "0.15.1" }
9999
2. Add the plugin to your Bevy app:
100100

101101
```rust no_run
102-
use bevy::prelude::*;
102+
# use bevy_app::prelude::*;
103+
# use bevy_transform::prelude::*;
104+
# #[cfg(feature = "sprite")]
105+
# use bevy_sprite::Sprite;
103106
use bevy_quadtree::{QuadTreePlugin, CollisionCircle, CollisionRect};
104107

105108
fn main() {
106109
#[cfg(feature = "sprite")]
107110
App::new()
108-
.add_plugins(DefaultPlugins)
109111
.add_plugins(QuadTreePlugin::<(
110112
(CollisionCircle, GlobalTransform), (CollisionRect, (GlobalTransform, Sprite)),
111113
),

bevy_quadtree/src/collision.rs

Lines changed: 13 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,7 @@
11
//! Collision Detection
22
3-
use bevy::prelude::{Component, Mut};
4-
use paste::paste;
5-
63
use crate::{shape::CollisionRotatedRect, CollisionCircle, CollisionRect};
4+
use bevy_ecs::prelude::*;
75

86
/// The result of a bound check.
97
/// # Example
@@ -58,6 +56,15 @@ where
5856

5957
/// Disassemble the boundary as [`CollisionRect`]s, [`CollisionRotatedRect`]s and [`CollisionCircle`]s as query boundary.
6058
/// All `S: Disassemble` also impl `CollisionQuery`, which can be used as a boundary in [`QuadTree::query`](crate::QuadTree::query).
59+
///
60+
/// Relation::Contain if any of the sub-boundaries completely contains the object.
61+
///
62+
/// Relation::Contained if all of the sub-boundaries are completely contained by the object.
63+
///
64+
/// Relation::Overlap if any of the sub-boundaries overlaps the object
65+
/// or not all of the sub-boundaries are contained by the object.
66+
///
67+
/// Relation::Disjoint otherwise.
6168
pub trait Disassemble {
6269
/// Disassemble the shape as [`CollisionRect`], [`CollisionRotatedRect`] and [`CollisionCircle`] as query boundaries.
6370
fn disassemble(
@@ -71,18 +78,9 @@ pub trait Disassemble {
7178

7279
/// Used for [`QuadTree::query`](crate::QuadTree::query) as a boundary to detect the relation between the boundary and objects from the tree.
7380
///
74-
/// However, implementing [`Disassemble`] trait for user boundary used in [`QuadTree::query`](crate::QuadTree::query) is recommended, since it's easier.
81+
/// However, implementing user-defined query boundary with [`Disassemble`] trait is recommended, since it's easier.
7582
///
76-
/// For `S: Disassemble`, the default `CollisionQuery` impletation:
77-
///
78-
/// Relation::Contain if any of the sub-boundaries completely contains the object.
79-
///
80-
/// Relation::Contained if all of the sub-boundaries are completely contained by the object.
81-
///
82-
/// Relation::Overlap if any of the sub-boundaries overlaps the object
83-
/// or not all of the sub-boundaries are contained by the object.
84-
///
85-
/// Relation::Disjoint otherwise.
83+
/// For `S: Disassemble`, the default `CollisionQuery` impletation see [`here`](crate::Disassemble).
8684
pub trait CollisionQuery {
8785
/// Detect the relation between the boundary and objects from the tree.
8886
fn query(&self, obj: &dyn DynCollision) -> Relation;
@@ -159,7 +157,7 @@ where
159157

160158
macro_rules! impl_disassemable {
161159
($($i: literal),+) => {
162-
paste! {
160+
paste::paste! {
163161
impl<$([<S $i>]),+> Disassemble for ($([<S $i>]),+,)
164162
where
165163
$([<S $i>]: Disassemble,)+

bevy_quadtree/src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ pub mod shape;
1111
mod system;
1212
pub mod tree;
1313

14-
pub use collision::{Collision, CollisionQuery, UpdateCollision};
14+
pub use collision::{Collision, CollisionQuery, Disassemble, UpdateCollision};
1515
pub use plugin::{QuadTreePlugin, TrackingPair};
1616
pub use query::{All, Contain, Contained, Disjoint, Overlap, QNot, QOr, QRelation};
1717
pub use shape::{CollisionCircle, CollisionRect, CollisionRotatedRect};

bevy_quadtree/src/node.rs

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,9 @@ use crate::{
44
collision::{DynCollision, Relation},
55
CollisionRect,
66
};
7-
use bevy::{
8-
ecs::entity::EntityHashMap,
9-
log::warn,
10-
math::{Rect, Vec2},
11-
prelude::Entity,
12-
};
7+
use bevy_ecs::entity::{Entity, EntityHashMap};
8+
use bevy_log::warn;
9+
use bevy_math::prelude::*;
1310
use core::fmt;
1411
use parking_lot::RwLock;
1512
use std::sync::Arc;

bevy_quadtree/src/plugin.rs

Lines changed: 12 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,12 @@ use crate::collision::DynCollision;
44
use crate::system::{update_collision, update_quadtree};
55
use crate::tree::QuadTree;
66
use crate::UpdateCollision;
7-
use bevy::ecs::schedule::SystemConfigs;
8-
use bevy::prelude::*;
7+
use bevy_app::prelude::*;
8+
use bevy_ecs::prelude::*;
9+
use bevy_ecs::schedule::{IntoSystemConfigs, SystemConfigs};
10+
#[cfg(feature = "sprite")]
11+
use bevy_sprite::Sprite;
12+
use bevy_transform::components::GlobalTransform;
913

1014
/// A Bevy plugin for quadtree.
1115
/// # Type Parameters
@@ -32,7 +36,10 @@ use bevy::prelude::*;
3236
/// `ID`: If you want different quadtree for different use cases with the same other parameters, set ID to different values.
3337
/// # Example
3438
/// ```no_run
35-
/// use bevy::prelude::*;
39+
/// # use bevy_app::prelude::*;
40+
/// # use bevy_transform::prelude::*;
41+
/// # #[cfg(feature = "sprite")]
42+
/// # use bevy_sprite::Sprite;
3643
/// use bevy_quadtree::{CollisionCircle, CollisionRect, CollisionRotatedRect, QuadTreePlugin};
3744
///
3845
/// #[cfg(feature = "sprite")]
@@ -250,7 +257,8 @@ impl_tracking_pairs!(0, 1, 2, 3, 4, 5, 6, 7, 8);
250257
#[cfg(test)]
251258
mod tests {
252259
use super::*;
253-
use crate::CollisionCircle;
260+
#[allow(unused_imports)]
261+
use crate::{CollisionCircle, CollisionRect, CollisionRotatedRect};
254262

255263
#[test]
256264
#[should_panic(expected = "Duplicate quadtree updating system added")]
@@ -271,9 +279,6 @@ mod tests {
271279
#[test]
272280
#[should_panic(expected = "Duplicate quadtree updating system added")]
273281
fn duplicate_shape2() {
274-
use bevy::prelude::*;
275-
276-
use crate::CollisionRect;
277282
App::new().add_plugins(QuadTreePlugin::<
278283
((CollisionRect, GlobalTransform), (CollisionRect, Sprite)),
279284
40,
@@ -287,9 +292,6 @@ mod tests {
287292
#[test]
288293
#[should_panic(expected = "Duplicate quadtree updating system added")]
289294
fn duplicate_shape3() {
290-
use crate::{CollisionCircle, CollisionRect, CollisionRotatedRect};
291-
use bevy::prelude::*;
292-
293295
App::new().add_plugins(QuadTreePlugin::<
294296
(
295297
(CollisionCircle, GlobalTransform),
@@ -307,9 +309,6 @@ mod tests {
307309
#[cfg(all(feature = "sprite", feature = "gizmos"))]
308310
#[test]
309311
fn plugin_test() {
310-
use crate::{CollisionCircle, CollisionRect, CollisionRotatedRect};
311-
use bevy::prelude::*;
312-
313312
App::new().add_plugins(QuadTreePlugin::<
314313
(
315314
(CollisionCircle, GlobalTransform),

bevy_quadtree/src/query.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
//! Query
22
33
use crate::{collision::Relation, node::ArcNode, CollisionQuery};
4-
use bevy::ecs::entity::EntityHashSet;
4+
use bevy_ecs::entity::EntityHashSet;
55

66
/// `Or` filter used in `QuadTree::query`
77
pub struct QOr<T>(core::marker::PhantomData<T>);

bevy_quadtree/src/shape/circle.rs

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,11 @@
1+
use bevy_ecs::prelude::*;
2+
use bevy_math::prelude::*;
3+
use bevy_transform::components::GlobalTransform;
4+
15
use crate::{
26
collision::{DynCollision, Relation},
37
Collision, CollisionQuery, CollisionRect, CollisionRotatedRect, UpdateCollision,
48
};
5-
use bevy::prelude::*;
69

710
/// Circle shape to be used in the QuadTreePlugin
811
/// and as a Component in the ECS.
@@ -119,19 +122,18 @@ impl UpdateCollision<GlobalTransform> for CollisionCircle {
119122

120123
impl CollisionQuery for CollisionCircle {
121124
fn query(&self, obj: &dyn DynCollision) -> Relation {
122-
let mut relation = Relation::Contain;
123125
match obj.detect(self) {
124-
Relation::Contain => return Relation::Contained,
125-
Relation::Contained if relation == Relation::Contain => {}
126-
Relation::Contained | Relation::Overlap => return Relation::Overlap,
127-
Relation::Disjoint => relation = Relation::Disjoint,
126+
Relation::Contain => Relation::Contained,
127+
Relation::Contained => Relation::Contain,
128+
r => r,
128129
}
129-
relation
130130
}
131131
}
132132

133133
#[cfg(test)]
134134
mod tests {
135+
use bevy_math::{Rect, Rot2};
136+
135137
use super::*;
136138
use std::f32::consts::*;
137139

0 commit comments

Comments
 (0)