cyborg/src/scene.rs

65 lines
1.6 KiB
Rust

//! Traits for describing Cyborg's scene representation.
//!
//! TODO this will all need to be replaced in favor of a way to represent
//! querying component and resource data framework-agnostically
use crate::storage::mesh::MeshHandle;
#[derive(Clone, Debug)]
pub struct Transform {
pub transform: glam::Mat4,
}
#[derive(Clone, Debug)]
pub struct Mesh {
pub mesh: MeshHandle,
}
#[repr(C)]
#[derive(Copy, Clone, bytemuck::Pod, bytemuck::Zeroable)]
pub struct DebugVertex {
pub position: [f32; 3],
pub color: [f32; 3],
}
pub const DEBUG_VERTEX_ATTRS: &[wgpu::VertexAttribute] =
&wgpu::vertex_attr_array![0 => Float32x3, 1 => Float32x3];
impl DebugVertex {
pub fn desc() -> wgpu::VertexBufferLayout<'static> {
wgpu::VertexBufferLayout {
array_stride: std::mem::size_of::<Self>() as wgpu::BufferAddress,
step_mode: wgpu::VertexStepMode::Vertex,
attributes: DEBUG_VERTEX_ATTRS,
}
}
}
pub type DebugIndex = u32;
#[derive(Clone, Default)]
pub struct DebugDrawList {
pub vertices: Vec<DebugVertex>,
pub indices: Vec<DebugIndex>,
}
impl DebugDrawList {
pub fn clear(&mut self) {
self.vertices.clear();
self.indices.clear();
}
pub fn merge(&mut self, other: &Self) {
self.vertices.extend_from_slice(&other.vertices);
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);
}
}
}
}