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