1
1
//! This example demonstrates the implementation and behavior of the axes gizmo.
2
2
use bevy:: prelude:: * ;
3
3
use bevy:: render:: primitives:: Aabb ;
4
- use rand:: random ;
4
+ use rand:: { rngs :: StdRng , Rng , SeedableRng } ;
5
5
use std:: f32:: consts:: PI ;
6
6
7
+ const TRANSITION_DURATION : f32 = 2.0 ;
8
+
7
9
fn main ( ) {
8
10
App :: new ( )
9
11
. add_plugins ( DefaultPlugins )
@@ -27,15 +29,20 @@ struct TransformTracking {
27
29
/// The target transform of the cube during the move
28
30
target_transform : Transform ,
29
31
30
- /// The progress of the cube during the move in percentage points
31
- progress : u16 ,
32
+ /// The progress of the cube during the move in seconds
33
+ progress : f32 ,
32
34
}
33
35
36
+ #[ derive( Resource ) ]
37
+ struct SeededRng ( StdRng ) ;
38
+
34
39
fn setup (
35
40
mut commands : Commands ,
36
41
mut meshes : ResMut < Assets < Mesh > > ,
37
42
mut materials : ResMut < Assets < StandardMaterial > > ,
38
43
) {
44
+ let mut rng = StdRng :: seed_from_u64 ( 19878367467713 ) ;
45
+
39
46
// Lights...
40
47
commands. spawn ( PointLightBundle {
41
48
point_light : PointLight {
@@ -62,8 +69,8 @@ fn setup(
62
69
ShowAxes ,
63
70
TransformTracking {
64
71
initial_transform : default ( ) ,
65
- target_transform : random_transform ( ) ,
66
- progress : 0 ,
72
+ target_transform : random_transform ( & mut rng ) ,
73
+ progress : 0.0 ,
67
74
} ,
68
75
) ) ;
69
76
@@ -76,8 +83,8 @@ fn setup(
76
83
ShowAxes ,
77
84
TransformTracking {
78
85
initial_transform : default ( ) ,
79
- target_transform : random_transform ( ) ,
80
- progress : 0 ,
86
+ target_transform : random_transform ( & mut rng ) ,
87
+ progress : 0.0 ,
81
88
} ,
82
89
) ) ;
83
90
@@ -88,6 +95,8 @@ fn setup(
88
95
transform : Transform :: from_xyz ( 0. , -2. , 0. ) ,
89
96
..default ( )
90
97
} ) ;
98
+
99
+ commands. insert_resource ( SeededRng ( rng) ) ;
91
100
}
92
101
93
102
// This system draws the axes based on the cube's transform, with length based on the size of
@@ -100,19 +109,24 @@ fn draw_axes(mut gizmos: Gizmos, query: Query<(&Transform, &Aabb), With<ShowAxes
100
109
}
101
110
102
111
// This system changes the cubes' transforms to interpolate between random transforms
103
- fn move_cubes ( mut query : Query < ( & mut Transform , & mut TransformTracking ) > ) {
112
+ fn move_cubes (
113
+ mut query : Query < ( & mut Transform , & mut TransformTracking ) > ,
114
+ time : Res < Time > ,
115
+ mut rng : ResMut < SeededRng > ,
116
+ ) {
104
117
for ( mut transform, mut tracking) in & mut query {
105
- let t = tracking. progress as f32 / 100. ;
106
-
107
- * transform =
108
- interpolate_transforms ( tracking. initial_transform , tracking. target_transform , t) ;
109
-
110
- if tracking. progress < 100 {
111
- tracking. progress += 1 ;
118
+ * transform = interpolate_transforms (
119
+ tracking. initial_transform ,
120
+ tracking. target_transform ,
121
+ tracking. progress / TRANSITION_DURATION ,
122
+ ) ;
123
+
124
+ if tracking. progress < TRANSITION_DURATION {
125
+ tracking. progress += time. delta_seconds ( ) ;
112
126
} else {
113
127
tracking. initial_transform = * transform;
114
- tracking. target_transform = random_transform ( ) ;
115
- tracking. progress = 0 ;
128
+ tracking. target_transform = random_transform ( & mut rng . 0 ) ;
129
+ tracking. progress = 0.0 ;
116
130
}
117
131
}
118
132
}
@@ -129,31 +143,31 @@ const TRANSLATION_BOUND_UPPER_Z: f32 = 6.;
129
143
const SCALING_BOUND_LOWER_LOG : f32 = -1.2 ;
130
144
const SCALING_BOUND_UPPER_LOG : f32 = 1.2 ;
131
145
132
- fn random_transform ( ) -> Transform {
146
+ fn random_transform ( rng : & mut impl Rng ) -> Transform {
133
147
Transform {
134
- translation : random_translation ( ) ,
135
- rotation : random_rotation ( ) ,
136
- scale : random_scale ( ) ,
148
+ translation : random_translation ( rng ) ,
149
+ rotation : random_rotation ( rng ) ,
150
+ scale : random_scale ( rng ) ,
137
151
}
138
152
}
139
153
140
- fn random_translation ( ) -> Vec3 {
141
- let x = random :: < f32 > ( ) * ( TRANSLATION_BOUND_UPPER_X - TRANSLATION_BOUND_LOWER_X )
154
+ fn random_translation ( rng : & mut impl Rng ) -> Vec3 {
155
+ let x = rng . gen :: < f32 > ( ) * ( TRANSLATION_BOUND_UPPER_X - TRANSLATION_BOUND_LOWER_X )
142
156
+ TRANSLATION_BOUND_LOWER_X ;
143
- let y = random :: < f32 > ( ) * ( TRANSLATION_BOUND_UPPER_Y - TRANSLATION_BOUND_LOWER_Y )
157
+ let y = rng . gen :: < f32 > ( ) * ( TRANSLATION_BOUND_UPPER_Y - TRANSLATION_BOUND_LOWER_Y )
144
158
+ TRANSLATION_BOUND_LOWER_Y ;
145
- let z = random :: < f32 > ( ) * ( TRANSLATION_BOUND_UPPER_Z - TRANSLATION_BOUND_LOWER_Z )
159
+ let z = rng . gen :: < f32 > ( ) * ( TRANSLATION_BOUND_UPPER_Z - TRANSLATION_BOUND_LOWER_Z )
146
160
+ TRANSLATION_BOUND_LOWER_Z ;
147
161
148
162
Vec3 :: new ( x, y, z)
149
163
}
150
164
151
- fn random_scale ( ) -> Vec3 {
152
- let x_factor_log = random :: < f32 > ( ) * ( SCALING_BOUND_UPPER_LOG - SCALING_BOUND_LOWER_LOG )
165
+ fn random_scale ( rng : & mut impl Rng ) -> Vec3 {
166
+ let x_factor_log = rng . gen :: < f32 > ( ) * ( SCALING_BOUND_UPPER_LOG - SCALING_BOUND_LOWER_LOG )
153
167
+ SCALING_BOUND_LOWER_LOG ;
154
- let y_factor_log = random :: < f32 > ( ) * ( SCALING_BOUND_UPPER_LOG - SCALING_BOUND_LOWER_LOG )
168
+ let y_factor_log = rng . gen :: < f32 > ( ) * ( SCALING_BOUND_UPPER_LOG - SCALING_BOUND_LOWER_LOG )
155
169
+ SCALING_BOUND_LOWER_LOG ;
156
- let z_factor_log = random :: < f32 > ( ) * ( SCALING_BOUND_UPPER_LOG - SCALING_BOUND_LOWER_LOG )
170
+ let z_factor_log = rng . gen :: < f32 > ( ) * ( SCALING_BOUND_UPPER_LOG - SCALING_BOUND_LOWER_LOG )
157
171
+ SCALING_BOUND_LOWER_LOG ;
158
172
159
173
Vec3 :: new (
@@ -175,16 +189,16 @@ fn elerp(v1: Vec3, v2: Vec3, t: f32) -> Vec3 {
175
189
)
176
190
}
177
191
178
- fn random_rotation ( ) -> Quat {
179
- let dir = random_direction ( ) ;
180
- let angle = random :: < f32 > ( ) * 2. * PI ;
192
+ fn random_rotation ( rng : & mut impl Rng ) -> Quat {
193
+ let dir = random_direction ( rng ) ;
194
+ let angle = rng . gen :: < f32 > ( ) * 2. * PI ;
181
195
182
196
Quat :: from_axis_angle ( dir, angle)
183
197
}
184
198
185
- fn random_direction ( ) -> Vec3 {
186
- let height = random :: < f32 > ( ) * 2. - 1. ;
187
- let theta = random :: < f32 > ( ) * 2. * PI ;
199
+ fn random_direction ( rng : & mut impl Rng ) -> Vec3 {
200
+ let height = rng . gen :: < f32 > ( ) * 2. - 1. ;
201
+ let theta = rng . gen :: < f32 > ( ) * 2. * PI ;
188
202
189
203
build_direction ( height, theta)
190
204
}
0 commit comments