Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
bevyengine
GitHub Repository: bevyengine/bevy
Path: blob/main/crates/bevy_pbr/src/meshlet/persistent_buffer_impls.rs
6600 views
1
use crate::meshlet::asset::{BvhNode, MeshletCullData};
2
3
use super::{asset::Meshlet, persistent_buffer::PersistentGpuBufferable};
4
use alloc::sync::Arc;
5
use bevy_math::Vec2;
6
use bevy_render::render_resource::BufferAddress;
7
8
impl PersistentGpuBufferable for Arc<[BvhNode]> {
9
type Metadata = u32;
10
11
fn size_in_bytes(&self) -> usize {
12
self.len() * size_of::<BvhNode>()
13
}
14
15
fn write_bytes_le(
16
&self,
17
base_meshlet_index: Self::Metadata,
18
buffer_slice: &mut [u8],
19
buffer_offset: BufferAddress,
20
) {
21
const SIZE: usize = size_of::<BvhNode>();
22
for (i, &node) in self.iter().enumerate() {
23
let bytes: [u8; SIZE] =
24
bytemuck::cast(node.offset_aabbs(base_meshlet_index, buffer_offset));
25
buffer_slice[i * SIZE..(i + 1) * SIZE].copy_from_slice(&bytes);
26
}
27
}
28
}
29
30
impl BvhNode {
31
fn offset_aabbs(mut self, base_meshlet_index: u32, buffer_offset: BufferAddress) -> Self {
32
let size = size_of::<BvhNode>();
33
let base_bvh_node_index = (buffer_offset / size as u64) as u32;
34
for i in 0..self.aabbs.len() {
35
self.aabbs[i].child_offset += if self.child_is_bvh_node(i) {
36
base_bvh_node_index
37
} else {
38
base_meshlet_index
39
};
40
}
41
self
42
}
43
44
fn child_is_bvh_node(&self, i: usize) -> bool {
45
self.child_counts[i] == u8::MAX
46
}
47
}
48
49
impl PersistentGpuBufferable for Arc<[Meshlet]> {
50
type Metadata = (u64, u64, u64);
51
52
fn size_in_bytes(&self) -> usize {
53
self.len() * size_of::<Meshlet>()
54
}
55
56
fn write_bytes_le(
57
&self,
58
(vertex_position_offset, vertex_attribute_offset, index_offset): Self::Metadata,
59
buffer_slice: &mut [u8],
60
_: BufferAddress,
61
) {
62
let vertex_position_offset = (vertex_position_offset * 8) as u32;
63
let vertex_attribute_offset = (vertex_attribute_offset as usize / size_of::<u32>()) as u32;
64
let index_offset = index_offset as u32;
65
66
for (i, meshlet) in self.iter().enumerate() {
67
let size = size_of::<Meshlet>();
68
let i = i * size;
69
let bytes = bytemuck::cast::<_, [u8; size_of::<Meshlet>()]>(Meshlet {
70
start_vertex_position_bit: meshlet.start_vertex_position_bit
71
+ vertex_position_offset,
72
start_vertex_attribute_id: meshlet.start_vertex_attribute_id
73
+ vertex_attribute_offset,
74
start_index_id: meshlet.start_index_id + index_offset,
75
..*meshlet
76
});
77
buffer_slice[i..(i + size)].clone_from_slice(&bytes);
78
}
79
}
80
}
81
82
impl PersistentGpuBufferable for Arc<[MeshletCullData]> {
83
type Metadata = ();
84
85
fn size_in_bytes(&self) -> usize {
86
self.len() * size_of::<MeshletCullData>()
87
}
88
89
fn write_bytes_le(&self, _: Self::Metadata, buffer_slice: &mut [u8], _: BufferAddress) {
90
buffer_slice.clone_from_slice(bytemuck::cast_slice(self));
91
}
92
}
93
94
impl PersistentGpuBufferable for Arc<[u8]> {
95
type Metadata = ();
96
97
fn size_in_bytes(&self) -> usize {
98
self.len()
99
}
100
101
fn write_bytes_le(&self, _: Self::Metadata, buffer_slice: &mut [u8], _: BufferAddress) {
102
buffer_slice.clone_from_slice(self);
103
}
104
}
105
106
impl PersistentGpuBufferable for Arc<[u32]> {
107
type Metadata = ();
108
109
fn size_in_bytes(&self) -> usize {
110
self.len() * size_of::<u32>()
111
}
112
113
fn write_bytes_le(&self, _: Self::Metadata, buffer_slice: &mut [u8], _: BufferAddress) {
114
buffer_slice.clone_from_slice(bytemuck::cast_slice(self));
115
}
116
}
117
118
impl PersistentGpuBufferable for Arc<[Vec2]> {
119
type Metadata = ();
120
121
fn size_in_bytes(&self) -> usize {
122
self.len() * size_of::<Vec2>()
123
}
124
125
fn write_bytes_le(&self, _: Self::Metadata, buffer_slice: &mut [u8], _: BufferAddress) {
126
buffer_slice.clone_from_slice(bytemuck::cast_slice(self));
127
}
128
}
129
130