2025-01-11 00:25:52 +01:00

70 lines
2.2 KiB
GDScript

## Returns the amount of process time passed between two items using idle time.
## The emitted item is a [Tuple] containing the real item as first and the
## time delta as second component.
static func process_time_interval_(initial_time : float = 0.0) -> Callable:
var process_time_interval = func(source : Observable) -> Observable:
var subscribe = func(
observer : ObserverBase,
scheduler : SchedulerBase = null
) -> DisposableBase:
var _scheduler : SchedulerBase
_scheduler = scheduler if scheduler != null else CurrentThreadScheduler.singleton()
var dt = RefValue.Set(initial_time)
var on_process = func(delta : float):
dt.v += delta
var process_sub : DisposableBase = GDRx.on_idle_frame().subscribe(on_process)
var on_next = func(value):
var span : float = dt.v
dt.v = 0.0
observer.on_next(Tuple.new([value, span]))
var sub : DisposableBase = source.subscribe(
on_next, observer.on_error, observer.on_completed,
_scheduler
)
return CompositeDisposable.new([process_sub, sub])
return Observable.new(subscribe)
return process_time_interval
## Returns the amount of time passed between two items using physics steps.
## The emitted item is a [Tuple] containing the real item as first and the
## time delta as second component.
static func physics_time_interval_(initial_time : float = 0.0) -> Callable:
var physics_time_interval = func(source : Observable) -> Observable:
var subscribe = func(
observer : ObserverBase,
scheduler : SchedulerBase = null
) -> DisposableBase:
var _scheduler : SchedulerBase
_scheduler = scheduler if scheduler != null else CurrentThreadScheduler.singleton()
var dt = RefValue.Set(initial_time)
var on_process = func(delta : float):
dt.v += delta
var process_sub : DisposableBase = GDRx.on_physics_step().subscribe(on_process)
var on_next = func(value):
var span : float = dt.v
dt.v = 0.0
observer.on_next(Tuple.new([value, span]))
var sub : DisposableBase = source.subscribe(
on_next, observer.on_error, observer.on_completed,
_scheduler
)
return CompositeDisposable.new([process_sub, sub])
return Observable.new(subscribe)
return physics_time_interval