Split TransformedMesh into components
This commit is contained in:
parent
8f9b76fdaf
commit
5d0c977b5b
|
@ -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)]
|
||||||
|
|
|
@ -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 },
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
13
src/scene.rs
13
src/scene.rs
|
@ -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 {
|
||||||
|
|
Loading…
Reference in New Issue