Added custom functions to loop
This commit is contained in:
parent
3517bf0ed0
commit
61becd7b57
@ -1,9 +1,16 @@
|
|||||||
use hypoloop::Simulation;
|
use hypoloop::Simulation;
|
||||||
|
|
||||||
|
// look into using closures for this
|
||||||
fn main() {
|
fn main() {
|
||||||
// create sim
|
// create sim and configure it
|
||||||
let mut sim = Simulation::new();
|
let mut sim = Simulation::new();
|
||||||
|
sim.set_update_function(test);
|
||||||
|
//sim.set_realtime(false);
|
||||||
|
|
||||||
// run sim
|
// run sim
|
||||||
sim.run();
|
sim.run();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn test() {
|
||||||
|
println!("Test");
|
||||||
|
}
|
49
src/lib.rs
49
src/lib.rs
@ -12,7 +12,9 @@ pub struct Simulation {
|
|||||||
update_interval: u32,
|
update_interval: u32,
|
||||||
timescale: f32,
|
timescale: f32,
|
||||||
realtime: bool,
|
realtime: bool,
|
||||||
simulate: bool
|
simulate: bool,
|
||||||
|
update_function: fn(),
|
||||||
|
display_function: fn()
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Simulation {
|
impl Simulation {
|
||||||
@ -22,10 +24,27 @@ impl Simulation {
|
|||||||
update_interval: 40,
|
update_interval: 40,
|
||||||
timescale: 1.0,
|
timescale: 1.0,
|
||||||
realtime: true,
|
realtime: true,
|
||||||
simulate: true
|
simulate: true,
|
||||||
|
update_function: default_update,
|
||||||
|
display_function: default_display
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Allows the user to pass in a custom update function
|
||||||
|
pub fn set_update_function(&mut self, user_function: fn()) {
|
||||||
|
self.update_function = user_function;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Allows the user to pass in a custom display function
|
||||||
|
pub fn set_display_function(&mut self, user_function: fn()) {
|
||||||
|
self.display_function = user_function;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Allows the user to turn realtime mode on/off
|
||||||
|
pub fn set_realtime(&mut self, realtime: bool) {
|
||||||
|
self.realtime = realtime;
|
||||||
|
}
|
||||||
|
|
||||||
/// Initializes and runs the simulation
|
/// Initializes and runs the simulation
|
||||||
pub fn run(&self) {
|
pub fn run(&self) {
|
||||||
// start the clock to keep track of real time
|
// start the clock to keep track of real time
|
||||||
@ -66,16 +85,16 @@ impl Simulation {
|
|||||||
println!("Realtime: {} | IRL time: {}ms | Sim time: {}ms | Tick delay/rate: {}ms/{}hz", self.realtime, irl_time.as_millis(), sim_time.as_millis(), loop_delay_ms, loop_rate_hz);
|
println!("Realtime: {} | IRL time: {}ms | Sim time: {}ms | Tick delay/rate: {}ms/{}hz", self.realtime, irl_time.as_millis(), sim_time.as_millis(), loop_delay_ms, loop_rate_hz);
|
||||||
}
|
}
|
||||||
|
|
||||||
// update
|
|
||||||
update(current_delta_time, current_timescale);
|
|
||||||
|
|
||||||
// record last tick time
|
// record last tick time
|
||||||
last_tick = Instant::now();
|
last_tick = Instant::now();
|
||||||
|
|
||||||
|
// update
|
||||||
|
update(self.update_function, current_delta_time, current_timescale);
|
||||||
}
|
}
|
||||||
|
|
||||||
// display
|
// display
|
||||||
if self.realtime {
|
if self.realtime {
|
||||||
display(delta_time(last_tick), self.timescale, self.update_interval);
|
display(self.display_function, delta_time(last_tick), self.timescale, self.update_interval);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -84,7 +103,7 @@ impl Simulation {
|
|||||||
|
|
||||||
// update function
|
// update function
|
||||||
// this is where all your per-tick logic should go
|
// this is where all your per-tick logic should go
|
||||||
fn update(delta_time: u32, timescale: f32) {
|
fn update(user_function: fn(), delta_time: u32, timescale: f32) {
|
||||||
// DEBUG
|
// DEBUG
|
||||||
if DEBUG_LOOP {
|
if DEBUG_LOOP {
|
||||||
println!("Updating...");
|
println!("Updating...");
|
||||||
@ -92,11 +111,14 @@ fn update(delta_time: u32, timescale: f32) {
|
|||||||
|
|
||||||
// use timestep to scale per-tick calculations appropriately
|
// use timestep to scale per-tick calculations appropriately
|
||||||
let timestep: f32 = delta_time as f32 / 1000.0 * timescale;
|
let timestep: f32 = delta_time as f32 / 1000.0 * timescale;
|
||||||
|
|
||||||
|
// call user update function
|
||||||
|
user_function();
|
||||||
}
|
}
|
||||||
|
|
||||||
// display function
|
// display function
|
||||||
// this is where you should call a render function
|
// this is where you should call a render function
|
||||||
fn display(delta_time: u32, timescale: f32, update_interval: u32) {
|
fn display(user_function: fn(), delta_time: u32, timescale: f32, update_interval: u32) {
|
||||||
// DEBUG
|
// DEBUG
|
||||||
if DEBUG_LOOP {
|
if DEBUG_LOOP {
|
||||||
println!("Displaying...");
|
println!("Displaying...");
|
||||||
@ -104,9 +126,20 @@ fn display(delta_time: u32, timescale: f32, update_interval: u32) {
|
|||||||
|
|
||||||
// use interpolation to smooth display values between ticks
|
// use interpolation to smooth display values between ticks
|
||||||
let interpolation: f32 = delta_time as f32 / update_interval as f32 * timescale;
|
let interpolation: f32 = delta_time as f32 / update_interval as f32 * timescale;
|
||||||
|
|
||||||
|
// call user display function
|
||||||
|
user_function();
|
||||||
}
|
}
|
||||||
|
|
||||||
// gets the time in milliseconds that's elapsed since the earlier Instant
|
// gets the time in milliseconds that's elapsed since the earlier Instant
|
||||||
fn delta_time(earlier: Instant) -> u32 {
|
fn delta_time(earlier: Instant) -> u32 {
|
||||||
Instant::now().duration_since(earlier).as_millis() as u32
|
Instant::now().duration_since(earlier).as_millis() as u32
|
||||||
|
}
|
||||||
|
|
||||||
|
// default update function (does nothing)
|
||||||
|
fn default_update() {
|
||||||
|
}
|
||||||
|
|
||||||
|
// default display function (does nothing)
|
||||||
|
fn default_display() {
|
||||||
}
|
}
|
Loading…
Reference in New Issue
Block a user