1use crabslab::{Array, Id, Slab, SlabItem};
4use glam::{Vec3, Vec3Swizzles, Vec4};
5use spirv_std::spirv;
6
7use crate::{
8 geometry::{shader::GeometryDescriptor, Vertex},
9 primitive::shader::{PrimitiveDescriptor, VertexInfo},
10};
11
12#[inline(never)]
16#[spirv(fragment)]
17pub fn passthru_fragment(in_color: Vec4, output: &mut Vec4) {
18 *output = in_color;
19}
20
21#[spirv(vertex)]
26pub fn implicit_isosceles_vertex(
27 #[spirv(vertex_index)] vertex_index: u32,
29
30 out_color: &mut Vec4,
31 #[spirv(position)] clip_pos: &mut Vec4,
32) {
33 let pos = {
34 let x = (1 - vertex_index as i32) as f32 * 0.5;
35 let y = (((vertex_index & 1) as f32 * 2.0) - 1.0) * 0.5;
36 Vec4::new(x, y, 0.0, 1.0)
37 };
38 *out_color = Vec4::new(1.0, 0.0, 0.0, 1.0);
39 *clip_pos = pos;
40}
41
42#[spirv(vertex)]
46pub fn slabbed_vertices_no_instance(
47 #[spirv(vertex_index)] vertex_index: u32,
49
50 #[spirv(storage_buffer, descriptor_set = 0, binding = 0)] slab: &[u32],
51
52 out_color: &mut Vec4,
53 #[spirv(position)] clip_pos: &mut Vec4,
54) {
55 let vertex_id = Id::<Vertex>::from(vertex_index as usize * Vertex::SLAB_SIZE);
56 let vertex = slab.read(vertex_id);
57 *clip_pos = vertex.position.extend(1.0);
58 *out_color = vertex.color;
59}
60
61#[spirv(vertex)]
65pub fn slabbed_vertices(
66 #[spirv(instance_index)] array_id: Id<Array<(Vec3, Vec4)>>,
68 #[spirv(vertex_index)] vertex_index: u32,
70
71 #[spirv(storage_buffer, descriptor_set = 0, binding = 0)] slab: &[u32],
72
73 out_color: &mut Vec4,
74 #[spirv(position)] clip_pos: &mut Vec4,
75) {
76 let array = slab.read(array_id);
77 let vertex_id = array.at(vertex_index as usize);
78 let (position, color) = slab.read(vertex_id);
79 *clip_pos = position.extend(1.0);
80 *out_color = color;
81}
82
83#[spirv(vertex)]
93pub fn slabbed_renderlet(
94 #[spirv(instance_index)] primitive_id: Id<PrimitiveDescriptor>,
96 #[spirv(vertex_index)] vertex_index: u32,
98
99 #[spirv(storage_buffer, descriptor_set = 0, binding = 0)] slab: &[u32],
100
101 out_color: &mut Vec4,
102 #[spirv(position)] clip_pos: &mut Vec4,
103) {
104 let prim = slab.read(primitive_id);
105 let VertexInfo {
106 vertex,
107 model_matrix,
108 ..
109 } = prim.get_vertex_info(vertex_index, slab);
110 let camera_id =
111 slab.read_unchecked(prim.geometry_descriptor_id + GeometryDescriptor::OFFSET_OF_CAMERA_ID);
112 let camera = slab.read(camera_id);
113 *clip_pos = camera.view_projection() * model_matrix * vertex.position.xyz().extend(1.0);
114 *out_color = vertex.color;
115}