From 5d0c977b5bf12500427bef1216673507f4581fc9 Mon Sep 17 00:00:00 2001 From: mars Date: Thu, 12 May 2022 08:16:32 -0600 Subject: [PATCH] Split TransformedMesh into components --- src/legion.rs | 16 +++++++--------- src/main.rs | 3 +-- src/pass/mesh.rs | 28 ++++++++++++++++++---------- src/scene.rs | 13 +------------ 4 files changed, 27 insertions(+), 33 deletions(-) diff --git a/src/legion.rs b/src/legion.rs index 2f43faf..504f804 100644 --- a/src/legion.rs +++ b/src/legion.rs @@ -80,18 +80,16 @@ fn render( } } -#[system] +#[system(for_each)] fn draw_transformed_meshes( #[resource] mesh_pass: &pass::RenderPassBox, - world: &SubWorld, - query: &mut Query<&scene::TransformedMesh>, + transform: &scene::Transform, + mesh: &scene::Mesh, ) { - let transformed: Vec<_> = query.iter(world).map(|m| m.clone()).collect(); - mesh_pass - .get_meshes() - .write() - .transformed - .extend_from_slice(transformed.as_slice()); + mesh_pass.add_transformed_meshes(&[mesh::TransformedMesh { + transform: transform.transform, + mesh: mesh.mesh, + }]); } #[system(for_each)] diff --git a/src/main.rs b/src/main.rs index 7bc2820..8fa2164 100644 --- a/src/main.rs +++ b/src/main.rs @@ -110,8 +110,7 @@ fn main() { let translation = glam::Vec3::new(x as f32, y as f32, z as f32); let transform = glam::Mat4::from_translation(translation); world.push(( - cyborg::scene::TransformedMesh { - transform, + cyborg::scene::Mesh { mesh: example_mesh.clone(), }, cyborg::scene::Transform { transform }, diff --git a/src/pass/mesh.rs b/src/pass/mesh.rs index 8efe848..880955b 100644 --- a/src/pass/mesh.rs +++ b/src/pass/mesh.rs @@ -1,10 +1,10 @@ use super::*; -use crate::scene; use crate::shader::{ShaderHandle, ShaderStore}; use crate::storage::mesh::*; use crate::storage::GpuVec; use crate::viewport::ViewportInfo; use crate::RenderLayouts; +use parking_lot::RwLock; #[derive(Clone)] pub struct ShaderInfo { @@ -41,6 +41,12 @@ impl Vertex { pub type Index = u32; +#[derive(Clone, Debug)] +pub struct TransformedMesh { + pub mesh: MeshHandle, + pub transform: glam::Mat4, +} + #[repr(C)] #[derive(Copy, Clone, bytemuck::Pod, bytemuck::Zeroable)] struct SkinningUniform { @@ -88,7 +94,7 @@ pub struct MeshPass { depth_pipeline: wgpu::RenderPipeline, opaque_pipeline: wgpu::RenderPipeline, target_info: ViewportInfo, - meshes: scene::MeshesHandle, + transformed_meshes: RwLock>, } impl MeshPass { @@ -250,7 +256,7 @@ impl MeshPass { depth_pipeline, opaque_pipeline, target_info, - meshes: Default::default(), + transformed_meshes: Default::default(), } } @@ -266,8 +272,8 @@ impl MeshPass { self.index_attr_id } - pub fn get_meshes(&self) -> &scene::MeshesHandle { - &self.meshes + pub fn add_transformed_meshes(&self, meshes: &[TransformedMesh]) { + self.transformed_meshes.write().extend_from_slice(meshes); } } @@ -306,12 +312,14 @@ impl RenderPass for MeshPass { data.groups.clear(); data.skinning_uniforms.clear(); - let mut meshes_lock = self.meshes.write(); + let mut transformed_meshes_lock = self.transformed_meshes.write(); let mesh_bindings = self .mesh_pool - .iter_meshes(self.mesh_layout_id, meshes_lock.transformed.iter(), |i| { - &i.mesh - }) + .iter_meshes( + self.mesh_layout_id, + transformed_meshes_lock.iter(), + |i| &i.mesh, + ) .unwrap(); let mut skinned_cursor = 0; @@ -399,7 +407,7 @@ impl RenderPass for MeshPass { data.skinned_vertices.write(&queue); data.skinning_uniforms.write(&queue); - meshes_lock.transformed.clear(); + transformed_meshes_lock.clear(); } fn record_commands(&self, data: PhaseData<&FrameData>, cmds: &mut wgpu::CommandEncoder) { diff --git a/src/scene.rs b/src/scene.rs index 1f4f2f2..b0cec60 100644 --- a/src/scene.rs +++ b/src/scene.rs @@ -4,28 +4,17 @@ //! querying component and resource data framework-agnostically use crate::storage::mesh::MeshHandle; -use parking_lot::RwLock; -use std::sync::Arc; #[derive(Clone, Debug)] pub struct Transform { pub transform: glam::Mat4, } -// TODO split into separate transform and mesh handle components #[derive(Clone, Debug)] -pub struct TransformedMesh { - pub transform: glam::Mat4, +pub struct Mesh { pub mesh: MeshHandle, } -#[derive(Default)] -pub struct Meshes { - pub transformed: Vec, -} - -pub type MeshesHandle = Arc>; - #[repr(C)] #[derive(Copy, Clone, bytemuck::Pod, bytemuck::Zeroable)] pub struct DebugVertex {