diff options
-rw-r--r-- | Cargo.lock | 235 | ||||
-rw-r--r-- | client/Cargo.toml | 3 | ||||
-rw-r--r-- | client/src/main.rs | 1 | ||||
-rw-r--r-- | client/src/renderer.rs | 76 | ||||
-rw-r--r-- | client/src/window.rs | 24 |
5 files changed, 223 insertions, 116 deletions
@@ -243,6 +243,15 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7b7e4c2464d97fe331d41de9d5db0def0a96f4d823b8b32a2efd503578988973" [[package]] +name = "bincode" +version = "1.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad" +dependencies = [ + "serde", +] + +[[package]] name = "binrw" version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -268,18 +277,18 @@ dependencies = [ [[package]] name = "bit-set" -version = "0.6.0" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0481a0e032742109b1133a095184ee93d88f3dc9e0d28a5d033dc77a073f44f" +checksum = "08807e080ed7f9d5433fa9b275196cfc35414f66a0c79d864dc51a0d825231a3" dependencies = [ "bit-vec", ] [[package]] name = "bit-vec" -version = "0.7.0" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2c54ff287cfc0a34f38a6b832ea1bd8e448a330b3e40a50859e6488bee07f22" +checksum = "5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7" [[package]] name = "bit_field" @@ -491,10 +500,12 @@ dependencies = [ "libtw2-packer", "libtw2-snapshot", "log 0.4.22", + "pollster", "twgame 0.9.3", "twgpu", "twsnap 0.7.3", "warn", + "wgpu", "winit 0.30.8", "xdg", ] @@ -531,37 +542,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990" [[package]] -name = "com" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e17887fd17353b65b1b2ef1c526c83e26cd72e74f598a8dc1bee13a48f3d9f6" -dependencies = [ - "com_macros", -] - -[[package]] -name = "com_macros" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d375883580a668c7481ea6631fc1a8863e33cc335bf56bfad8d7e6d4b04b13a5" -dependencies = [ - "com_macros_support", - "proc-macro2", - "syn 1.0.109", -] - -[[package]] -name = "com_macros_support" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad899a1087a9296d5644792d7cb72b8e34c1bec8e7d4fbc002230169a6e8710c" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] name = "combine" version = "4.6.7" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -667,17 +647,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "96a6ac251f4a2aca6b3f91340350eab87ae57c3f127ffeb585e92bd336717991" [[package]] -name = "d3d12" -version = "22.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bdbd1f579714e3c809ebd822c81ef148b1ceaeb3d535352afc73fd0c4c6a0017" -dependencies = [ - "bitflags 2.7.0", - "libloading", - "winapi 0.3.9", -] - -[[package]] name = "dispatch" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -912,9 +881,9 @@ dependencies = [ [[package]] name = "glow" -version = "0.13.1" +version = "0.14.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd348e04c43b32574f2de31c8bb397d96c9fcfa1371bd4ca6d8bdc464ab121b1" +checksum = "d51fa363f025f5c111e03f13eda21162faeacb6911fe8caa0c0349f9cf0c4483" dependencies = [ "js-sys", "slotmap", @@ -952,14 +921,13 @@ dependencies = [ [[package]] name = "gpu-allocator" -version = "0.26.0" +version = "0.27.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fdd4240fc91d3433d5e5b0fc5b67672d771850dc19bbee03c1381e19322803d7" +checksum = "c151a2a5ef800297b4e79efa4f4bec035c5f51d5ae587287c9b952bdf734cacd" dependencies = [ "log 0.4.22", "presser", "thiserror", - "winapi 0.3.9", "windows", ] @@ -1014,21 +982,6 @@ dependencies = [ ] [[package]] -name = "hassle-rs" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af2a7e73e1f34c48da31fb668a907f250794837e08faa144fd24f0b8b741e890" -dependencies = [ - "bitflags 2.7.0", - "com", - "libc", - "libloading", - "thiserror", - "widestring", - "winapi 0.3.9", -] - -[[package]] name = "hermit-abi" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -1566,9 +1519,9 @@ dependencies = [ [[package]] name = "naga" -version = "22.1.0" +version = "23.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8bd5a652b6faf21496f2cfd88fc49989c8db0825d1f6746b1a71a6ede24a63ad" +checksum = "364f94bc34f61332abebe8cad6f6cd82a5b65cff22c828d05d0968911462ca4f" dependencies = [ "arrayvec 0.7.6", "bit-set", @@ -2087,6 +2040,12 @@ dependencies = [ ] [[package]] +name = "pollster" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f3a9f18d041e6d0e102a0a46750538147e5e8992d3b4873aaafee2520b00ce3" + +[[package]] name = "ppv-lite86" version = "0.2.20" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -2730,7 +2689,9 @@ dependencies = [ [[package]] name = "teehistorian" -version = "0.12.0" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b39af9384bec948ccd9d6d5777bbef8532ff5cabda9972b0cccff84a06139885" dependencies = [ "arrayvec 0.7.6", "nom", @@ -2741,8 +2702,6 @@ dependencies = [ [[package]] name = "teehistorian" version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1669d0b1ce36ec4918de04fc88a77137ad93ccd816d73f9ff82800e4f3c92e2" dependencies = [ "arrayvec 0.7.6", "nom", @@ -2875,21 +2834,22 @@ checksum = "d2df906b07856748fa3f6e0ad0cbaa047052d4a7dd609e231c4f72cee8c36f31" [[package]] name = "twgame" -version = "0.9.3" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c59204ffd091cdd6d2cff73851671842c291b9795d9cfb34ff5a802ec1d5a658" dependencies = [ "arrayvec 0.7.6", "bitflags 2.7.0", "hashbrown 0.14.5", "indexmap", - "log 0.4.22", "ndarray", "rand", "rand_pcg", "serde", "serde_json", - "slotmap", - "twgame-core 0.7.1", + "twgame-core 0.3.0", "twmap", + "twsnap 0.2.1", "uuid 1.11.1", "vek", ] @@ -2897,8 +2857,6 @@ dependencies = [ [[package]] name = "twgame" version = "0.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2414e8c25df50e78cdeb486ef648599a22a68fbbd220ac2bd1ac10cdd74fc78d" dependencies = [ "arrayvec 0.7.6", "bitflags 2.7.0", @@ -2911,7 +2869,7 @@ dependencies = [ "serde", "serde_json", "slotmap", - "twgame-core 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", + "twgame-core 0.7.1", "twmap", "uuid 1.11.1", "vek", @@ -2919,16 +2877,21 @@ dependencies = [ [[package]] name = "twgame-core" -version = "0.7.1" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd991e8dbf1c167325bfd7635801a81a01894adfc6cf64f3c4961af2747ff33a" dependencies = [ + "bincode", + "bitflags 2.7.0", + "buffer", "hex", - "log 0.4.22", "pre-rfc3243-libtw2-gamenet-ddnet", "pre-rfc3243-libtw2-gamenet-teeworlds-0-7", "pre-rfc3243-libtw2-packer", "serde", - "teehistorian 0.12.0", - "twsnap 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", + "teehistorian 0.11.1", + "twsnap 0.2.1", + "uuid 1.11.1", "vek", "warn", ] @@ -2936,8 +2899,6 @@ dependencies = [ [[package]] name = "twgame-core" version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f5abdc9d62f450f0120c6f291818f5e7c91cb40266907bff7837f89370f60eaf" dependencies = [ "hex", "log 0.4.22", @@ -2945,7 +2906,7 @@ dependencies = [ "pre-rfc3243-libtw2-gamenet-teeworlds-0-7", "pre-rfc3243-libtw2-packer", "serde", - "teehistorian 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", + "teehistorian 0.12.0", "twsnap 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", "vek", "warn", @@ -2961,9 +2922,9 @@ dependencies = [ "ndarray", "rand_core", "rand_pcg", - "twgame 0.9.3 (registry+https://github.com/rust-lang/crates.io-index)", + "twgame 0.4.0", "twmap", - "twsnap 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", + "twsnap 0.2.1", "vek", "wgpu", "winit 0.29.15", @@ -2996,6 +2957,25 @@ dependencies = [ [[package]] name = "twsnap" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07891b4605bd1ca12054f2c601b24c3160e486b0a0e24447a432aac210cf54a2" +dependencies = [ + "arrayvec 0.7.6", + "bitflags 2.7.0", + "fixed", + "hashbrown 0.14.5", + "num_enum", + "pre-rfc3243-libtw2-common", + "pre-rfc3243-libtw2-demo", + "pre-rfc3243-libtw2-gamenet-ddnet", + "serde", + "vek", + "warn", +] + +[[package]] +name = "twsnap" version = "0.7.3" dependencies = [ "arrayvec 0.7.6", @@ -3416,9 +3396,9 @@ checksum = "53a85b86a771b1c87058196170769dd264f66c0782acf1ae6cc51bfd64b39082" [[package]] name = "wgpu" -version = "22.1.0" +version = "23.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1d1c4ba43f80542cf63a0a6ed3134629ae73e8ab51e4b765a67f3aa062eb433" +checksum = "80f70000db37c469ea9d67defdc13024ddf9a5f1b89cb2941b812ad7cde1735a" dependencies = [ "arrayvec 0.7.6", "cfg_aliases 0.1.1", @@ -3441,9 +3421,9 @@ dependencies = [ [[package]] name = "wgpu-core" -version = "22.1.0" +version = "23.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0348c840d1051b8e86c3bcd31206080c5e71e5933dabd79be1ce732b0b2f089a" +checksum = "d63c3c478de8e7e01786479919c8769f62a22eec16788d8c2ac77ce2c132778a" dependencies = [ "arrayvec 0.7.6", "bit-vec", @@ -3466,9 +3446,9 @@ dependencies = [ [[package]] name = "wgpu-hal" -version = "22.0.0" +version = "23.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6bbf4b4de8b2a83c0401d9e5ae0080a2792055f25859a02bf9be97952bbed4f" +checksum = "89364b8a0b211adc7b16aeaf1bd5ad4a919c1154b44c9ce27838213ba05fd821" dependencies = [ "android_system_properties", "arrayvec 0.7.6", @@ -3476,15 +3456,14 @@ dependencies = [ "bit-set", "bitflags 2.7.0", "block", + "bytemuck", "cfg_aliases 0.1.1", "core-graphics-types", - "d3d12", "glow", "glutin_wgl_sys", "gpu-alloc", "gpu-allocator", "gpu-descriptor", - "hassle-rs", "js-sys", "khronos-egl", "libc", @@ -3506,14 +3485,15 @@ dependencies = [ "wasm-bindgen", "web-sys", "wgpu-types", - "winapi 0.3.9", + "windows", + "windows-core", ] [[package]] name = "wgpu-types" -version = "22.0.0" +version = "23.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc9d91f0e2c4b51434dfa6db77846f2793149d8e73f800fa2e41f52b8eac3c5d" +checksum = "610f6ff27778148c31093f3b03abc4840f9636d58d597ca2f5977433acfe0068" dependencies = [ "bitflags 2.7.0", "js-sys", @@ -3521,12 +3501,6 @@ dependencies = [ ] [[package]] -name = "widestring" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7219d36b6eac893fa81e84ebe06485e7dcbb616177469b142df14f1f4deb1311" - -[[package]] name = "winapi" version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -3571,9 +3545,9 @@ checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] name = "windows" -version = "0.52.0" +version = "0.58.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e48a53791691ab099e5e2ad123536d0fff50652600abaf43bbf952894110d0be" +checksum = "dd04d41d93c4992d421894c18c8b43496aa748dd4c081bac0dc93eb0489272b6" dependencies = [ "windows-core", "windows-targets 0.52.6", @@ -3581,10 +3555,55 @@ dependencies = [ [[package]] name = "windows-core" -version = "0.52.0" +version = "0.58.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ba6d44ec8c2591c134257ce647b7ea6b20335bf6379a27dac5f1641fcf59f99" +dependencies = [ + "windows-implement", + "windows-interface", + "windows-result", + "windows-strings", + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-implement" +version = "0.58.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2bbd5b46c938e506ecbce286b6628a02171d56153ba733b6c741fc627ec9579b" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.96", +] + +[[package]] +name = "windows-interface" +version = "0.58.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "053c4c462dc91d3b1504c6fe5a726dd15e216ba718e84a0e46a88fbe5ded3515" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.96", +] + +[[package]] +name = "windows-result" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d1043d8214f791817bab27572aaa8af63732e11bf84aa21a45a78d6c317ae0e" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-strings" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" +checksum = "4cd9b125c486025df0eabcb585e62173c6c9eddcec5d117d3b6e8c30e2ee4d10" dependencies = [ + "windows-result", "windows-targets 0.52.6", ] diff --git a/client/Cargo.toml b/client/Cargo.toml index 471a905..8101167 100644 --- a/client/Cargo.toml +++ b/client/Cargo.toml @@ -10,7 +10,8 @@ anyhow = "1.0.95" arrayvec = "0.5.2" warn = ">=0.1.1,<0.3.0" xdg = "2.5.2" - +wgpu = "23.0.1" +pollster = "0.4.0" winit = "0.30.8" twgame = { path = "../../twgame/twgame" } diff --git a/client/src/main.rs b/client/src/main.rs index ab05178..8373db9 100644 --- a/client/src/main.rs +++ b/client/src/main.rs @@ -4,6 +4,7 @@ use window::WindowState; use winit::event_loop::EventLoop; pub mod client; +pub mod renderer; pub mod window; fn main() -> Result<()> { diff --git a/client/src/renderer.rs b/client/src/renderer.rs new file mode 100644 index 0000000..c8f7f0b --- /dev/null +++ b/client/src/renderer.rs @@ -0,0 +1,76 @@ +use std::sync::Arc; + +use anyhow::{Result, anyhow}; +use pollster::FutureExt; +use twgpu::{ + Camera, GpuCamera, + map::{GpuMapData, GpuMapStatic}, + shared::Rng, + sprites::{ParticleData, SpriteTextures, SpritesData, SpritesStatic}, + textures::Samplers, +}; +use wgpu::{ + Backends, DeviceDescriptor, Features, Instance, InstanceDescriptor, Limits, MemoryHints, + PowerPreference, RequestAdapterOptions, TextureFormat, +}; +use winit::window::Window; + +pub struct Renderer<'a> { + window: &'a Window, +} + +impl<'a> Renderer<'a> { + pub fn new(window: &'a Window) -> Result<Self> { + let texture_format = TextureFormat::Bgra8UnormSrgb; + + let instance = Instance::new(InstanceDescriptor { + backends: Backends::all(), + ..Default::default() + }); + + let surface = instance.create_surface(window)?; + + let adapter = instance + .request_adapter(&RequestAdapterOptions { + power_preference: PowerPreference::HighPerformance, + compatible_surface: Some(&surface), + force_fallback_adapter: false, + }) + .block_on() + .ok_or(anyhow!("no adapter found"))?; + + eprintln!("Adapter {:#?}", adapter.limits()); + let (device, queue) = adapter + .request_device( + &DeviceDescriptor { + label: None, + required_features: Features::default(), + required_limits: Limits::default(), + memory_hints: MemoryHints::Performance, + }, + None, + ) + .block_on()?; + + let samplers = Arc::new(Samplers::new(&device)); + let mut camera = Camera::new(1.); + let gpu_camera = Arc::new(GpuCamera::upload(&camera, &device)); + + let map_static = GpuMapStatic::new(texture_format, &device); + let map_data = GpuMapData::upload(&twmap, &device, &queue); + let map_render = + map_static.prepare_render(&twmap, &map_data, &gpu_camera, &samplers, &device); + + let sprites_static = SpritesStatic::new(texture_format, &device); + let mut sprites_data = SpritesData::new(&device); + let mut particle_data = ParticleData::new(demo.current_time(), &device); + let mut textures = SpriteTextures::new(&device, &queue, &gpu_camera, &samplers); + let mut rng = Rng::new(0); + init_sprite_textures(&mut textures, twmap.version, &device, &queue)?; + let blit = Arc::new(Blit::new(&device)); + let mut skin_manager = SkinManager::new(blit, &mut textures, device.clone(), queue.clone()); + + Self { window } + } + pub fn redraw() {} +} diff --git a/client/src/window.rs b/client/src/window.rs index f003574..d0296e7 100644 --- a/client/src/window.rs +++ b/client/src/window.rs @@ -1,3 +1,4 @@ +use crate::renderer::Renderer; use winit::{ application::ApplicationHandler, event::WindowEvent, @@ -6,7 +7,7 @@ use winit::{ }; pub struct WindowState { - window: Option<Window>, + window: Option<(Window, Renderer<'static>)>, } impl WindowState { @@ -16,11 +17,11 @@ impl WindowState { } impl ApplicationHandler for WindowState { fn resumed(&mut self, event_loop: &ActiveEventLoop) { - self.window = Some( - event_loop - .create_window(WindowAttributes::default().with_maximized(true)) - .unwrap(), - ) + let window = event_loop + .create_window(WindowAttributes::default().with_maximized(true)) + .unwrap(); + let renderer = Renderer::new(unsafe { std::mem::transmute(&window) }); + self.window = Some((window, renderer)) } fn window_event( @@ -29,7 +30,7 @@ impl ApplicationHandler for WindowState { window_id: WindowId, event: WindowEvent, ) { - if let Some(win) = &self.window { + if let Some((win, ren)) = &self.window { match event { WindowEvent::RedrawRequested => {} _ => (), @@ -37,3 +38,12 @@ impl ApplicationHandler for WindowState { } } } + +impl Drop for WindowState { + fn drop(&mut self) { + if let Some((win, ren)) = self.window.take() { + drop(ren); + drop(win); + } + } +} |