1
- use bevy_utils:: Duration ;
1
+ use bevy_utils:: { tracing :: warn , Duration } ;
2
2
use bevy_ecs:: system:: { Res , ResMut } ;
3
3
use bevy_reflect:: { FromReflect , Reflect } ;
4
4
@@ -62,8 +62,9 @@ use crate::real::Real;
62
62
#[ derive( Debug , Copy , Clone , Reflect , FromReflect ) ]
63
63
pub struct Virtual {
64
64
max_delta : Duration ,
65
- relative_speed : f64 ,
66
65
paused : bool ,
66
+ relative_speed : f64 ,
67
+ effective_speed : f64 ,
67
68
}
68
69
69
70
impl Time < Virtual > {
@@ -138,8 +139,8 @@ impl Time<Virtual> {
138
139
/// Returns `0.0` if the game was paused or what the `relative_speed` value
139
140
/// was at the start of this update.
140
141
#[ inline]
141
- pub fn effective_relative_speed ( ) -> f32 {
142
- todo ! ( )
142
+ pub fn effective_speed ( & self ) -> f32 {
143
+ self . context ( ) . effective_speed as f32
143
144
}
144
145
145
146
/// Returns the speed the clock advanced relative to your system clock in
@@ -148,8 +149,8 @@ impl Time<Virtual> {
148
149
/// Returns `0.0` if the game was paused or what the `relative_speed` value
149
150
/// was at the start of this update.
150
151
#[ inline]
151
- pub fn effective_relative_speed_f64 ( ) -> f64 {
152
- todo ! ( )
152
+ pub fn effective_speed_f64 ( & self ) -> f64 {
153
+ self . context ( ) . effective_speed
153
154
}
154
155
155
156
/// Sets the speed the clock advances relative to your system clock, given as an [`f32`].
@@ -207,8 +208,9 @@ impl Default for Virtual {
207
208
fn default ( ) -> Self {
208
209
Self {
209
210
max_delta : Time :: < Virtual > :: DEFAULT_MAX_DELTA ,
210
- relative_speed : 1.0 ,
211
211
paused : false ,
212
+ relative_speed : 1.0 ,
213
+ effective_speed : 1.0 ,
212
214
}
213
215
}
214
216
}
@@ -218,17 +220,26 @@ pub fn virtual_time_system(
218
220
mut virt : ResMut < Time < Virtual > > ,
219
221
real : Res < Time < Real > > ,
220
222
) {
221
- let context = virt. context ( ) ;
222
223
let raw_delta = real. delta ( ) ;
223
- let clamped_delta = std:: cmp:: min ( raw_delta, context. max_delta ) ;
224
- let delta = if context. paused {
225
- Duration :: ZERO
226
- } else if context. relative_speed != 1.0 {
227
- clamped_delta. mul_f64 ( context. relative_speed )
224
+ let max_delta = virt. context ( ) . max_delta ;
225
+ let clamped_delta = if raw_delta > max_delta {
226
+ warn ! ( "delta time larger than maximum delta, clamping delta to {:?} and skipping {:?}" , max_delta, raw_delta - max_delta) ;
227
+ max_delta
228
+ } else {
229
+ raw_delta
230
+ } ;
231
+ let effective_speed = if virt. context ( ) . paused {
232
+ 0.0
233
+ } else {
234
+ virt. context ( ) . relative_speed
235
+ } ;
236
+ let delta = if effective_speed != 1.0 {
237
+ clamped_delta. mul_f64 ( effective_speed)
228
238
} else {
229
239
// avoid rounding when at normal speed
230
240
clamped_delta
231
241
} ;
242
+ virt. context_mut ( ) . effective_speed = effective_speed;
232
243
virt. advance_by ( delta) ;
233
244
virt. as_generic ( ) . clone_into ( current. as_mut ( ) ) ;
234
245
}
0 commit comments