rust/hwrunner/src/main.rs
author alfadur
Thu, 21 Jan 2021 02:11:59 +0300
changeset 15776 ec85fdf82942
parent 15766 19ad3fe48ea6
child 15777 2b3f8af6f647
permissions -rw-r--r--
add wgpu support to hwrunner
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
15776
ec85fdf82942 add wgpu support to hwrunner
alfadur
parents: 15766
diff changeset
     1
use std::time::Duration;
ec85fdf82942 add wgpu support to hwrunner
alfadur
parents: 15766
diff changeset
     2
ec85fdf82942 add wgpu support to hwrunner
alfadur
parents: 15766
diff changeset
     3
use futures::executor::block_on;
14187
675aa499a70e add standalone engine runner
alfadur
parents:
diff changeset
     4
use glutin::{
14705
19122a329774 make world renderer optional + fmt
alfadur
parents: 14704
diff changeset
     5
    dpi, ContextTrait, DeviceEvent, ElementState, Event, EventsLoop, GlProfile, GlRequest,
15776
ec85fdf82942 add wgpu support to hwrunner
alfadur
parents: 15766
diff changeset
     6
    MouseButton, MouseScrollDelta, Window, WindowBuilder, WindowEvent, WindowedContext,
ec85fdf82942 add wgpu support to hwrunner
alfadur
parents: 15766
diff changeset
     7
};
ec85fdf82942 add wgpu support to hwrunner
alfadur
parents: 15766
diff changeset
     8
use hedgewars_engine::instance::EngineInstance;
ec85fdf82942 add wgpu support to hwrunner
alfadur
parents: 15766
diff changeset
     9
use integral_geometry::Point;
ec85fdf82942 add wgpu support to hwrunner
alfadur
parents: 15766
diff changeset
    10
use std::error::Error;
ec85fdf82942 add wgpu support to hwrunner
alfadur
parents: 15766
diff changeset
    11
use wgpu::{
ec85fdf82942 add wgpu support to hwrunner
alfadur
parents: 15766
diff changeset
    12
    Adapter, BackendBit, Color, CommandEncoderDescriptor, Device, DeviceDescriptor, Features,
ec85fdf82942 add wgpu support to hwrunner
alfadur
parents: 15766
diff changeset
    13
    LoadOp, Operations, PowerPreference, PresentMode, Queue, RenderPassColorAttachmentDescriptor,
ec85fdf82942 add wgpu support to hwrunner
alfadur
parents: 15766
diff changeset
    14
    RenderPassDescriptor, RequestAdapterOptions, Surface, SwapChain, SwapChainDescriptor,
ec85fdf82942 add wgpu support to hwrunner
alfadur
parents: 15766
diff changeset
    15
    TextureFormat, TextureUsage,
14187
675aa499a70e add standalone engine runner
alfadur
parents:
diff changeset
    16
};
675aa499a70e add standalone engine runner
alfadur
parents:
diff changeset
    17
15776
ec85fdf82942 add wgpu support to hwrunner
alfadur
parents: 15766
diff changeset
    18
type HwGlRendererContext = WindowedContext;
ec85fdf82942 add wgpu support to hwrunner
alfadur
parents: 15766
diff changeset
    19
ec85fdf82942 add wgpu support to hwrunner
alfadur
parents: 15766
diff changeset
    20
struct HwWgpuRenderingContext {
ec85fdf82942 add wgpu support to hwrunner
alfadur
parents: 15766
diff changeset
    21
    window: Window,
ec85fdf82942 add wgpu support to hwrunner
alfadur
parents: 15766
diff changeset
    22
    surface: Surface,
ec85fdf82942 add wgpu support to hwrunner
alfadur
parents: 15766
diff changeset
    23
    adapter: Adapter,
ec85fdf82942 add wgpu support to hwrunner
alfadur
parents: 15766
diff changeset
    24
    device: Device,
ec85fdf82942 add wgpu support to hwrunner
alfadur
parents: 15766
diff changeset
    25
    queue: Queue,
ec85fdf82942 add wgpu support to hwrunner
alfadur
parents: 15766
diff changeset
    26
    swap_chain: SwapChain,
ec85fdf82942 add wgpu support to hwrunner
alfadur
parents: 15766
diff changeset
    27
}
ec85fdf82942 add wgpu support to hwrunner
alfadur
parents: 15766
diff changeset
    28
ec85fdf82942 add wgpu support to hwrunner
alfadur
parents: 15766
diff changeset
    29
enum HwRendererContext {
ec85fdf82942 add wgpu support to hwrunner
alfadur
parents: 15766
diff changeset
    30
    Gl(HwGlRendererContext),
ec85fdf82942 add wgpu support to hwrunner
alfadur
parents: 15766
diff changeset
    31
    Wgpu(HwWgpuRenderingContext),
ec85fdf82942 add wgpu support to hwrunner
alfadur
parents: 15766
diff changeset
    32
}
ec85fdf82942 add wgpu support to hwrunner
alfadur
parents: 15766
diff changeset
    33
ec85fdf82942 add wgpu support to hwrunner
alfadur
parents: 15766
diff changeset
    34
struct ErrorStub;
ec85fdf82942 add wgpu support to hwrunner
alfadur
parents: 15766
diff changeset
    35
ec85fdf82942 add wgpu support to hwrunner
alfadur
parents: 15766
diff changeset
    36
impl<T: Error> From<T> for ErrorStub {
ec85fdf82942 add wgpu support to hwrunner
alfadur
parents: 15766
diff changeset
    37
    fn from(_: T) -> Self {
ec85fdf82942 add wgpu support to hwrunner
alfadur
parents: 15766
diff changeset
    38
        ErrorStub
ec85fdf82942 add wgpu support to hwrunner
alfadur
parents: 15766
diff changeset
    39
    }
ec85fdf82942 add wgpu support to hwrunner
alfadur
parents: 15766
diff changeset
    40
}
14704
12db7e435ea6 move camera into engine
alfadur
parents: 14702
diff changeset
    41
15776
ec85fdf82942 add wgpu support to hwrunner
alfadur
parents: 15766
diff changeset
    42
impl HwRendererContext {
ec85fdf82942 add wgpu support to hwrunner
alfadur
parents: 15766
diff changeset
    43
    pub fn window(&self) -> &Window {
ec85fdf82942 add wgpu support to hwrunner
alfadur
parents: 15766
diff changeset
    44
        match self {
ec85fdf82942 add wgpu support to hwrunner
alfadur
parents: 15766
diff changeset
    45
            HwRendererContext::Gl(gl) => &gl.window(),
ec85fdf82942 add wgpu support to hwrunner
alfadur
parents: 15766
diff changeset
    46
            HwRendererContext::Wgpu(wgpu) => &wgpu.window,
ec85fdf82942 add wgpu support to hwrunner
alfadur
parents: 15766
diff changeset
    47
        }
ec85fdf82942 add wgpu support to hwrunner
alfadur
parents: 15766
diff changeset
    48
    }
ec85fdf82942 add wgpu support to hwrunner
alfadur
parents: 15766
diff changeset
    49
ec85fdf82942 add wgpu support to hwrunner
alfadur
parents: 15766
diff changeset
    50
    pub fn update(&mut self, size: dpi::LogicalSize) {
ec85fdf82942 add wgpu support to hwrunner
alfadur
parents: 15766
diff changeset
    51
        let phys = size.to_physical(self.window().get_hidpi_factor());
ec85fdf82942 add wgpu support to hwrunner
alfadur
parents: 15766
diff changeset
    52
        match self {
ec85fdf82942 add wgpu support to hwrunner
alfadur
parents: 15766
diff changeset
    53
            HwRendererContext::Gl(context) => unsafe {
ec85fdf82942 add wgpu support to hwrunner
alfadur
parents: 15766
diff changeset
    54
                gl::Viewport(0, 0, phys.width as i32, phys.height as i32);
ec85fdf82942 add wgpu support to hwrunner
alfadur
parents: 15766
diff changeset
    55
            },
ec85fdf82942 add wgpu support to hwrunner
alfadur
parents: 15766
diff changeset
    56
            HwRendererContext::Wgpu(context) => {
ec85fdf82942 add wgpu support to hwrunner
alfadur
parents: 15766
diff changeset
    57
                context.swap_chain = context.device.create_swap_chain(
ec85fdf82942 add wgpu support to hwrunner
alfadur
parents: 15766
diff changeset
    58
                    &context.surface,
ec85fdf82942 add wgpu support to hwrunner
alfadur
parents: 15766
diff changeset
    59
                    &SwapChainDescriptor {
ec85fdf82942 add wgpu support to hwrunner
alfadur
parents: 15766
diff changeset
    60
                        usage: TextureUsage::OUTPUT_ATTACHMENT,
ec85fdf82942 add wgpu support to hwrunner
alfadur
parents: 15766
diff changeset
    61
                        format: TextureFormat::Bgra8Unorm,
ec85fdf82942 add wgpu support to hwrunner
alfadur
parents: 15766
diff changeset
    62
                        width: phys.width as u32,
ec85fdf82942 add wgpu support to hwrunner
alfadur
parents: 15766
diff changeset
    63
                        height: phys.height as u32,
ec85fdf82942 add wgpu support to hwrunner
alfadur
parents: 15766
diff changeset
    64
                        present_mode: PresentMode::Fifo,
ec85fdf82942 add wgpu support to hwrunner
alfadur
parents: 15766
diff changeset
    65
                    },
ec85fdf82942 add wgpu support to hwrunner
alfadur
parents: 15766
diff changeset
    66
                );
ec85fdf82942 add wgpu support to hwrunner
alfadur
parents: 15766
diff changeset
    67
            }
ec85fdf82942 add wgpu support to hwrunner
alfadur
parents: 15766
diff changeset
    68
        }
ec85fdf82942 add wgpu support to hwrunner
alfadur
parents: 15766
diff changeset
    69
    }
ec85fdf82942 add wgpu support to hwrunner
alfadur
parents: 15766
diff changeset
    70
ec85fdf82942 add wgpu support to hwrunner
alfadur
parents: 15766
diff changeset
    71
    pub fn present(&mut self) -> Result<(), ErrorStub> {
ec85fdf82942 add wgpu support to hwrunner
alfadur
parents: 15766
diff changeset
    72
        match self {
ec85fdf82942 add wgpu support to hwrunner
alfadur
parents: 15766
diff changeset
    73
            HwRendererContext::Gl(context) => context.swap_buffers()?,
ec85fdf82942 add wgpu support to hwrunner
alfadur
parents: 15766
diff changeset
    74
            HwRendererContext::Wgpu(context) => {
ec85fdf82942 add wgpu support to hwrunner
alfadur
parents: 15766
diff changeset
    75
                let frame_view = &context.swap_chain.get_current_frame()?.output.view;
14188
3b83ec44e10b pass hwrunner gl context into engine
alfadur
parents: 14187
diff changeset
    76
15776
ec85fdf82942 add wgpu support to hwrunner
alfadur
parents: 15766
diff changeset
    77
                let mut encoder =
ec85fdf82942 add wgpu support to hwrunner
alfadur
parents: 15766
diff changeset
    78
                    context
ec85fdf82942 add wgpu support to hwrunner
alfadur
parents: 15766
diff changeset
    79
                        .device
ec85fdf82942 add wgpu support to hwrunner
alfadur
parents: 15766
diff changeset
    80
                        .create_command_encoder(&CommandEncoderDescriptor {
ec85fdf82942 add wgpu support to hwrunner
alfadur
parents: 15766
diff changeset
    81
                            label: Some("Main encoder"),
ec85fdf82942 add wgpu support to hwrunner
alfadur
parents: 15766
diff changeset
    82
                        });
ec85fdf82942 add wgpu support to hwrunner
alfadur
parents: 15766
diff changeset
    83
                encoder.begin_render_pass(&RenderPassDescriptor {
ec85fdf82942 add wgpu support to hwrunner
alfadur
parents: 15766
diff changeset
    84
                    color_attachments: &[RenderPassColorAttachmentDescriptor {
ec85fdf82942 add wgpu support to hwrunner
alfadur
parents: 15766
diff changeset
    85
                        attachment: &frame_view,
ec85fdf82942 add wgpu support to hwrunner
alfadur
parents: 15766
diff changeset
    86
                        resolve_target: None,
ec85fdf82942 add wgpu support to hwrunner
alfadur
parents: 15766
diff changeset
    87
                        ops: Operations {
ec85fdf82942 add wgpu support to hwrunner
alfadur
parents: 15766
diff changeset
    88
                            load: LoadOp::Clear(Color::BLUE),
ec85fdf82942 add wgpu support to hwrunner
alfadur
parents: 15766
diff changeset
    89
                            store: false,
ec85fdf82942 add wgpu support to hwrunner
alfadur
parents: 15766
diff changeset
    90
                        },
ec85fdf82942 add wgpu support to hwrunner
alfadur
parents: 15766
diff changeset
    91
                    }],
ec85fdf82942 add wgpu support to hwrunner
alfadur
parents: 15766
diff changeset
    92
                    depth_stencil_attachment: None,
ec85fdf82942 add wgpu support to hwrunner
alfadur
parents: 15766
diff changeset
    93
                });
ec85fdf82942 add wgpu support to hwrunner
alfadur
parents: 15766
diff changeset
    94
                let buffer = encoder.finish();
ec85fdf82942 add wgpu support to hwrunner
alfadur
parents: 15766
diff changeset
    95
                context.queue.submit(std::iter::once(buffer));
ec85fdf82942 add wgpu support to hwrunner
alfadur
parents: 15766
diff changeset
    96
            }
ec85fdf82942 add wgpu support to hwrunner
alfadur
parents: 15766
diff changeset
    97
        }
ec85fdf82942 add wgpu support to hwrunner
alfadur
parents: 15766
diff changeset
    98
        Ok(())
ec85fdf82942 add wgpu support to hwrunner
alfadur
parents: 15766
diff changeset
    99
    }
ec85fdf82942 add wgpu support to hwrunner
alfadur
parents: 15766
diff changeset
   100
}
ec85fdf82942 add wgpu support to hwrunner
alfadur
parents: 15766
diff changeset
   101
ec85fdf82942 add wgpu support to hwrunner
alfadur
parents: 15766
diff changeset
   102
fn init_wgpu(event_loop: &EventsLoop, size: dpi::LogicalSize) -> HwWgpuRenderingContext {
ec85fdf82942 add wgpu support to hwrunner
alfadur
parents: 15766
diff changeset
   103
    let builder = WindowBuilder::new()
ec85fdf82942 add wgpu support to hwrunner
alfadur
parents: 15766
diff changeset
   104
        .with_title("hwengine")
ec85fdf82942 add wgpu support to hwrunner
alfadur
parents: 15766
diff changeset
   105
        .with_dimensions(size);
ec85fdf82942 add wgpu support to hwrunner
alfadur
parents: 15766
diff changeset
   106
    let window = builder.build(event_loop).unwrap();
ec85fdf82942 add wgpu support to hwrunner
alfadur
parents: 15766
diff changeset
   107
ec85fdf82942 add wgpu support to hwrunner
alfadur
parents: 15766
diff changeset
   108
    let instance = wgpu::Instance::new(BackendBit::PRIMARY);
ec85fdf82942 add wgpu support to hwrunner
alfadur
parents: 15766
diff changeset
   109
ec85fdf82942 add wgpu support to hwrunner
alfadur
parents: 15766
diff changeset
   110
    let surface = unsafe { instance.create_surface(&window) };
14187
675aa499a70e add standalone engine runner
alfadur
parents:
diff changeset
   111
15776
ec85fdf82942 add wgpu support to hwrunner
alfadur
parents: 15766
diff changeset
   112
    let adapter = block_on(instance.request_adapter(&RequestAdapterOptions {
ec85fdf82942 add wgpu support to hwrunner
alfadur
parents: 15766
diff changeset
   113
        power_preference: PowerPreference::HighPerformance,
ec85fdf82942 add wgpu support to hwrunner
alfadur
parents: 15766
diff changeset
   114
        compatible_surface: Some(&surface),
ec85fdf82942 add wgpu support to hwrunner
alfadur
parents: 15766
diff changeset
   115
    }))
ec85fdf82942 add wgpu support to hwrunner
alfadur
parents: 15766
diff changeset
   116
    .unwrap();
ec85fdf82942 add wgpu support to hwrunner
alfadur
parents: 15766
diff changeset
   117
ec85fdf82942 add wgpu support to hwrunner
alfadur
parents: 15766
diff changeset
   118
    let (device, queue) = block_on(adapter.request_device(&Default::default(), None)).unwrap();
ec85fdf82942 add wgpu support to hwrunner
alfadur
parents: 15766
diff changeset
   119
ec85fdf82942 add wgpu support to hwrunner
alfadur
parents: 15766
diff changeset
   120
    let size = window.get_inner_size().unwrap();
ec85fdf82942 add wgpu support to hwrunner
alfadur
parents: 15766
diff changeset
   121
ec85fdf82942 add wgpu support to hwrunner
alfadur
parents: 15766
diff changeset
   122
    let phys = size.to_physical(window.get_hidpi_factor());
ec85fdf82942 add wgpu support to hwrunner
alfadur
parents: 15766
diff changeset
   123
ec85fdf82942 add wgpu support to hwrunner
alfadur
parents: 15766
diff changeset
   124
    let mut swap_chain = device.create_swap_chain(
ec85fdf82942 add wgpu support to hwrunner
alfadur
parents: 15766
diff changeset
   125
        &surface,
ec85fdf82942 add wgpu support to hwrunner
alfadur
parents: 15766
diff changeset
   126
        &SwapChainDescriptor {
ec85fdf82942 add wgpu support to hwrunner
alfadur
parents: 15766
diff changeset
   127
            usage: TextureUsage::OUTPUT_ATTACHMENT,
ec85fdf82942 add wgpu support to hwrunner
alfadur
parents: 15766
diff changeset
   128
            format: TextureFormat::Bgra8Unorm,
ec85fdf82942 add wgpu support to hwrunner
alfadur
parents: 15766
diff changeset
   129
            width: phys.width as u32,
ec85fdf82942 add wgpu support to hwrunner
alfadur
parents: 15766
diff changeset
   130
            height: phys.height as u32,
ec85fdf82942 add wgpu support to hwrunner
alfadur
parents: 15766
diff changeset
   131
            present_mode: PresentMode::Fifo,
ec85fdf82942 add wgpu support to hwrunner
alfadur
parents: 15766
diff changeset
   132
        },
ec85fdf82942 add wgpu support to hwrunner
alfadur
parents: 15766
diff changeset
   133
    );
ec85fdf82942 add wgpu support to hwrunner
alfadur
parents: 15766
diff changeset
   134
ec85fdf82942 add wgpu support to hwrunner
alfadur
parents: 15766
diff changeset
   135
    HwWgpuRenderingContext {
ec85fdf82942 add wgpu support to hwrunner
alfadur
parents: 15766
diff changeset
   136
        window,
ec85fdf82942 add wgpu support to hwrunner
alfadur
parents: 15766
diff changeset
   137
        surface,
ec85fdf82942 add wgpu support to hwrunner
alfadur
parents: 15766
diff changeset
   138
        adapter,
ec85fdf82942 add wgpu support to hwrunner
alfadur
parents: 15766
diff changeset
   139
        device,
ec85fdf82942 add wgpu support to hwrunner
alfadur
parents: 15766
diff changeset
   140
        queue,
ec85fdf82942 add wgpu support to hwrunner
alfadur
parents: 15766
diff changeset
   141
        swap_chain,
ec85fdf82942 add wgpu support to hwrunner
alfadur
parents: 15766
diff changeset
   142
    }
ec85fdf82942 add wgpu support to hwrunner
alfadur
parents: 15766
diff changeset
   143
}
ec85fdf82942 add wgpu support to hwrunner
alfadur
parents: 15766
diff changeset
   144
ec85fdf82942 add wgpu support to hwrunner
alfadur
parents: 15766
diff changeset
   145
fn init_gl(event_loop: &EventsLoop, size: dpi::LogicalSize) -> HwGlRendererContext {
ec85fdf82942 add wgpu support to hwrunner
alfadur
parents: 15766
diff changeset
   146
    use glutin::ContextBuilder;
ec85fdf82942 add wgpu support to hwrunner
alfadur
parents: 15766
diff changeset
   147
ec85fdf82942 add wgpu support to hwrunner
alfadur
parents: 15766
diff changeset
   148
    let builder = WindowBuilder::new()
14187
675aa499a70e add standalone engine runner
alfadur
parents:
diff changeset
   149
        .with_title("hwengine")
675aa499a70e add standalone engine runner
alfadur
parents:
diff changeset
   150
        .with_dimensions(size);
675aa499a70e add standalone engine runner
alfadur
parents:
diff changeset
   151
15776
ec85fdf82942 add wgpu support to hwrunner
alfadur
parents: 15766
diff changeset
   152
    let context = ContextBuilder::new()
14702
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents: 14334
diff changeset
   153
        .with_gl(GlRequest::Latest)
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents: 14334
diff changeset
   154
        .with_gl_profile(GlProfile::Core)
15776
ec85fdf82942 add wgpu support to hwrunner
alfadur
parents: 15766
diff changeset
   155
        .build_windowed(builder, &event_loop)
14705
19122a329774 make world renderer optional + fmt
alfadur
parents: 14704
diff changeset
   156
        .ok()
19122a329774 make world renderer optional + fmt
alfadur
parents: 14704
diff changeset
   157
        .unwrap();
14702
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents: 14334
diff changeset
   158
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents: 14334
diff changeset
   159
    unsafe {
15776
ec85fdf82942 add wgpu support to hwrunner
alfadur
parents: 15766
diff changeset
   160
        context.make_current().unwrap();
ec85fdf82942 add wgpu support to hwrunner
alfadur
parents: 15766
diff changeset
   161
        gl::load_with(|ptr| context.get_proc_address(ptr) as *const _);
14705
19122a329774 make world renderer optional + fmt
alfadur
parents: 14704
diff changeset
   162
15776
ec85fdf82942 add wgpu support to hwrunner
alfadur
parents: 15766
diff changeset
   163
        if let Some(sz) = context.get_inner_size() {
ec85fdf82942 add wgpu support to hwrunner
alfadur
parents: 15766
diff changeset
   164
            let phys = sz.to_physical(context.get_hidpi_factor());
14705
19122a329774 make world renderer optional + fmt
alfadur
parents: 14704
diff changeset
   165
14702
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents: 14334
diff changeset
   166
            gl::Viewport(0, 0, phys.width as i32, phys.height as i32);
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents: 14334
diff changeset
   167
        }
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents: 14334
diff changeset
   168
    }
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents: 14334
diff changeset
   169
15776
ec85fdf82942 add wgpu support to hwrunner
alfadur
parents: 15766
diff changeset
   170
    context
ec85fdf82942 add wgpu support to hwrunner
alfadur
parents: 15766
diff changeset
   171
}
ec85fdf82942 add wgpu support to hwrunner
alfadur
parents: 15766
diff changeset
   172
ec85fdf82942 add wgpu support to hwrunner
alfadur
parents: 15766
diff changeset
   173
fn init(event_loop: &EventsLoop, size: dpi::LogicalSize, use_wgpu: bool) -> HwRendererContext {
ec85fdf82942 add wgpu support to hwrunner
alfadur
parents: 15766
diff changeset
   174
    if use_wgpu {
ec85fdf82942 add wgpu support to hwrunner
alfadur
parents: 15766
diff changeset
   175
        HwRendererContext::Wgpu(init_wgpu(event_loop, size))
ec85fdf82942 add wgpu support to hwrunner
alfadur
parents: 15766
diff changeset
   176
    } else {
ec85fdf82942 add wgpu support to hwrunner
alfadur
parents: 15766
diff changeset
   177
        HwRendererContext::Gl(init_gl(event_loop, size))
ec85fdf82942 add wgpu support to hwrunner
alfadur
parents: 15766
diff changeset
   178
    }
14187
675aa499a70e add standalone engine runner
alfadur
parents:
diff changeset
   179
}
675aa499a70e add standalone engine runner
alfadur
parents:
diff changeset
   180
675aa499a70e add standalone engine runner
alfadur
parents:
diff changeset
   181
fn main() {
15776
ec85fdf82942 add wgpu support to hwrunner
alfadur
parents: 15766
diff changeset
   182
    let use_wgpu = false;
14187
675aa499a70e add standalone engine runner
alfadur
parents:
diff changeset
   183
    let mut event_loop = EventsLoop::new();
14702
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents: 14334
diff changeset
   184
    let (w, h) = (1024.0, 768.0);
15776
ec85fdf82942 add wgpu support to hwrunner
alfadur
parents: 15766
diff changeset
   185
ec85fdf82942 add wgpu support to hwrunner
alfadur
parents: 15766
diff changeset
   186
    let mut context = init(&event_loop, dpi::LogicalSize::new(w, h), use_wgpu);
14187
675aa499a70e add standalone engine runner
alfadur
parents:
diff changeset
   187
14702
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents: 14334
diff changeset
   188
    let mut engine = EngineInstance::new();
15776
ec85fdf82942 add wgpu support to hwrunner
alfadur
parents: 15766
diff changeset
   189
    if !use_wgpu {
ec85fdf82942 add wgpu support to hwrunner
alfadur
parents: 15766
diff changeset
   190
        engine.world.create_renderer(w as u16, h as u16);
ec85fdf82942 add wgpu support to hwrunner
alfadur
parents: 15766
diff changeset
   191
    }
14188
3b83ec44e10b pass hwrunner gl context into engine
alfadur
parents: 14187
diff changeset
   192
14702
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents: 14334
diff changeset
   193
    let mut dragging = false;
14188
3b83ec44e10b pass hwrunner gl context into engine
alfadur
parents: 14187
diff changeset
   194
14702
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents: 14334
diff changeset
   195
    use std::time::Instant;
14188
3b83ec44e10b pass hwrunner gl context into engine
alfadur
parents: 14187
diff changeset
   196
14702
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents: 14334
diff changeset
   197
    let mut now = Instant::now();
15776
ec85fdf82942 add wgpu support to hwrunner
alfadur
parents: 15766
diff changeset
   198
    let mut update_time = Instant::now();
ec85fdf82942 add wgpu support to hwrunner
alfadur
parents: 15766
diff changeset
   199
    let mut render_time = Instant::now();
14705
19122a329774 make world renderer optional + fmt
alfadur
parents: 14704
diff changeset
   200
14187
675aa499a70e add standalone engine runner
alfadur
parents:
diff changeset
   201
    let mut is_running = true;
15766
19ad3fe48ea6 reduce fps
alfadur
parents: 14716
diff changeset
   202
14187
675aa499a70e add standalone engine runner
alfadur
parents:
diff changeset
   203
    while is_running {
15776
ec85fdf82942 add wgpu support to hwrunner
alfadur
parents: 15766
diff changeset
   204
        let current_time = Instant::now();
ec85fdf82942 add wgpu support to hwrunner
alfadur
parents: 15766
diff changeset
   205
        let delta = current_time - now;
ec85fdf82942 add wgpu support to hwrunner
alfadur
parents: 15766
diff changeset
   206
        now = current_time;
14702
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents: 14334
diff changeset
   207
        let ms = delta.as_secs() as f64 * 1000.0 + delta.subsec_millis() as f64;
15776
ec85fdf82942 add wgpu support to hwrunner
alfadur
parents: 15766
diff changeset
   208
        context.window().set_title(&format!("hwengine {:.3}ms", ms));
14705
19122a329774 make world renderer optional + fmt
alfadur
parents: 14704
diff changeset
   209
15776
ec85fdf82942 add wgpu support to hwrunner
alfadur
parents: 15766
diff changeset
   210
        if update_time.elapsed() > Duration::from_millis(10) {
ec85fdf82942 add wgpu support to hwrunner
alfadur
parents: 15766
diff changeset
   211
            update_time = current_time;
14716
8e74d4eb89f5 add random falling stuff
alfadur
parents: 14714
diff changeset
   212
            engine.world.step()
8e74d4eb89f5 add random falling stuff
alfadur
parents: 14714
diff changeset
   213
        }
8e74d4eb89f5 add random falling stuff
alfadur
parents: 14714
diff changeset
   214
14705
19122a329774 make world renderer optional + fmt
alfadur
parents: 14704
diff changeset
   215
        event_loop.poll_events(|event| match event {
19122a329774 make world renderer optional + fmt
alfadur
parents: 14704
diff changeset
   216
            Event::WindowEvent { event, .. } => match event {
19122a329774 make world renderer optional + fmt
alfadur
parents: 14704
diff changeset
   217
                WindowEvent::CloseRequested => {
19122a329774 make world renderer optional + fmt
alfadur
parents: 14704
diff changeset
   218
                    is_running = false;
19122a329774 make world renderer optional + fmt
alfadur
parents: 14704
diff changeset
   219
                }
15776
ec85fdf82942 add wgpu support to hwrunner
alfadur
parents: 15766
diff changeset
   220
                WindowEvent::Resized(size) => context.update(size),
ec85fdf82942 add wgpu support to hwrunner
alfadur
parents: 15766
diff changeset
   221
14705
19122a329774 make world renderer optional + fmt
alfadur
parents: 14704
diff changeset
   222
                WindowEvent::MouseInput { button, state, .. } => {
19122a329774 make world renderer optional + fmt
alfadur
parents: 14704
diff changeset
   223
                    if let MouseButton::Right = button {
14709
65c971417780 fix zoom
alfadur
parents: 14705
diff changeset
   224
                        dragging = state == ElementState::Pressed;
14702
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents: 14334
diff changeset
   225
                    }
14705
19122a329774 make world renderer optional + fmt
alfadur
parents: 14704
diff changeset
   226
                }
14709
65c971417780 fix zoom
alfadur
parents: 14705
diff changeset
   227
14705
19122a329774 make world renderer optional + fmt
alfadur
parents: 14704
diff changeset
   228
                WindowEvent::MouseWheel { delta, .. } => {
19122a329774 make world renderer optional + fmt
alfadur
parents: 14704
diff changeset
   229
                    let zoom_change = match delta {
19122a329774 make world renderer optional + fmt
alfadur
parents: 14704
diff changeset
   230
                        MouseScrollDelta::LineDelta(x, y) => y as f32 * 0.1f32,
19122a329774 make world renderer optional + fmt
alfadur
parents: 14704
diff changeset
   231
                        MouseScrollDelta::PixelDelta(delta) => {
15776
ec85fdf82942 add wgpu support to hwrunner
alfadur
parents: 15766
diff changeset
   232
                            let physical = delta.to_physical(context.window().get_hidpi_factor());
14705
19122a329774 make world renderer optional + fmt
alfadur
parents: 14704
diff changeset
   233
                            physical.y as f32 * 0.1f32
19122a329774 make world renderer optional + fmt
alfadur
parents: 14704
diff changeset
   234
                        }
19122a329774 make world renderer optional + fmt
alfadur
parents: 14704
diff changeset
   235
                    };
19122a329774 make world renderer optional + fmt
alfadur
parents: 14704
diff changeset
   236
                    engine.world.move_camera(Point::ZERO, zoom_change);
19122a329774 make world renderer optional + fmt
alfadur
parents: 14704
diff changeset
   237
                }
19122a329774 make world renderer optional + fmt
alfadur
parents: 14704
diff changeset
   238
                _ => (),
19122a329774 make world renderer optional + fmt
alfadur
parents: 14704
diff changeset
   239
            },
19122a329774 make world renderer optional + fmt
alfadur
parents: 14704
diff changeset
   240
            Event::DeviceEvent { event, .. } => match event {
19122a329774 make world renderer optional + fmt
alfadur
parents: 14704
diff changeset
   241
                DeviceEvent::MouseMotion { delta } => {
19122a329774 make world renderer optional + fmt
alfadur
parents: 14704
diff changeset
   242
                    if dragging {
19122a329774 make world renderer optional + fmt
alfadur
parents: 14704
diff changeset
   243
                        engine
19122a329774 make world renderer optional + fmt
alfadur
parents: 14704
diff changeset
   244
                            .world
19122a329774 make world renderer optional + fmt
alfadur
parents: 14704
diff changeset
   245
                            .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
   246
                    }
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents: 14334
diff changeset
   247
                }
14705
19122a329774 make world renderer optional + fmt
alfadur
parents: 14704
diff changeset
   248
                _ => {}
19122a329774 make world renderer optional + fmt
alfadur
parents: 14704
diff changeset
   249
            },
19122a329774 make world renderer optional + fmt
alfadur
parents: 14704
diff changeset
   250
            _ => (),
14188
3b83ec44e10b pass hwrunner gl context into engine
alfadur
parents: 14187
diff changeset
   251
        });
3b83ec44e10b pass hwrunner gl context into engine
alfadur
parents: 14187
diff changeset
   252
15776
ec85fdf82942 add wgpu support to hwrunner
alfadur
parents: 15766
diff changeset
   253
        if render_time.elapsed() > Duration::from_millis(16) {
ec85fdf82942 add wgpu support to hwrunner
alfadur
parents: 15766
diff changeset
   254
            render_time = current_time;
ec85fdf82942 add wgpu support to hwrunner
alfadur
parents: 15766
diff changeset
   255
            if !use_wgpu {
ec85fdf82942 add wgpu support to hwrunner
alfadur
parents: 15766
diff changeset
   256
                engine.render();
ec85fdf82942 add wgpu support to hwrunner
alfadur
parents: 15766
diff changeset
   257
            }
ec85fdf82942 add wgpu support to hwrunner
alfadur
parents: 15766
diff changeset
   258
            context.present();
15766
19ad3fe48ea6 reduce fps
alfadur
parents: 14716
diff changeset
   259
        }
14187
675aa499a70e add standalone engine runner
alfadur
parents:
diff changeset
   260
    }
675aa499a70e add standalone engine runner
alfadur
parents:
diff changeset
   261
}