diff options
author | metamuffin <metamuffin@disroot.org> | 2025-01-05 20:31:28 +0100 |
---|---|---|
committer | metamuffin <metamuffin@disroot.org> | 2025-01-05 20:31:28 +0100 |
commit | a6f57036bc954bab45d61fb41c1bd0a27001bad6 (patch) | |
tree | 2d01687549003cd2c38c9fc772e4ba543cd1b646 | |
parent | f2fa92e701b8da8e9d2e091ade21784623710374 (diff) | |
download | weareserver-a6f57036bc954bab45d61fb41c1bd0a27001bad6.tar weareserver-a6f57036bc954bab45d61fb41c1bd0a27001bad6.tar.bz2 weareserver-a6f57036bc954bab45d61fb41c1bd0a27001bad6.tar.zst |
a
-rw-r--r-- | Cargo.lock | 109 | ||||
-rw-r--r-- | a.md | 6 | ||||
-rw-r--r-- | server/src/main.rs | 2 | ||||
-rw-r--r-- | shared/Cargo.toml | 1 | ||||
-rw-r--r-- | shared/src/packets.rs | 6 | ||||
-rw-r--r-- | shared/src/resources.rs | 33 | ||||
-rw-r--r-- | shared/src/store.rs | 54 | ||||
-rw-r--r-- | world/src/main.rs | 61 |
8 files changed, 212 insertions, 60 deletions
@@ -31,10 +31,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" dependencies = [ "cfg-if", - "getrandom", + "getrandom 0.2.15", "once_cell", "version_check", - "zerocopy", + "zerocopy 0.7.35", ] [[package]] @@ -606,9 +606,9 @@ version = "0.2.0-rc.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b0b8ce8218c97789f16356e7896b3714f26c2ee1079b79c0b7ae7064bb9089fa" dependencies = [ - "getrandom", + "getrandom 0.2.15", "hybrid-array", - "rand_core", + "rand_core 0.6.4", ] [[package]] @@ -785,7 +785,22 @@ checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" dependencies = [ "cfg-if", "libc", - "wasi", + "wasi 0.11.0+wasi-snapshot-preview1", +] + +[[package]] +name = "getrandom" +version = "0.3.0-rc.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a78f88e84d239c7f2619ae8b091603c26208e1cb322571f5a29d6806f56ee5e" +dependencies = [ + "cfg-if", + "js-sys", + "libc", + "rustix", + "wasi 0.13.3+wasi-0.2.2", + "wasm-bindgen", + "windows-targets 0.52.6", ] [[package]] @@ -1687,6 +1702,15 @@ 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" +checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" +dependencies = [ + "zerocopy 0.7.35", +] + +[[package]] name = "presser" version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -1735,12 +1759,43 @@ dependencies = [ ] [[package]] +name = "rand" +version = "0.9.0-beta.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8478de76992f2825a1052cc2ae9d1401cdb62687761d4100ddd69a73dc3dc48" +dependencies = [ + "rand_chacha", + "rand_core 0.9.0-beta.1", + "zerocopy 0.8.14", +] + +[[package]] +name = "rand_chacha" +version = "0.9.0-beta.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f16da77124f4ee9fabd55ce6540866e9101431863b4876de58b68797f331adf2" +dependencies = [ + "ppv-lite86", + "rand_core 0.9.0-beta.1", +] + +[[package]] name = "rand_core" version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" dependencies = [ - "getrandom", + "getrandom 0.2.15", +] + +[[package]] +name = "rand_core" +version = "0.9.0-beta.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a98fa0b8309344136abe6244130311e76997e546f76fae8054422a7539b43df7" +dependencies = [ + "getrandom 0.3.0-rc.0", + "zerocopy 0.8.14", ] [[package]] @@ -2185,6 +2240,15 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] +name = "wasi" +version = "0.13.3+wasi-0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26816d2e1a4a36a2940b96c5296ce403917633dff8f3440e9b236ed6f6bacad2" +dependencies = [ + "wit-bindgen-rt", +] + +[[package]] name = "wasm-bindgen" version = "0.2.99" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -2395,6 +2459,7 @@ dependencies = [ "bincode", "glam", "log", + "rand", "redb", "sha2", ] @@ -2906,6 +2971,15 @@ dependencies = [ ] [[package]] +name = "wit-bindgen-rt" +version = "0.33.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3268f3d866458b787f390cf61f4bbb563b922d091359f9608842999eaee3943c" +dependencies = [ + "bitflags 2.6.0", +] + +[[package]] name = "x11-dl" version = "2.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -2980,7 +3054,17 @@ version = "0.7.35" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" dependencies = [ - "zerocopy-derive", + "byteorder", + "zerocopy-derive 0.7.35", +] + +[[package]] +name = "zerocopy" +version = "0.8.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a367f292d93d4eab890745e75a778da40909cab4d6ff8173693812f79c4a2468" +dependencies = [ + "zerocopy-derive 0.8.14", ] [[package]] @@ -2995,6 +3079,17 @@ dependencies = [ ] [[package]] +name = "zerocopy-derive" +version = "0.8.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3931cb58c62c13adec22e38686b559c86a30565e16ad6e8510a337cedc611e1" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] name = "zune-core" version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -27,14 +27,14 @@ type Res = [u8; 32] ([len_key:u8] [len_value:u8] ([key:u8])* ([value:u8])*)* ``` -- vertex_attributes: `[Res<[f32]>]` -- index: `Res<[[u16;3]]>` +- vertex (mult): `[Res<[f32]>]` +- index: `Res<[[u16; 3]]>` - armature: ???? - fragment_shader: Shader - fragment_shader_data: `Res<[f32]>` - vertex_shader: Shader - vertex_shader_data: `Res<[f32]>` -- texture: Texture +- texture (mult): Texture ### Texture diff --git a/server/src/main.rs b/server/src/main.rs index 6b57d18..d9d65cc 100644 --- a/server/src/main.rs +++ b/server/src/main.rs @@ -73,7 +73,7 @@ impl State { pub fn new() -> Result<Self> { Ok(Self { tx: HashMap::new(), - store: ResourceStore::new( + store: ResourceStore::new_persistent( &xdg::BaseDirectories::with_prefix("weareserver")?.place_cache_file("resources")?, )?, tree: SceneTree::default(), diff --git a/shared/Cargo.toml b/shared/Cargo.toml index 6c37d07..8665019 100644 --- a/shared/Cargo.toml +++ b/shared/Cargo.toml @@ -10,3 +10,4 @@ glam = { version = "0.29.2", features = ["serde"] } redb = "2.4.0" sha2 = "0.11.0-pre.4" log = "0.4.22" +rand = "0.9.0-beta.1" diff --git a/shared/src/packets.rs b/shared/src/packets.rs index c480ba8..c273028 100644 --- a/shared/src/packets.rs +++ b/shared/src/packets.rs @@ -19,6 +19,12 @@ pub enum Packet { Sound(Object, Vec<u8>), } +impl Object { + pub fn new() -> Self { + Self(rand::random()) + } +} + impl Packet { pub fn serialize(&self, w: &mut impl Write) -> Result<()> { match self { diff --git a/shared/src/resources.rs b/shared/src/resources.rs index c54d10b..651eb4b 100644 --- a/shared/src/resources.rs +++ b/shared/src/resources.rs @@ -18,8 +18,10 @@ pub struct Part { pub texture: Option<Resource>, } -pub struct VertexAttributes(Vec<f32>); -pub struct Indecies(Vec<[u16; 3]>); +#[derive(Debug, Default, Clone)] +pub struct VertexAttributes(pub Vec<f32>); +#[derive(Debug, Default, Clone)] +pub struct Indecies(pub Vec<[u16; 3]>); impl Prefab { pub fn serialize(&self, w: &mut Vec<u8>) -> Result<()> { @@ -69,28 +71,28 @@ impl VertexAttributes { impl Part { pub fn serialize(&self, w: &mut Vec<u8>) -> Result<()> { for x in &self.vertex { - write_kv(w, b"vertex", &x.0)?; + write_kv(w, b"vertex", &x.0); } if let Some(x) = &self.index { - write_kv(w, b"index", &x.0)?; + write_kv(w, b"index", &x.0); } if let Some(x) = &self.armature { - write_kv(w, b"armature", &x.0)?; + write_kv(w, b"armature", &x.0); } if let Some(x) = &self.fragment_shader { - write_kv(w, b"fragment_shader", &x.0)?; + write_kv(w, b"fragment_shader", &x.0); } if let Some(x) = &self.fragment_shader_data { - write_kv(w, b"fragment_shader_data", &x.0)?; + write_kv(w, b"fragment_shader_data", &x.0); } if let Some(x) = &self.vertex_shader { - write_kv(w, b"vertex_shader", &x.0)?; + write_kv(w, b"vertex_shader", &x.0); } if let Some(x) = &self.vertex_shader_data { - write_kv(w, b"vertex_shader_data", &x.0)?; + write_kv(w, b"vertex_shader_data", &x.0); } if let Some(x) = &self.texture { - write_kv(w, b"texture", &x.0)?; + write_kv(w, b"texture", &x.0); } Ok(()) } @@ -132,10 +134,9 @@ fn read_kv(r: &mut &[u8]) -> Result<(Vec<u8>, Vec<u8>)> { r.read_exact(&mut key)?; Ok((key, value)) } -fn write_kv(w: &mut Vec<u8>, key: &[u8], value: &[u8]) -> Result<()> { - w.write_all(&(key.len() as u16).to_be_bytes())?; - w.write_all(&(value.len() as u16).to_be_bytes())?; - w.write_all(key)?; - w.write_all(value)?; - Ok(()) +fn write_kv(w: &mut Vec<u8>, key: &[u8], value: &[u8]) { + w.extend(&(key.len() as u16).to_be_bytes()); + w.extend(&(value.len() as u16).to_be_bytes()); + w.extend(key); + w.extend(value); } diff --git a/shared/src/store.rs b/shared/src/store.rs index 44e5e3d..7130021 100644 --- a/shared/src/store.rs +++ b/shared/src/store.rs @@ -2,35 +2,49 @@ use crate::packets::Resource; use anyhow::Result; use redb::{Database, TableDefinition}; use sha2::{Digest, Sha256}; -use std::path::Path; +use std::{collections::HashMap, path::Path, sync::Mutex}; const T_ENTRIES: TableDefinition<[u8; 32], &[u8]> = TableDefinition::new("e"); -pub struct ResourceStore { - db: Database, +pub enum ResourceStore { + Redb(Database), + Memory(Mutex<HashMap<Resource, Vec<u8>>>), } impl ResourceStore { - pub fn new(path: &Path) -> Result<Self> { - Ok(Self { - db: Database::create(path)?, - }) + pub fn new_persistent(path: &Path) -> Result<Self> { + Ok(Self::Redb(Database::create(path)?)) + } + pub fn new_memory() -> Self { + Self::Memory(HashMap::new().into()) } pub fn get(&self, key: Resource) -> Result<Option<Vec<u8>>> { - let txn = self.db.begin_read()?; - let ent = txn.open_table(T_ENTRIES)?; - match ent.get(key.0)? { - Some(x) => Ok(Some(x.value().to_vec())), - None => Ok(None), + match self { + ResourceStore::Redb(database) => { + let txn = database.begin_read()?; + let ent = txn.open_table(T_ENTRIES)?; + match ent.get(key.0)? { + Some(x) => Ok(Some(x.value().to_vec())), + None => Ok(None), + } + } + ResourceStore::Memory(map) => Ok(map.lock().unwrap().get(&key).map(|x| x.to_vec())), } } - pub fn set(&self, value: &[u8]) -> Result<()> { - let key = sha256(value); - let txn = self.db.begin_write()?; - let mut ent = txn.open_table(T_ENTRIES)?; - ent.insert(key, value)?; - drop(ent); - txn.commit()?; - Ok(()) + pub fn set(&self, value: &[u8]) -> Result<Resource> { + let key = Resource(sha256(value)); + match self { + ResourceStore::Redb(database) => { + let txn = database.begin_write()?; + let mut ent = txn.open_table(T_ENTRIES)?; + ent.insert(key.0, value)?; + drop(ent); + txn.commit()?; + } + ResourceStore::Memory(map) => { + map.lock().unwrap().insert(key, value.to_vec()); + } + } + Ok(key) } } diff --git a/world/src/main.rs b/world/src/main.rs index 56b62c9..28a4ec4 100644 --- a/world/src/main.rs +++ b/world/src/main.rs @@ -1,13 +1,14 @@ use anyhow::Result; use clap::Parser; -use gltf::Gltf; use std::{ - fs::File, - io::BufReader, net::{SocketAddr, TcpStream}, path::PathBuf, }; -use weareshared::resources::Part; +use weareshared::{ + packets::{Object, Packet}, + resources::{Part, Prefab, VertexAttributes}, + store::ResourceStore, +}; #[derive(Parser)] struct Args { @@ -19,21 +20,55 @@ fn main() -> Result<()> { env_logger::init_from_env("LOG"); let args = Args::parse(); - let sock = TcpStream::connect(args.address)?; + let mut sock = TcpStream::connect(args.address)?; + let store = ResourceStore::new_memory(); - let scenefile = Gltf::from_reader(BufReader::new(File::open(args.scene)?))?; - let scene = scenefile - .default_scene() - .unwrap_or(scenefile.scenes().next().unwrap()); + let (gltf, buffers, _) = gltf::import(args.scene)?; - for node in scene.nodes() { + let mut parts = Vec::new(); + for node in gltf.nodes() { if let Some(mesh) = node.mesh() { for p in mesh.primitives() { - for (sem, iter) in p.attributes() {} + let reader = p.reader(|buf| Some(&buffers[buf.index()])); + let mut attrs = vec![vec![]; 3]; + for p in reader.read_positions().unwrap() { + attrs[0].push(p[0]); + attrs[1].push(p[1]); + attrs[2].push(p[2]); + } + let part = Part { + vertex: attrs + .into_iter() + .map(|d| { + let mut out = Vec::new(); + VertexAttributes(d).serialize(&mut out)?; + store.set(&out) + }) + .collect::<Result<Vec<_>, _>>()?, + ..Part::default() + }; + let mut out = Vec::new(); + part.serialize(&mut out)?; + parts.push(store.set(&out)?); } - let part = Part { ..Part::default() }; } } - Ok(()) + let mut out = Vec::new(); + Prefab(parts).serialize(&mut out)?; + let prefab = store.set(&out)?; + + Packet::Add(Object::new(), prefab).serialize(&mut sock)?; + + loop { + let packet = Packet::deserialize(&mut sock)?; + match packet { + Packet::RequestResource(hash) => { + if let Some(d) = store.get(hash)? { + Packet::RespondResource(d).serialize(&mut sock)?; + } + } + _ => (), + } + } } |