summaryrefslogtreecommitdiff
path: root/world/src/main.rs
blob: 4f641c3cb282540066cf10307c7bf467f863e7a2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
#![feature(iter_array_chunks)]
use anyhow::Result;
use clap::Parser;
use std::{
    net::{SocketAddr, TcpStream},
    path::PathBuf,
};
use weareshared::{
    packets::{Object, Packet},
    resources::{Indecies, Part, Prefab, VertexAttributes},
    store::ResourceStore,
};

#[derive(Parser)]
struct Args {
    address: SocketAddr,
    scene: PathBuf,
}

fn main() -> Result<()> {
    env_logger::init_from_env("LOG");
    let args = Args::parse();

    let mut sock = TcpStream::connect(args.address)?;
    let store = ResourceStore::new_memory();

    let (gltf, buffers, _) = gltf::import(args.scene)?;

    for node in gltf.nodes() {
        if let Some(mesh) = node.mesh() {
            for p in mesh.primitives() {
                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 index = reader
                    .read_indices()
                    .unwrap()
                    .into_u32()
                    .map(|e| e as u16)
                    .array_chunks::<3>()
                    .collect::<Vec<_>>();

                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<_>, _>>()?,
                    index: Some({
                        let mut out = Vec::new();
                        Indecies(index).serialize(&mut out)?;
                        store.set(&out)?
                    }),
                    ..Part::default()
                };
                let mut out = Vec::new();
                part.serialize(&mut out)?;
                Packet::Add(Object::new(), store.set(&out)?).serialize(&mut sock)?;
            }
        }
    }

    store.iter(|d| {
        Packet::RespondResource(d.to_vec())
            .serialize(&mut sock)
            .unwrap();
    })?;

    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)?;
                }
            }
            _ => (),
        }
    }
}