aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormetamuffin <metamuffin@disroot.org>2025-01-19 11:28:12 +0100
committermetamuffin <metamuffin@disroot.org>2025-01-19 11:28:12 +0100
commitd39a7d62e7bdc63b2055ad93bf511cdd1e40e69d (patch)
treecf592eda16699b9d1022df3dacae563021d25324
parent6e49570fcf657009179b9a1b462a8ca30e824bce (diff)
downloadtwclient-d39a7d62e7bdc63b2055ad93bf511cdd1e40e69d.tar
twclient-d39a7d62e7bdc63b2055ad93bf511cdd1e40e69d.tar.bz2
twclient-d39a7d62e7bdc63b2055ad93bf511cdd1e40e69d.tar.zst
a
-rw-r--r--Cargo.lock235
-rw-r--r--client/Cargo.toml3
-rw-r--r--client/src/main.rs1
-rw-r--r--client/src/renderer.rs76
-rw-r--r--client/src/window.rs24
5 files changed, 223 insertions, 116 deletions
diff --git a/Cargo.lock b/Cargo.lock
index 9c3d793..469d95b 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -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);
+ }
+ }
+}