@@ -17,6 +17,155 @@ fn main() {
17
17
. run ( ) ;
18
18
}
19
19
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
+
20
169
fn setup_graphics ( mut commands : Commands ) {
21
170
commands. spawn ( Camera3dBundle {
22
171
transform : Transform :: from_xyz ( -30.0 , 30.0 , 100.0 )
@@ -40,7 +189,7 @@ pub fn setup_physics(mut commands: Commands) {
40
189
/*
41
190
* Create the cubes
42
191
*/
43
- let num = 8 ;
192
+ let num = 0 ;
44
193
let rad = 1.0 ;
45
194
46
195
let shift = rad * 2.0 + rad;
@@ -56,7 +205,7 @@ pub fn setup_physics(mut commands: Commands) {
56
205
Color :: hsl ( 260.0 , 1.0 , 0.7 ) ,
57
206
] ;
58
207
59
- for j in 0usize ..20 {
208
+ for j in 0usize ..num {
60
209
for i in 0 ..num {
61
210
for k in 0usize ..num {
62
211
let x = i as f32 * shift - centerx + offset;
0 commit comments