Split TransformedMesh into components

This commit is contained in:
mars 2022-05-12 08:16:32 -06:00
parent 8f9b76fdaf
commit 5d0c977b5b
4 changed files with 27 additions and 33 deletions

View File

@ -80,18 +80,16 @@ fn render(
} }
} }
#[system] #[system(for_each)]
fn draw_transformed_meshes( fn draw_transformed_meshes(
#[resource] mesh_pass: &pass::RenderPassBox<mesh::MeshPass>, #[resource] mesh_pass: &pass::RenderPassBox<mesh::MeshPass>,
world: &SubWorld, transform: &scene::Transform,
query: &mut Query<&scene::TransformedMesh>, mesh: &scene::Mesh,
) { ) {
let transformed: Vec<_> = query.iter(world).map(|m| m.clone()).collect(); mesh_pass.add_transformed_meshes(&[mesh::TransformedMesh {
mesh_pass transform: transform.transform,
.get_meshes() mesh: mesh.mesh,
.write() }]);
.transformed
.extend_from_slice(transformed.as_slice());
} }
#[system(for_each)] #[system(for_each)]

View File

@ -110,8 +110,7 @@ fn main() {
let translation = glam::Vec3::new(x as f32, y as f32, z as f32); let translation = glam::Vec3::new(x as f32, y as f32, z as f32);
let transform = glam::Mat4::from_translation(translation); let transform = glam::Mat4::from_translation(translation);
world.push(( world.push((
cyborg::scene::TransformedMesh { cyborg::scene::Mesh {
transform,
mesh: example_mesh.clone(), mesh: example_mesh.clone(),
}, },
cyborg::scene::Transform { transform }, cyborg::scene::Transform { transform },

View File

@ -1,10 +1,10 @@
use super::*; use super::*;
use crate::scene;
use crate::shader::{ShaderHandle, ShaderStore}; use crate::shader::{ShaderHandle, ShaderStore};
use crate::storage::mesh::*; use crate::storage::mesh::*;
use crate::storage::GpuVec; use crate::storage::GpuVec;
use crate::viewport::ViewportInfo; use crate::viewport::ViewportInfo;
use crate::RenderLayouts; use crate::RenderLayouts;
use parking_lot::RwLock;
#[derive(Clone)] #[derive(Clone)]
pub struct ShaderInfo { pub struct ShaderInfo {
@ -41,6 +41,12 @@ impl Vertex {
pub type Index = u32; pub type Index = u32;
#[derive(Clone, Debug)]
pub struct TransformedMesh {
pub mesh: MeshHandle,
pub transform: glam::Mat4,
}
#[repr(C)] #[repr(C)]
#[derive(Copy, Clone, bytemuck::Pod, bytemuck::Zeroable)] #[derive(Copy, Clone, bytemuck::Pod, bytemuck::Zeroable)]
struct SkinningUniform { struct SkinningUniform {
@ -88,7 +94,7 @@ pub struct MeshPass {
depth_pipeline: wgpu::RenderPipeline, depth_pipeline: wgpu::RenderPipeline,
opaque_pipeline: wgpu::RenderPipeline, opaque_pipeline: wgpu::RenderPipeline,
target_info: ViewportInfo, target_info: ViewportInfo,
meshes: scene::MeshesHandle, transformed_meshes: RwLock<Vec<TransformedMesh>>,
} }
impl MeshPass { impl MeshPass {
@ -250,7 +256,7 @@ impl MeshPass {
depth_pipeline, depth_pipeline,
opaque_pipeline, opaque_pipeline,
target_info, target_info,
meshes: Default::default(), transformed_meshes: Default::default(),
} }
} }
@ -266,8 +272,8 @@ impl MeshPass {
self.index_attr_id self.index_attr_id
} }
pub fn get_meshes(&self) -> &scene::MeshesHandle { pub fn add_transformed_meshes(&self, meshes: &[TransformedMesh]) {
&self.meshes self.transformed_meshes.write().extend_from_slice(meshes);
} }
} }
@ -306,12 +312,14 @@ impl RenderPass for MeshPass {
data.groups.clear(); data.groups.clear();
data.skinning_uniforms.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 let mesh_bindings = self
.mesh_pool .mesh_pool
.iter_meshes(self.mesh_layout_id, meshes_lock.transformed.iter(), |i| { .iter_meshes(
&i.mesh self.mesh_layout_id,
}) transformed_meshes_lock.iter(),
|i| &i.mesh,
)
.unwrap(); .unwrap();
let mut skinned_cursor = 0; let mut skinned_cursor = 0;
@ -399,7 +407,7 @@ impl RenderPass for MeshPass {
data.skinned_vertices.write(&queue); data.skinned_vertices.write(&queue);
data.skinning_uniforms.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) { fn record_commands(&self, data: PhaseData<&FrameData>, cmds: &mut wgpu::CommandEncoder) {

View File

@ -4,28 +4,17 @@
//! querying component and resource data framework-agnostically //! querying component and resource data framework-agnostically
use crate::storage::mesh::MeshHandle; use crate::storage::mesh::MeshHandle;
use parking_lot::RwLock;
use std::sync::Arc;
#[derive(Clone, Debug)] #[derive(Clone, Debug)]
pub struct Transform { pub struct Transform {
pub transform: glam::Mat4, pub transform: glam::Mat4,
} }
// TODO split into separate transform and mesh handle components
#[derive(Clone, Debug)] #[derive(Clone, Debug)]
pub struct TransformedMesh { pub struct Mesh {
pub transform: glam::Mat4,
pub mesh: MeshHandle, pub mesh: MeshHandle,
} }
#[derive(Default)]
pub struct Meshes {
pub transformed: Vec<TransformedMesh>,
}
pub type MeshesHandle = Arc<RwLock<Meshes>>;
#[repr(C)] #[repr(C)]
#[derive(Copy, Clone, bytemuck::Pod, bytemuck::Zeroable)] #[derive(Copy, Clone, bytemuck::Pod, bytemuck::Zeroable)]
pub struct DebugVertex { pub struct DebugVertex {