rust/hwrunner/src/main.rs
author alfadur
Mon, 16 Nov 2020 01:41:42 +0300
changeset 15766 19ad3fe48ea6
parent 14716 8e74d4eb89f5
child 15776 ec85fdf82942
permissions -rw-r--r--
reduce fps
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
14187
675aa499a70e add standalone engine runner
alfadur
parents:
diff changeset
     1
use glutin::{
14705
19122a329774 make world renderer optional + fmt
alfadur
parents: 14704
diff changeset
     2
    dpi, ContextTrait, DeviceEvent, ElementState, Event, EventsLoop, GlProfile, GlRequest,
19122a329774 make world renderer optional + fmt
alfadur
parents: 14704
diff changeset
     3
    MouseButton, MouseScrollDelta, WindowEvent, WindowedContext,
14187
675aa499a70e add standalone engine runner
alfadur
parents:
diff changeset
     4
};
675aa499a70e add standalone engine runner
alfadur
parents:
diff changeset
     5
14705
19122a329774 make world renderer optional + fmt
alfadur
parents: 14704
diff changeset
     6
use hedgewars_engine::instance::EngineInstance;
14704
12db7e435ea6 move camera into engine
alfadur
parents: 14702
diff changeset
     7
12db7e435ea6 move camera into engine
alfadur
parents: 14702
diff changeset
     8
use integral_geometry::Point;
14716
8e74d4eb89f5 add random falling stuff
alfadur
parents: 14714
diff changeset
     9
use std::time::Duration;
14188
3b83ec44e10b pass hwrunner gl context into engine
alfadur
parents: 14187
diff changeset
    10
14702
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents: 14334
diff changeset
    11
fn init(event_loop: &EventsLoop, size: dpi::LogicalSize) -> WindowedContext {
14705
19122a329774 make world renderer optional + fmt
alfadur
parents: 14704
diff changeset
    12
    use glutin::{ContextBuilder, WindowBuilder};
14187
675aa499a70e add standalone engine runner
alfadur
parents:
diff changeset
    13
675aa499a70e add standalone engine runner
alfadur
parents:
diff changeset
    14
    let window = WindowBuilder::new()
675aa499a70e add standalone engine runner
alfadur
parents:
diff changeset
    15
        .with_title("hwengine")
675aa499a70e add standalone engine runner
alfadur
parents:
diff changeset
    16
        .with_dimensions(size);
675aa499a70e add standalone engine runner
alfadur
parents:
diff changeset
    17
14702
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents: 14334
diff changeset
    18
    let cxt = ContextBuilder::new()
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents: 14334
diff changeset
    19
        .with_gl(GlRequest::Latest)
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents: 14334
diff changeset
    20
        .with_gl_profile(GlProfile::Core)
14705
19122a329774 make world renderer optional + fmt
alfadur
parents: 14704
diff changeset
    21
        .build_windowed(window, &event_loop)
19122a329774 make world renderer optional + fmt
alfadur
parents: 14704
diff changeset
    22
        .ok()
19122a329774 make world renderer optional + fmt
alfadur
parents: 14704
diff changeset
    23
        .unwrap();
14702
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents: 14334
diff changeset
    24
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents: 14334
diff changeset
    25
    unsafe {
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents: 14334
diff changeset
    26
        cxt.make_current().unwrap();
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents: 14334
diff changeset
    27
        gl::load_with(|ptr| cxt.get_proc_address(ptr) as *const _);
14705
19122a329774 make world renderer optional + fmt
alfadur
parents: 14704
diff changeset
    28
14702
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents: 14334
diff changeset
    29
        if let Some(sz) = cxt.get_inner_size() {
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents: 14334
diff changeset
    30
            let phys = sz.to_physical(cxt.get_hidpi_factor());
14705
19122a329774 make world renderer optional + fmt
alfadur
parents: 14704
diff changeset
    31
14702
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents: 14334
diff changeset
    32
            gl::Viewport(0, 0, phys.width as i32, phys.height as i32);
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents: 14334
diff changeset
    33
        }
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents: 14334
diff changeset
    34
    }
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents: 14334
diff changeset
    35
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents: 14334
diff changeset
    36
    cxt
14187
675aa499a70e add standalone engine runner
alfadur
parents:
diff changeset
    37
}
675aa499a70e add standalone engine runner
alfadur
parents:
diff changeset
    38
675aa499a70e add standalone engine runner
alfadur
parents:
diff changeset
    39
fn main() {
675aa499a70e add standalone engine runner
alfadur
parents:
diff changeset
    40
    let mut event_loop = EventsLoop::new();
14702
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents: 14334
diff changeset
    41
    let (w, h) = (1024.0, 768.0);
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents: 14334
diff changeset
    42
    let window = init(&event_loop, dpi::LogicalSize::new(w, h));
14187
675aa499a70e add standalone engine runner
alfadur
parents:
diff changeset
    43
14702
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents: 14334
diff changeset
    44
    let mut engine = EngineInstance::new();
14705
19122a329774 make world renderer optional + fmt
alfadur
parents: 14704
diff changeset
    45
    engine.world.create_renderer(w as u16, h as u16);
14188
3b83ec44e10b pass hwrunner gl context into engine
alfadur
parents: 14187
diff changeset
    46
14702
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents: 14334
diff changeset
    47
    let mut dragging = false;
14188
3b83ec44e10b pass hwrunner gl context into engine
alfadur
parents: 14187
diff changeset
    48
14702
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents: 14334
diff changeset
    49
    use std::time::Instant;
14188
3b83ec44e10b pass hwrunner gl context into engine
alfadur
parents: 14187
diff changeset
    50
14702
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents: 14334
diff changeset
    51
    let mut now = Instant::now();
14716
8e74d4eb89f5 add random falling stuff
alfadur
parents: 14714
diff changeset
    52
    let mut update = Instant::now();
15766
19ad3fe48ea6 reduce fps
alfadur
parents: 14716
diff changeset
    53
    let mut render = Instant::now();
14705
19122a329774 make world renderer optional + fmt
alfadur
parents: 14704
diff changeset
    54
15766
19ad3fe48ea6 reduce fps
alfadur
parents: 14716
diff changeset
    55
    unsafe { window.make_current().unwrap() };
14187
675aa499a70e add standalone engine runner
alfadur
parents:
diff changeset
    56
    let mut is_running = true;
15766
19ad3fe48ea6 reduce fps
alfadur
parents: 14716
diff changeset
    57
14187
675aa499a70e add standalone engine runner
alfadur
parents:
diff changeset
    58
    while is_running {
14702
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents: 14334
diff changeset
    59
        let curr = Instant::now();
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents: 14334
diff changeset
    60
        let delta = curr - now;
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents: 14334
diff changeset
    61
        now = curr;
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents: 14334
diff changeset
    62
        let ms = delta.as_secs() as f64 * 1000.0 + delta.subsec_millis() as f64;
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents: 14334
diff changeset
    63
        window.set_title(&format!("hwengine {:.3}ms", ms));
14705
19122a329774 make world renderer optional + fmt
alfadur
parents: 14704
diff changeset
    64
14716
8e74d4eb89f5 add random falling stuff
alfadur
parents: 14714
diff changeset
    65
        if update.elapsed() > Duration::from_millis(10) {
8e74d4eb89f5 add random falling stuff
alfadur
parents: 14714
diff changeset
    66
            update = curr;
8e74d4eb89f5 add random falling stuff
alfadur
parents: 14714
diff changeset
    67
            engine.world.step()
8e74d4eb89f5 add random falling stuff
alfadur
parents: 14714
diff changeset
    68
        }
8e74d4eb89f5 add random falling stuff
alfadur
parents: 14714
diff changeset
    69
14705
19122a329774 make world renderer optional + fmt
alfadur
parents: 14704
diff changeset
    70
        event_loop.poll_events(|event| match event {
19122a329774 make world renderer optional + fmt
alfadur
parents: 14704
diff changeset
    71
            Event::WindowEvent { event, .. } => match event {
19122a329774 make world renderer optional + fmt
alfadur
parents: 14704
diff changeset
    72
                WindowEvent::CloseRequested => {
19122a329774 make world renderer optional + fmt
alfadur
parents: 14704
diff changeset
    73
                    is_running = false;
19122a329774 make world renderer optional + fmt
alfadur
parents: 14704
diff changeset
    74
                }
19122a329774 make world renderer optional + fmt
alfadur
parents: 14704
diff changeset
    75
                WindowEvent::MouseInput { button, state, .. } => {
19122a329774 make world renderer optional + fmt
alfadur
parents: 14704
diff changeset
    76
                    if let MouseButton::Right = button {
14709
65c971417780 fix zoom
alfadur
parents: 14705
diff changeset
    77
                        dragging = state == ElementState::Pressed;
14702
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents: 14334
diff changeset
    78
                    }
14705
19122a329774 make world renderer optional + fmt
alfadur
parents: 14704
diff changeset
    79
                }
14709
65c971417780 fix zoom
alfadur
parents: 14705
diff changeset
    80
14705
19122a329774 make world renderer optional + fmt
alfadur
parents: 14704
diff changeset
    81
                WindowEvent::MouseWheel { delta, .. } => {
19122a329774 make world renderer optional + fmt
alfadur
parents: 14704
diff changeset
    82
                    let zoom_change = match delta {
19122a329774 make world renderer optional + fmt
alfadur
parents: 14704
diff changeset
    83
                        MouseScrollDelta::LineDelta(x, y) => y as f32 * 0.1f32,
19122a329774 make world renderer optional + fmt
alfadur
parents: 14704
diff changeset
    84
                        MouseScrollDelta::PixelDelta(delta) => {
19122a329774 make world renderer optional + fmt
alfadur
parents: 14704
diff changeset
    85
                            let physical = delta.to_physical(window.get_hidpi_factor());
19122a329774 make world renderer optional + fmt
alfadur
parents: 14704
diff changeset
    86
                            physical.y as f32 * 0.1f32
19122a329774 make world renderer optional + fmt
alfadur
parents: 14704
diff changeset
    87
                        }
19122a329774 make world renderer optional + fmt
alfadur
parents: 14704
diff changeset
    88
                    };
19122a329774 make world renderer optional + fmt
alfadur
parents: 14704
diff changeset
    89
                    engine.world.move_camera(Point::ZERO, zoom_change);
19122a329774 make world renderer optional + fmt
alfadur
parents: 14704
diff changeset
    90
                }
19122a329774 make world renderer optional + fmt
alfadur
parents: 14704
diff changeset
    91
                _ => (),
19122a329774 make world renderer optional + fmt
alfadur
parents: 14704
diff changeset
    92
            },
19122a329774 make world renderer optional + fmt
alfadur
parents: 14704
diff changeset
    93
            Event::DeviceEvent { event, .. } => match event {
19122a329774 make world renderer optional + fmt
alfadur
parents: 14704
diff changeset
    94
                DeviceEvent::MouseMotion { delta } => {
19122a329774 make world renderer optional + fmt
alfadur
parents: 14704
diff changeset
    95
                    if dragging {
19122a329774 make world renderer optional + fmt
alfadur
parents: 14704
diff changeset
    96
                        engine
19122a329774 make world renderer optional + fmt
alfadur
parents: 14704
diff changeset
    97
                            .world
19122a329774 make world renderer optional + fmt
alfadur
parents: 14704
diff changeset
    98
                            .move_camera(Point::new(delta.0 as i32, delta.1 as i32), 0.0)
14702
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents: 14334
diff changeset
    99
                    }
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents: 14334
diff changeset
   100
                }
14705
19122a329774 make world renderer optional + fmt
alfadur
parents: 14704
diff changeset
   101
                _ => {}
19122a329774 make world renderer optional + fmt
alfadur
parents: 14704
diff changeset
   102
            },
19122a329774 make world renderer optional + fmt
alfadur
parents: 14704
diff changeset
   103
            _ => (),
14188
3b83ec44e10b pass hwrunner gl context into engine
alfadur
parents: 14187
diff changeset
   104
        });
3b83ec44e10b pass hwrunner gl context into engine
alfadur
parents: 14187
diff changeset
   105
15766
19ad3fe48ea6 reduce fps
alfadur
parents: 14716
diff changeset
   106
        if render.elapsed() > Duration::from_millis(16) {
19ad3fe48ea6 reduce fps
alfadur
parents: 14716
diff changeset
   107
            render = curr;
19ad3fe48ea6 reduce fps
alfadur
parents: 14716
diff changeset
   108
            engine.render();
19ad3fe48ea6 reduce fps
alfadur
parents: 14716
diff changeset
   109
            window.swap_buffers().unwrap();
19ad3fe48ea6 reduce fps
alfadur
parents: 14716
diff changeset
   110
        }
14187
675aa499a70e add standalone engine runner
alfadur
parents:
diff changeset
   111
    }
675aa499a70e add standalone engine runner
alfadur
parents:
diff changeset
   112
}