Debug draw lists + legion systems
This commit is contained in:
parent
718a26e464
commit
8f9b76fdaf
|
@ -8,6 +8,7 @@ use crate::Renderer;
|
||||||
use legion::systems::Builder;
|
use legion::systems::Builder;
|
||||||
use legion::world::SubWorld;
|
use legion::world::SubWorld;
|
||||||
use legion::*;
|
use legion::*;
|
||||||
|
use rayon::prelude::*;
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
|
|
||||||
/// Initializes the Cyborg renderer within a Legion world.
|
/// Initializes the Cyborg renderer within a Legion world.
|
||||||
|
@ -52,6 +53,8 @@ pub fn build_renderer(resources: &mut Resources, builder: &mut Builder) {
|
||||||
resources.insert(debug_pass);
|
resources.insert(debug_pass);
|
||||||
|
|
||||||
builder.add_system(draw_transformed_meshes_system());
|
builder.add_system(draw_transformed_meshes_system());
|
||||||
|
builder.add_system(draw_debug_system());
|
||||||
|
builder.add_system(draw_debug_transformed_system());
|
||||||
builder.add_system(render_system());
|
builder.add_system(render_system());
|
||||||
builder.add_system(present_winit_system());
|
builder.add_system(present_winit_system());
|
||||||
}
|
}
|
||||||
|
@ -80,7 +83,7 @@ fn render(
|
||||||
#[system]
|
#[system]
|
||||||
fn draw_transformed_meshes(
|
fn draw_transformed_meshes(
|
||||||
#[resource] mesh_pass: &pass::RenderPassBox<mesh::MeshPass>,
|
#[resource] mesh_pass: &pass::RenderPassBox<mesh::MeshPass>,
|
||||||
world: &mut SubWorld,
|
world: &SubWorld,
|
||||||
query: &mut Query<&scene::TransformedMesh>,
|
query: &mut Query<&scene::TransformedMesh>,
|
||||||
) {
|
) {
|
||||||
let transformed: Vec<_> = query.iter(world).map(|m| m.clone()).collect();
|
let transformed: Vec<_> = query.iter(world).map(|m| m.clone()).collect();
|
||||||
|
@ -95,3 +98,34 @@ fn draw_transformed_meshes(
|
||||||
fn present_winit(viewport: &mut WinitViewport) {
|
fn present_winit(viewport: &mut WinitViewport) {
|
||||||
viewport.present();
|
viewport.present();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[system(for_each)]
|
||||||
|
#[filter(!component::<scene::Transform>())]
|
||||||
|
fn draw_debug(
|
||||||
|
#[resource] debug_pass: &pass::RenderPassBox<debug::DebugPass>,
|
||||||
|
draw_list: &scene::DebugDrawList,
|
||||||
|
) {
|
||||||
|
debug_pass.add_draw_list(draw_list);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[system]
|
||||||
|
fn draw_debug_transformed(
|
||||||
|
#[resource] debug_pass: &pass::RenderPassBox<debug::DebugPass>,
|
||||||
|
world: &SubWorld,
|
||||||
|
query: &mut Query<(&scene::DebugDrawList, &scene::Transform)>,
|
||||||
|
) {
|
||||||
|
query.par_iter_chunks(world).for_each(|draw_list_chunk| {
|
||||||
|
let mut sub_list = scene::DebugDrawList::default();
|
||||||
|
for (draw_list, transform) in draw_list_chunk {
|
||||||
|
let vertices_start = sub_list.vertices.len();
|
||||||
|
sub_list.merge(draw_list);
|
||||||
|
for vertex in sub_list.vertices[vertices_start..].iter_mut() {
|
||||||
|
let position = glam::Vec3::from_slice(&vertex.position);
|
||||||
|
let transformed = transform.transform.transform_point3(position);
|
||||||
|
vertex.position = transformed.to_array();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
debug_pass.add_draw_list(&sub_list);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
17
src/main.rs
17
src/main.rs
|
@ -89,6 +89,20 @@ fn main() {
|
||||||
|
|
||||||
drop(mesh_pass);
|
drop(mesh_pass);
|
||||||
|
|
||||||
|
let example_debug_draw = cyborg::scene::DebugDrawList {
|
||||||
|
vertices: vec![
|
||||||
|
cyborg::scene::DebugVertex {
|
||||||
|
position: [0.0, 0.0, -0.5],
|
||||||
|
color: [1.0, 0.0, 0.0],
|
||||||
|
},
|
||||||
|
cyborg::scene::DebugVertex {
|
||||||
|
position: [0.0, 0.0, 0.5],
|
||||||
|
color: [0.0, 0.0, 1.0],
|
||||||
|
},
|
||||||
|
],
|
||||||
|
indices: vec![0, 1],
|
||||||
|
};
|
||||||
|
|
||||||
let r = 4;
|
let r = 4;
|
||||||
for x in -r..r {
|
for x in -r..r {
|
||||||
for y in -r..r {
|
for y in -r..r {
|
||||||
|
@ -100,7 +114,8 @@ fn main() {
|
||||||
transform,
|
transform,
|
||||||
mesh: example_mesh.clone(),
|
mesh: example_mesh.clone(),
|
||||||
},
|
},
|
||||||
(),
|
cyborg::scene::Transform { transform },
|
||||||
|
example_debug_draw.clone(),
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,8 +1,9 @@
|
||||||
use super::*;
|
use super::*;
|
||||||
|
use crate::scene::{DebugIndex as Index, DebugVertex as Vertex, DebugDrawList};
|
||||||
use crate::storage::GpuVec;
|
use crate::storage::GpuVec;
|
||||||
use crate::viewport::ViewportInfo;
|
use crate::viewport::ViewportInfo;
|
||||||
use crate::RenderLayouts;
|
use crate::RenderLayouts;
|
||||||
use crate::scene::{DebugVertex as Vertex, DebugIndex as Index};
|
use parking_lot::RwLock;
|
||||||
|
|
||||||
pub struct FrameData {
|
pub struct FrameData {
|
||||||
vertices: GpuVec<Vertex>,
|
vertices: GpuVec<Vertex>,
|
||||||
|
@ -13,6 +14,7 @@ pub struct DebugPass {
|
||||||
device: Arc<wgpu::Device>,
|
device: Arc<wgpu::Device>,
|
||||||
pipeline: wgpu::RenderPipeline,
|
pipeline: wgpu::RenderPipeline,
|
||||||
target_info: ViewportInfo,
|
target_info: ViewportInfo,
|
||||||
|
draw_list: RwLock<DebugDrawList>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl DebugPass {
|
impl DebugPass {
|
||||||
|
@ -75,8 +77,13 @@ impl DebugPass {
|
||||||
device,
|
device,
|
||||||
pipeline,
|
pipeline,
|
||||||
target_info,
|
target_info,
|
||||||
|
draw_list: Default::default(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn add_draw_list(&self, draw_list: &DebugDrawList) {
|
||||||
|
self.draw_list.write().merge(draw_list);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl RenderPass for DebugPass {
|
impl RenderPass for DebugPass {
|
||||||
|
@ -104,21 +111,15 @@ impl RenderPass for DebugPass {
|
||||||
fn begin_frame(&self, data: &mut FrameData, phases: &mut Vec<Phase>, queue: &wgpu::Queue) {
|
fn begin_frame(&self, data: &mut FrameData, phases: &mut Vec<Phase>, queue: &wgpu::Queue) {
|
||||||
phases.push(Phase::Overlay);
|
phases.push(Phase::Overlay);
|
||||||
|
|
||||||
data.vertices.clear();
|
use std::mem::replace;
|
||||||
data.indices.clear();
|
use std::ops::DerefMut;
|
||||||
|
|
||||||
data.vertices.extend_from_slice(&[
|
let mut draw_list_lock = self.draw_list.write();
|
||||||
Vertex {
|
let vertices = replace(&mut draw_list_lock.vertices, Default::default());
|
||||||
position: [0.0, 0.0, -1.0],
|
let indices = replace(&mut draw_list_lock.indices, Default::default());
|
||||||
color: [1.0, 0.0, 0.0],
|
|
||||||
},
|
|
||||||
Vertex {
|
|
||||||
position: [0.0, 0.0, 1.0],
|
|
||||||
color: [0.0, 0.0, 1.0],
|
|
||||||
},
|
|
||||||
]);
|
|
||||||
|
|
||||||
data.indices.extend_from_slice(&[0u32, 1u32]);
|
let _ = replace(data.vertices.deref_mut(), vertices);
|
||||||
|
let _ = replace(data.indices.deref_mut(), indices);
|
||||||
|
|
||||||
data.vertices.write(queue);
|
data.vertices.write(queue);
|
||||||
data.indices.write(queue);
|
data.indices.write(queue);
|
||||||
|
|
27
src/scene.rs
27
src/scene.rs
|
@ -7,6 +7,12 @@ use crate::storage::mesh::MeshHandle;
|
||||||
use parking_lot::RwLock;
|
use parking_lot::RwLock;
|
||||||
use std::sync::Arc;
|
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)]
|
#[derive(Clone, Debug)]
|
||||||
pub struct TransformedMesh {
|
pub struct TransformedMesh {
|
||||||
pub transform: glam::Mat4,
|
pub transform: glam::Mat4,
|
||||||
|
@ -42,14 +48,23 @@ impl DebugVertex {
|
||||||
|
|
||||||
pub type DebugIndex = u32;
|
pub type DebugIndex = u32;
|
||||||
|
|
||||||
pub struct DebugDraw {
|
#[derive(Clone, Default)]
|
||||||
|
pub struct DebugDrawList {
|
||||||
pub vertices: Vec<DebugVertex>,
|
pub vertices: Vec<DebugVertex>,
|
||||||
pub indices: Vec<DebugIndex>,
|
pub indices: Vec<DebugIndex>,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Default)]
|
impl DebugDrawList {
|
||||||
pub struct DebugDraws {
|
pub fn merge(&mut self, other: &Self) {
|
||||||
pub draws: Vec<DebugDraw>,
|
self.vertices.extend_from_slice(&other.vertices);
|
||||||
}
|
|
||||||
|
|
||||||
pub type DebugDrawsHandle = Arc<RwLock<DebugDraws>>;
|
let is_offset = self.indices.len();
|
||||||
|
self.indices.reserve(is_offset + other.indices.len());
|
||||||
|
|
||||||
|
for index in other.indices.iter() {
|
||||||
|
if *index < (other.vertices.len() as DebugIndex) {
|
||||||
|
self.indices.push(index + is_offset as DebugIndex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue