From 84744a9397a86445c31a37d1b2c924bc508958fc Mon Sep 17 00:00:00 2001 From: "Elijah C. Voigt" Date: Tue, 2 Jul 2024 15:40:42 -0700 Subject: [PATCH] Entity asset loading kinda sorta works... --- .cargo/config.toml | 4 - Cargo.lock | 119 ++++++++++++++++++++++++++- Cargo.toml | 11 ++- assets/levels/00/entities/van.entity | 4 +- src/save.rs | 61 ++++++++++++-- 5 files changed, 186 insertions(+), 13 deletions(-) diff --git a/.cargo/config.toml b/.cargo/config.toml index f30b913..8b49882 100644 --- a/.cargo/config.toml +++ b/.cargo/config.toml @@ -25,10 +25,6 @@ rustflags = [ [target.x86_64-pc-windows-msvc] linker = "rust-lld.exe" # Use LLD Linker -rustflags = [ - "-Zshare-generics=n", - "-Zthreads=0", # (Nightly) Use improved multithreading with the recommended amount of threads. -] [target.wasm32-unknown-unknown] runner = "wasm-server-runner" \ No newline at end of file diff --git a/Cargo.lock b/Cargo.lock index e616d04..84ffa9c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -304,6 +304,7 @@ version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "65b9eadaacf8fe971331bc3f250f35c18bc9dace3f96b483062f38ac07e3a1b4" dependencies = [ + "bevy_dylib", "bevy_internal", ] @@ -377,6 +378,7 @@ dependencies = [ "futures-io", "futures-lite", "js-sys", + "notify-debouncer-full", "parking_lot", "ron", "serde", @@ -480,6 +482,15 @@ dependencies = [ "sysinfo", ] +[[package]] +name = "bevy_dylib" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "922826e3b8f37c19836b49e18ceca662260cce87ab8faa4db6df8433903660cc" +dependencies = [ + "bevy_internal", +] + [[package]] name = "bevy_ecs" version = "0.13.2" @@ -1864,6 +1875,27 @@ dependencies = [ "simd-adler32", ] +[[package]] +name = "file-id" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6584280525fb2059cba3db2c04abf947a1a29a45ddae89f3870f8281704fafc9" +dependencies = [ + "windows-sys 0.48.0", +] + +[[package]] +name = "filetime" +version = "0.2.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ee447700ac8aa0b2f2bd7bc4462ad686ba06baa6727ac149a2d6277f0d240fd" +dependencies = [ + "cfg-if 1.0.0", + "libc", + "redox_syscall 0.4.1", + "windows-sys 0.52.0", +] + [[package]] name = "fixedbitset" version = "0.4.2" @@ -1913,6 +1945,15 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "aa9a19cbb55df58761df49b23516a86d432839add4af60fc256da840f66ed35b" +[[package]] +name = "fsevent-sys" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76ee7a02da4d231650c7cea31349b889be2f45ddb3ef3032d2ec8185f6313fd2" +dependencies = [ + "libc", +] + [[package]] name = "futures-core" version = "0.3.30" @@ -1981,7 +2022,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b922f294d9f062af517ea0bd0a036ddcf11c2842211c2f9c71a3ceee859e10b6" dependencies = [ "core-foundation", - "inotify", + "inotify 0.10.2", "io-kit-sys", "js-sys", "libc", @@ -2246,6 +2287,17 @@ version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a257582fdcde896fd96463bf2d40eefea0580021c0712a0e2b028b60b47a837a" +[[package]] +name = "inotify" +version = "0.9.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8069d3ec154eb856955c1c0fbffefbf5f3c40a104ec912d4797314c1801abff" +dependencies = [ + "bitflags 1.3.2", + "inotify-sys", + "libc", +] + [[package]] name = "inotify" version = "0.10.2" @@ -2348,6 +2400,26 @@ version = "3.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e2db585e1d738fc771bf08a151420d3ed193d9d895a36df7f6f8a9456b911ddc" +[[package]] +name = "kqueue" +version = "1.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7447f1ca1b7b563588a205fe93dea8df60fd981423a768bc1c0ded35ed147d0c" +dependencies = [ + "kqueue-sys", + "libc", +] + +[[package]] +name = "kqueue-sys" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed9625ffda8729b85e45cf04090035ac368927b8cebc34898e7c120f52e4838b" +dependencies = [ + "bitflags 1.3.2", + "libc", +] + [[package]] name = "ktx2" version = "0.3.0" @@ -2519,6 +2591,18 @@ dependencies = [ "simd-adler32", ] +[[package]] +name = "mio" +version = "0.8.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c" +dependencies = [ + "libc", + "log", + "wasi", + "windows-sys 0.48.0", +] + [[package]] name = "naga" version = "0.19.2" @@ -2618,6 +2702,39 @@ version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "610a5acd306ec67f907abe5567859a3c693fb9886eb1f012ab8f2a47bef3db51" +[[package]] +name = "notify" +version = "6.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6205bd8bb1e454ad2e27422015fb5e4f2bcc7e08fa8f27058670d208324a4d2d" +dependencies = [ + "bitflags 2.5.0", + "crossbeam-channel", + "filetime", + "fsevent-sys", + "inotify 0.9.6", + "kqueue", + "libc", + "log", + "mio", + "walkdir", + "windows-sys 0.48.0", +] + +[[package]] +name = "notify-debouncer-full" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49f5dab59c348b9b50cf7f261960a20e389feb2713636399cd9082cd4b536154" +dependencies = [ + "crossbeam-channel", + "file-id", + "log", + "notify", + "parking_lot", + "walkdir", +] + [[package]] name = "ntapi" version = "0.4.1" diff --git a/Cargo.toml b/Cargo.toml index fcad64a..fde526a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -4,7 +4,7 @@ version = "0.1.0" edition = "2021" [dependencies] -bevy = "0.13" +bevy = { version = "0.13", features = ["file_watcher", "dynamic_linking"] } wee_alloc = "*" bevy_mod_picking = "0.18" thiserror = "1" @@ -12,6 +12,15 @@ nom = "7" # Entity Uuid parsing uuid = "1.7.0" +# Enable a small amount of optimization in debug mode +[profile.dev] +opt-level = 1 + +# Enable high optimizations for dependencies (incl. Bevy), but not for our code: +[profile.dev.package."*"] +opt-level = 3 + +# Prioritize binary size for wasm [profile.wasm-release] inherits = "release" opt-level = "z" diff --git a/assets/levels/00/entities/van.entity b/assets/levels/00/entities/van.entity index 8b156a7..aaf1072 100644 --- a/assets/levels/00/entities/van.entity +++ b/assets/levels/00/entities/van.entity @@ -1,3 +1,3 @@ -name "van" +name van uuid 5c270e84-814c-4d51-9ccd-ab79d9e01f1d -transform translation 0.0 0.0 0.0 rotation 0.0 0.0 0.0 1.0 scale 1.0 1.0 1.0 \ No newline at end of file +transform translation 1.0 1.0 1.0 rotation 0.0 0.0 0.0 1.0 scale 0.5 0.5 0.5 \ No newline at end of file diff --git a/src/save.rs b/src/save.rs index 895d6b7..d6fb91e 100644 --- a/src/save.rs +++ b/src/save.rs @@ -1,3 +1,4 @@ +use bevy::{math::Vec3A, render::primitives::Aabb}; use nom::IResult; use crate::prelude::*; @@ -9,7 +10,8 @@ impl Plugin for SavePlugin { fn build(&self, app: &mut App) { app.init_asset::() .init_asset_loader::() - .add_systems(Startup, test_save_entity); + .add_systems(Startup, test_save_entity) + .add_systems(Update, check_loaded_entity_assets.run_if(on_event::>())); } } @@ -17,7 +19,7 @@ impl Plugin for SavePlugin { struct SaveEntity { transform: Option, name: Option, - uuid: Option, + uuid: Option, } impl SaveEntity { @@ -30,13 +32,16 @@ impl SaveEntity { } else if let Ok(transform) = parse::parse_save_transform(line) { entity.transform = Some(transform); } else if let Ok(uuid) = parse::parse_save_uuid(line) { - entity.uuid = Some(uuid); + entity.uuid = Some(EntityUuid(uuid)); } }); Ok(entity) } } +#[derive(Component, Clone, Debug)] +struct EntityUuid(Uuid); + mod parse { use super::*; @@ -232,6 +237,52 @@ impl AssetLoader for SaveEntityLoader { } } -fn test_save_entity(loader: Res, mut handle: Local>) { - *handle = loader.load("levels/00/entities/van.entity"); +fn test_save_entity(loader: Res, mut commands: Commands) { + let handle: Handle = loader.load("levels/00/entities/van.entity"); + commands.spawn((SpatialBundle { ..default() }, handle, ShowAabbGizmo { ..default() }, Aabb { center: Vec3A::ZERO, half_extents: Vec3A::ONE })); } + +fn check_loaded_entity_assets( + query: Query<(Entity, &Handle)>, + mut events: EventReader>, + save_entities: Res>, + mut commands: Commands, +) { + events.read().for_each(|event| { + match event { + AssetEvent::LoadedWithDependencies { id } => { + query + .iter() + .filter(|(_, handle)| handle.id() == *id) + .for_each(|(entity, _handle)|{ + let saved = save_entities.get(*id).unwrap(); + debug!("Updating entity {:?} ({:?}) because asset changed", saved.name, saved.uuid); + + let mut e = commands.entity(entity); + // Apply transform + if let Some(transform) = &saved.transform { + // TODO: Only update if different + e.insert(transform.clone()); + } else { + e.remove::(); + } + // Apply Name + if let Some(name) = &saved.name { + // TODO: Only update if different + e.insert(name.clone()); + } else { + e.remove::(); + } + // Apply Uuid + if let Some(uuid) = &saved.uuid { + // TODO: Only update if different + e.insert(uuid.clone()); + } else { + e.remove::(); + } + }); + } + _ => () + } + }) +} \ No newline at end of file