summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormetamuffin <metamuffin@disroot.org>2025-01-05 20:31:28 +0100
committermetamuffin <metamuffin@disroot.org>2025-01-05 20:31:28 +0100
commita6f57036bc954bab45d61fb41c1bd0a27001bad6 (patch)
tree2d01687549003cd2c38c9fc772e4ba543cd1b646
parentf2fa92e701b8da8e9d2e091ade21784623710374 (diff)
downloadweareserver-a6f57036bc954bab45d61fb41c1bd0a27001bad6.tar
weareserver-a6f57036bc954bab45d61fb41c1bd0a27001bad6.tar.bz2
weareserver-a6f57036bc954bab45d61fb41c1bd0a27001bad6.tar.zst
a
-rw-r--r--Cargo.lock109
-rw-r--r--a.md6
-rw-r--r--server/src/main.rs2
-rw-r--r--shared/Cargo.toml1
-rw-r--r--shared/src/packets.rs6
-rw-r--r--shared/src/resources.rs33
-rw-r--r--shared/src/store.rs54
-rw-r--r--world/src/main.rs61
8 files changed, 212 insertions, 60 deletions
diff --git a/Cargo.lock b/Cargo.lock
index 6085ca6..0c9f81c 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -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"
diff --git a/a.md b/a.md
index 3984d90..8eb1233 100644
--- a/a.md
+++ b/a.md
@@ -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)?;
+ }
+ }
+ _ => (),
+ }
+ }
}