Path: blob/main/crates/bevy_pbr/src/meshlet/persistent_buffer_impls.rs
6600 views
use crate::meshlet::asset::{BvhNode, MeshletCullData};12use super::{asset::Meshlet, persistent_buffer::PersistentGpuBufferable};3use alloc::sync::Arc;4use bevy_math::Vec2;5use bevy_render::render_resource::BufferAddress;67impl PersistentGpuBufferable for Arc<[BvhNode]> {8type Metadata = u32;910fn size_in_bytes(&self) -> usize {11self.len() * size_of::<BvhNode>()12}1314fn write_bytes_le(15&self,16base_meshlet_index: Self::Metadata,17buffer_slice: &mut [u8],18buffer_offset: BufferAddress,19) {20const SIZE: usize = size_of::<BvhNode>();21for (i, &node) in self.iter().enumerate() {22let bytes: [u8; SIZE] =23bytemuck::cast(node.offset_aabbs(base_meshlet_index, buffer_offset));24buffer_slice[i * SIZE..(i + 1) * SIZE].copy_from_slice(&bytes);25}26}27}2829impl BvhNode {30fn offset_aabbs(mut self, base_meshlet_index: u32, buffer_offset: BufferAddress) -> Self {31let size = size_of::<BvhNode>();32let base_bvh_node_index = (buffer_offset / size as u64) as u32;33for i in 0..self.aabbs.len() {34self.aabbs[i].child_offset += if self.child_is_bvh_node(i) {35base_bvh_node_index36} else {37base_meshlet_index38};39}40self41}4243fn child_is_bvh_node(&self, i: usize) -> bool {44self.child_counts[i] == u8::MAX45}46}4748impl PersistentGpuBufferable for Arc<[Meshlet]> {49type Metadata = (u64, u64, u64);5051fn size_in_bytes(&self) -> usize {52self.len() * size_of::<Meshlet>()53}5455fn write_bytes_le(56&self,57(vertex_position_offset, vertex_attribute_offset, index_offset): Self::Metadata,58buffer_slice: &mut [u8],59_: BufferAddress,60) {61let vertex_position_offset = (vertex_position_offset * 8) as u32;62let vertex_attribute_offset = (vertex_attribute_offset as usize / size_of::<u32>()) as u32;63let index_offset = index_offset as u32;6465for (i, meshlet) in self.iter().enumerate() {66let size = size_of::<Meshlet>();67let i = i * size;68let bytes = bytemuck::cast::<_, [u8; size_of::<Meshlet>()]>(Meshlet {69start_vertex_position_bit: meshlet.start_vertex_position_bit70+ vertex_position_offset,71start_vertex_attribute_id: meshlet.start_vertex_attribute_id72+ vertex_attribute_offset,73start_index_id: meshlet.start_index_id + index_offset,74..*meshlet75});76buffer_slice[i..(i + size)].clone_from_slice(&bytes);77}78}79}8081impl PersistentGpuBufferable for Arc<[MeshletCullData]> {82type Metadata = ();8384fn size_in_bytes(&self) -> usize {85self.len() * size_of::<MeshletCullData>()86}8788fn write_bytes_le(&self, _: Self::Metadata, buffer_slice: &mut [u8], _: BufferAddress) {89buffer_slice.clone_from_slice(bytemuck::cast_slice(self));90}91}9293impl PersistentGpuBufferable for Arc<[u8]> {94type Metadata = ();9596fn size_in_bytes(&self) -> usize {97self.len()98}99100fn write_bytes_le(&self, _: Self::Metadata, buffer_slice: &mut [u8], _: BufferAddress) {101buffer_slice.clone_from_slice(self);102}103}104105impl PersistentGpuBufferable for Arc<[u32]> {106type Metadata = ();107108fn size_in_bytes(&self) -> usize {109self.len() * size_of::<u32>()110}111112fn write_bytes_le(&self, _: Self::Metadata, buffer_slice: &mut [u8], _: BufferAddress) {113buffer_slice.clone_from_slice(bytemuck::cast_slice(self));114}115}116117impl PersistentGpuBufferable for Arc<[Vec2]> {118type Metadata = ();119120fn size_in_bytes(&self) -> usize {121self.len() * size_of::<Vec2>()122}123124fn write_bytes_le(&self, _: Self::Metadata, buffer_slice: &mut [u8], _: BufferAddress) {125buffer_slice.clone_from_slice(bytemuck::cast_slice(self));126}127}128129130