Skip to content

Commit a03663d

Browse files
committed
Testing compounds vs child colliders
1 parent f1020b5 commit a03663d

File tree

2 files changed

+182
-21
lines changed

2 files changed

+182
-21
lines changed

bevy_rapier3d/Cargo.toml

Lines changed: 31 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -7,46 +7,58 @@ documentation = "http://docs.rs/bevy_rapier3d"
77
homepage = "http://rapier.rs"
88
repository = "https://github.com/dimforge/bevy_rapier"
99
readme = "../README.md"
10-
keywords = [ "physics", "dynamics", "rigid", "real-time", "joints" ]
10+
keywords = ["physics", "dynamics", "rigid", "real-time", "joints"]
1111
license = "Apache-2.0"
1212
edition = "2021"
1313

1414

1515
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
1616
[lib]
1717
path = "../src/lib.rs"
18-
required-features = [ "dim3" ]
18+
required-features = ["dim3"]
1919

2020
[features]
21-
default = [ "dim3", "async-collider", "debug-render-3d" ]
21+
default = ["dim3", "async-collider", "debug-render-3d"]
2222
dim3 = []
23-
debug-render = [ "debug-render-3d" ]
24-
debug-render-2d = [ "bevy/bevy_core_pipeline", "bevy/bevy_sprite", "bevy/bevy_gizmos", "rapier3d/debug-render", "bevy/bevy_asset" ]
25-
debug-render-3d = [ "bevy/bevy_core_pipeline", "bevy/bevy_pbr", "bevy/bevy_gizmos", "rapier3d/debug-render", "bevy/bevy_asset" ]
26-
parallel = [ "rapier3d/parallel" ]
27-
simd-stable = [ "rapier3d/simd-stable" ]
28-
simd-nightly = [ "rapier3d/simd-nightly" ]
29-
wasm-bindgen = [ "rapier3d/wasm-bindgen" ]
30-
serde-serialize = [ "rapier3d/serde-serialize", "bevy/serialize", "serde" ]
31-
enhanced-determinism = [ "rapier3d/enhanced-determinism" ]
32-
headless = [ ]
33-
async-collider = [ "bevy/bevy_asset", "bevy/bevy_scene" ]
23+
debug-render = ["debug-render-3d"]
24+
debug-render-2d = [
25+
"bevy/bevy_core_pipeline",
26+
"bevy/bevy_sprite",
27+
"bevy/bevy_gizmos",
28+
"rapier3d/debug-render",
29+
"bevy/bevy_asset",
30+
]
31+
debug-render-3d = [
32+
"bevy/bevy_core_pipeline",
33+
"bevy/bevy_pbr",
34+
"bevy/bevy_gizmos",
35+
"rapier3d/debug-render",
36+
"bevy/bevy_asset",
37+
]
38+
parallel = ["rapier3d/parallel"]
39+
simd-stable = ["rapier3d/simd-stable"]
40+
simd-nightly = ["rapier3d/simd-nightly"]
41+
wasm-bindgen = ["rapier3d/wasm-bindgen"]
42+
serde-serialize = ["rapier3d/serde-serialize", "bevy/serialize", "serde"]
43+
enhanced-determinism = ["rapier3d/enhanced-determinism"]
44+
headless = []
45+
async-collider = ["bevy/bevy_asset", "bevy/bevy_scene"]
3446

3547
[dependencies]
3648
bevy = { version = "0.11", default-features = false }
37-
nalgebra = { version = "0.32.3", features = [ "convert-glam024" ] }
49+
nalgebra = { version = "0.32.3", features = ["convert-glam024"] }
3850
# Don't enable the default features because we don't need the ColliderSet/RigidBodySet
3951
rapier3d = "0.17.0"
4052
bitflags = "1"
4153
#bevy_prototype_debug_lines = { version = "0.6", features = ["3d"], optional = true }
4254
log = "0.4"
43-
serde = { version = "1", features = [ "derive" ], optional = true}
55+
serde = { version = "1", features = ["derive"], optional = true }
4456

4557
[dev-dependencies]
46-
bevy = { version = "0.11", default-features = false, features = ["x11"]}
58+
bevy = { version = "0.11", default-features = false, features = ["x11"] }
4759
approx = "0.5.1"
48-
glam = { version = "0.24", features = [ "approx" ] }
60+
glam = { version = "0.24", features = ["approx"] }
4961

5062
[package.metadata.docs.rs]
5163
# Enable all the features when building the docs on docs.rs
52-
features = [ "debug-render-3d", "serde-serialize" ]
64+
features = ["debug-render-3d", "serde-serialize"]

bevy_rapier3d/examples/boxes3.rs

Lines changed: 151 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,155 @@ fn main() {
1717
.run();
1818
}
1919

20+
fn setup_compound(mut commands: Commands, mut meshes: ResMut<Assets<Mesh>>) {
21+
// Normal compound
22+
// - Scaling works as expected
23+
commands
24+
.spawn(TransformBundle::default())
25+
.insert(Name::new("Compound"))
26+
.insert(RigidBody::Dynamic)
27+
.insert(ToggleCollider)
28+
.insert(ToggleScale)
29+
.insert(Collider::compound(vec![
30+
(Vec3::ZERO, Quat::IDENTITY, Collider::cuboid(0.5, 0.5, 0.5)),
31+
(
32+
Vec3::new(0.0, 1.0, 0.0),
33+
Quat::IDENTITY,
34+
Collider::cuboid(0.5, 0.5, 0.5),
35+
),
36+
(
37+
Vec3::new(-1.0, 1.0, 0.0),
38+
Quat::IDENTITY,
39+
Collider::cuboid(0.5, 0.5, 0.5),
40+
),
41+
]));
42+
43+
let mesh = meshes.add(Mesh::from(shape::UVSphere {
44+
radius: 0.2,
45+
..default()
46+
}));
47+
48+
commands
49+
.spawn(PbrBundle {
50+
mesh: mesh.clone(),
51+
..default()
52+
})
53+
.insert(TransformBundle::from_transform(Transform {
54+
translation: Vec3::new(-4.0, 0.0, 0.0),
55+
..default()
56+
}))
57+
.insert(Name::new("Standalone collider"))
58+
.insert(ToggleScale)
59+
.insert(ToggleCollider)
60+
.insert(Collider::cuboid(0.5, 0.5, 0.5));
61+
62+
commands
63+
.spawn(PbrBundle {
64+
mesh: mesh.clone(),
65+
..default()
66+
})
67+
.insert(TransformBundle::from_transform(Transform {
68+
translation: Vec3::new(4.0, 0.0, 0.0),
69+
..default()
70+
}))
71+
.insert(Name::new("Compound via children"))
72+
.insert(RigidBody::Dynamic)
73+
.insert(ToggleScale)
74+
//.insert(ToggleCollider)
75+
.insert(Collider::cuboid(0.5, 0.5, 0.5))
76+
.with_children(|children| {
77+
children
78+
.spawn(PbrBundle {
79+
mesh: mesh.clone(),
80+
..default()
81+
})
82+
.insert(TransformBundle::from_transform(Transform {
83+
translation: Vec3::new(0.0, 1.0, 0.0),
84+
..default()
85+
}))
86+
.insert(Name::new("Child collider"))
87+
.insert(Collider::cuboid(0.5, 0.5, 0.5));
88+
89+
children
90+
.spawn(PbrBundle {
91+
mesh: mesh.clone(),
92+
..default()
93+
})
94+
.insert(TransformBundle::from_transform(Transform {
95+
translation: Vec3::new(-1.0, 1.0, 0.0),
96+
..default()
97+
}))
98+
.insert(Name::new("Child collider"))
99+
.insert(Collider::cuboid(0.5, 0.5, 0.5));
100+
});
101+
}
102+
103+
#[derive(Component)]
104+
pub struct ToggleCollider;
105+
#[derive(Component)]
106+
pub struct ToggleScale;
107+
108+
fn toggle_compound(
109+
keycode: Res<Input<KeyCode>>,
110+
mut commands: Commands,
111+
mut collider: Query<(Entity, &mut Collider), With<ToggleCollider>>,
112+
mut scale: Query<(Entity, &mut Transform), With<ToggleScale>>,
113+
) {
114+
let new_collider = if keycode.just_pressed(KeyCode::Key1) {
115+
Some(Collider::compound(vec![
116+
(Vec3::ZERO, Quat::IDENTITY, Collider::cuboid(0.5, 0.5, 0.5)),
117+
(
118+
Vec3::new(0.0, 1.0, 0.0),
119+
Quat::IDENTITY,
120+
Collider::cuboid(0.5, 0.5, 0.5),
121+
),
122+
(
123+
Vec3::new(-1.0, 1.0, 0.0),
124+
Quat::IDENTITY,
125+
Collider::cuboid(0.5, 0.5, 0.5),
126+
),
127+
]))
128+
} else if keycode.just_pressed(KeyCode::Key2) {
129+
Some(Collider::compound(vec![
130+
(Vec3::ZERO, Quat::IDENTITY, Collider::ball(0.5)),
131+
(
132+
Vec3::new(0.0, 1.0, 0.0),
133+
Quat::IDENTITY,
134+
Collider::ball(0.5),
135+
),
136+
(
137+
Vec3::new(-1.0, 1.0, 0.0),
138+
Quat::IDENTITY,
139+
Collider::ball(0.5),
140+
),
141+
]))
142+
} else {
143+
None
144+
};
145+
146+
let new_scale_ratio = if keycode.just_pressed(KeyCode::T) {
147+
Some(1.1)
148+
} else if keycode.just_pressed(KeyCode::R) {
149+
Some(0.9)
150+
} else {
151+
None
152+
};
153+
154+
if let Some(new_scale_ratio) = new_scale_ratio {
155+
for (entity, mut transform) in &mut scale {
156+
transform.scale *= new_scale_ratio;
157+
transform.scale = transform.scale.max(Vec3::new(0.1, 0.1, 0.1));
158+
transform.scale = transform.scale.min(Vec3::new(5.0, 5.0, 5.0));
159+
}
160+
}
161+
162+
if let Some(new_collider) = new_collider {
163+
for (entity, mut collider) in &mut collider {
164+
*collider = new_collider.clone();
165+
}
166+
}
167+
}
168+
20169
fn setup_graphics(mut commands: Commands) {
21170
commands.spawn(Camera3dBundle {
22171
transform: Transform::from_xyz(-30.0, 30.0, 100.0)
@@ -40,7 +189,7 @@ pub fn setup_physics(mut commands: Commands) {
40189
/*
41190
* Create the cubes
42191
*/
43-
let num = 8;
192+
let num = 0;
44193
let rad = 1.0;
45194

46195
let shift = rad * 2.0 + rad;
@@ -56,7 +205,7 @@ pub fn setup_physics(mut commands: Commands) {
56205
Color::hsl(260.0, 1.0, 0.7),
57206
];
58207

59-
for j in 0usize..20 {
208+
for j in 0usize..num {
60209
for i in 0..num {
61210
for k in 0usize..num {
62211
let x = i as f32 * shift - centerx + offset;

0 commit comments

Comments
 (0)