@@ -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+
20169fn 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