summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--a.md4
-rw-r--r--client/src/scene_prepare.rs24
-rw-r--r--client/src/scene_render.rs14
-rw-r--r--shared/src/lib.rs2
-rw-r--r--shared/src/resources.rs24
-rw-r--r--world/src/main.rs16
6 files changed, 62 insertions, 22 deletions
diff --git a/a.md b/a.md
index d36109c..5c1e261 100644
--- a/a.md
+++ b/a.md
@@ -20,14 +20,14 @@ len 08 sound(id: Obj, data: Vec<u8>)
### Prefab
```
-Prefab = *(pos:f32x3 rot:f32x3 part)
+Prefab = *(pos:f32x3 mat:f32_3x3 part:Res<Part>)
```
### Part
```
Part = *(len_key:u16 len_value:u16 *(key:u8) *(value:u8))
-Attribute = 0x01 value:f32 / 0x02 buffer:Res / 0x03 texture:Res
+Attribute = 0x01 value:f32 / 0x02 buffer:Res / 0x03 texture:Res<Texture>
```
| Key | Value Type |
diff --git a/client/src/scene_prepare.rs b/client/src/scene_prepare.rs
index f069b5d..30c1742 100644
--- a/client/src/scene_prepare.rs
+++ b/client/src/scene_prepare.rs
@@ -3,16 +3,23 @@ use std::{
collections::{HashMap, HashSet},
sync::Arc,
};
-use weareshared::{packets::Resource, resources::Part, tree::SceneTree};
+use weareshared::{
+ packets::{ReadWrite, Resource},
+ resources::Prefab,
+ tree::SceneTree,
+};
use wgpu::Buffer;
+use crate::download::Downloader;
+
pub struct ScenePreparer {
index_buffers: HashMap<Resource, Arc<Buffer>>,
vertex_buffers_x3: HashMap<[Resource; 1], Arc<Buffer>>,
vertex_buffers_x2: HashMap<[Resource; 2], Arc<Buffer>>,
vertex_buffers_x1: HashMap<[Resource; 3], Arc<Buffer>>,
- parts: HashMap<Resource, Arc<Part>>,
+ parts: HashMap<Resource, Arc<RPart>>,
prefabs: HashMap<Resource, RPrefab>,
+ prefabs_needed: HashSet<Resource>,
}
pub struct RPrefab(pub Vec<Arc<RPart>>);
@@ -32,11 +39,16 @@ impl ScenePreparer {
vertex_buffers_x1: HashMap::new(),
parts: HashMap::new(),
prefabs: HashMap::new(),
+ prefabs_needed: HashSet::new(),
}
}
- fn update(&mut self, tree: &SceneTree) -> Result<()> {
- let need = tree.objects.values().map(|o| o.res).collect::<HashSet<_>>();
-
- for n in need {}
+ fn update(&mut self, dls: &mut Downloader) -> Result<()> {
+ for pres in &self.prefabs_needed {
+ if let Some(buf) = dls.try_get(*pres)? {
+ let prefab = Prefab::read(&mut buf.as_slice())?;
+
+ }
+ }
+ Ok(())
}
}
diff --git a/client/src/scene_render.rs b/client/src/scene_render.rs
index d19b083..f80f6c2 100644
--- a/client/src/scene_render.rs
+++ b/client/src/scene_render.rs
@@ -1,9 +1,9 @@
-use std::collections::HashMap;
+use std::collections::{HashMap, HashSet};
use weareshared::{packets::Resource, tree::SceneTree};
use wgpu::{
- BindGroup, BindGroupDescriptor, BindGroupLayoutDescriptor, BlendState, Buffer, Color,
- ColorTargetState, ColorWrites, CommandEncoder, Device, FragmentState, FrontFace, IndexFormat,
- LoadOp, MultisampleState, Operations, PipelineCompilationOptions, PipelineLayoutDescriptor,
+ BindGroup, BindGroupDescriptor, BindGroupLayoutDescriptor, BlendState, Color, ColorTargetState,
+ ColorWrites, CommandEncoder, Device, FragmentState, FrontFace, IndexFormat, LoadOp,
+ MultisampleState, Operations, PipelineCompilationOptions, PipelineLayoutDescriptor,
PolygonMode, PrimitiveState, PrimitiveTopology, RenderPassColorAttachment,
RenderPassDescriptor, RenderPipeline, RenderPipelineDescriptor, StoreOp, TextureFormat,
TextureView, VertexAttribute, VertexBufferLayout, VertexFormat, VertexState, VertexStepMode,
@@ -16,6 +16,7 @@ pub struct ScenePipeline {
pipeline: RenderPipeline,
bind_group: BindGroup,
prefabs: HashMap<Resource, RPrefab>,
+ prefabs_needed: HashSet<Resource>,
}
impl ScenePipeline {
@@ -85,10 +86,11 @@ impl ScenePipeline {
Self {
bind_group,
pipeline,
+ prefabs_needed: HashSet::new(),
prefabs: HashMap::new(),
}
}
- pub fn draw(&self, commands: &mut CommandEncoder, target: &TextureView, scene: &SceneTree) {
+ pub fn draw(&mut self, commands: &mut CommandEncoder, target: &TextureView, scene: &SceneTree) {
let mut rpass = commands.begin_render_pass(&RenderPassDescriptor {
label: None,
color_attachments: &[Some(RenderPassColorAttachment {
@@ -117,6 +119,8 @@ impl ScenePipeline {
rpass.set_vertex_buffer(1, part.normals.slice(..));
rpass.draw_indexed(0..part.index_count, 0, 0..1);
}
+ } else {
+ self.prefabs_needed.insert(ob.res);
}
}
}
diff --git a/shared/src/lib.rs b/shared/src/lib.rs
index 45b31da..56c1fe4 100644
--- a/shared/src/lib.rs
+++ b/shared/src/lib.rs
@@ -4,3 +4,5 @@ pub mod packets;
pub mod resources;
pub mod store;
pub mod tree;
+
+pub use glam::{Affine3A, Mat3A, Vec3A};
diff --git a/shared/src/resources.rs b/shared/src/resources.rs
index e59ea25..6741936 100644
--- a/shared/src/resources.rs
+++ b/shared/src/resources.rs
@@ -1,11 +1,11 @@
use crate::packets::{ReadWrite, Resource};
use anyhow::{Result, bail};
-use glam::Vec3;
+use glam::{Affine3A, Vec3A};
use log::warn;
use std::io::{Read, Write};
#[derive(Debug, Default, Clone)]
-pub struct Prefab(pub Vec<(Vec3, Vec3, Resource)>);
+pub struct Prefab(pub Vec<(Affine3A, Resource)>);
#[derive(Debug, Default, Clone)]
pub struct Part {
@@ -33,9 +33,8 @@ pub struct IndexArray(pub Vec<[u16; 3]>);
impl ReadWrite for Prefab {
fn write(&self, w: &mut dyn Write) -> Result<()> {
- for (pos, rot, res) in self.0.clone() {
- pos.write(w)?;
- rot.write(w)?;
+ for (aff, res) in self.0.clone() {
+ aff.write(w)?;
res.write(w)?;
}
Ok(())
@@ -45,7 +44,7 @@ impl ReadWrite for Prefab {
let mut g = Vec::new();
r.read_to_end(&mut g)?;
while !g.is_empty() {
- s.0.push((Vec3::read(r)?, Vec3::read(r)?, Resource::read(r)?))
+ s.0.push((Affine3A::read(r)?, Resource::read(r)?))
}
Ok(s)
}
@@ -186,7 +185,7 @@ impl ReadWrite for Attribute {
}
}
-impl ReadWrite for Vec3 {
+impl ReadWrite for Vec3A {
fn write(&self, w: &mut dyn Write) -> Result<()> {
w.write_all(&self.x.to_be_bytes())?;
w.write_all(&self.y.to_be_bytes())?;
@@ -197,3 +196,14 @@ impl ReadWrite for Vec3 {
Ok(Self::new(f32::read(r)?, f32::read(r)?, f32::read(r)?))
}
}
+impl ReadWrite for Affine3A {
+ fn write(&self, w: &mut dyn Write) -> Result<()> {
+ for v in self.to_cols_array() {
+ v.write(w)?
+ }
+ Ok(())
+ }
+ fn read(r: &mut dyn Read) -> Result<Self> {
+ Ok(Self::from_cols_array(&[(); 12].try_map(|()| f32::read(r))?))
+ }
+}
diff --git a/world/src/main.rs b/world/src/main.rs
index 772c87d..fe71e79 100644
--- a/world/src/main.rs
+++ b/world/src/main.rs
@@ -6,8 +6,9 @@ use std::{
path::PathBuf,
};
use weareshared::{
+ Affine3A, Mat3A, Vec3A,
packets::{Object, Packet, ReadWrite},
- resources::{Attribute, AttributeArray, IndexArray, Part},
+ resources::{Attribute, AttributeArray, IndexArray, Part, Prefab},
store::ResourceStore,
};
@@ -26,6 +27,7 @@ fn main() -> Result<()> {
let (gltf, buffers, _) = gltf::import(args.scene)?;
+ let mut prefab = Prefab::default();
for node in gltf.nodes() {
if let Some(mesh) = node.mesh() {
for p in mesh.primitives() {
@@ -71,11 +73,21 @@ fn main() -> Result<()> {
}
.write_alloc(),
)?;
- Packet::Add(Object::new(), part).write(&mut sock)?;
+
+ let mat = node.transform().matrix();
+ let aff = Affine3A::from_cols_array_2d(&[
+ [mat[0][0], mat[0][1], mat[0][2]],
+ [mat[1][0], mat[1][1], mat[1][2]],
+ [mat[2][0], mat[2][1], mat[2][2]],
+ [mat[3][0], mat[3][1], mat[3][2]],
+ ]);
+ prefab.0.push((aff, part))
}
}
}
+ Packet::Add(Object::new(), store.set(&prefab.write_alloc())?).write(&mut sock)?;
+
store.iter(|d| {
Packet::RespondResource(d.to_vec())
.write(&mut sock)