bevy_interleave_interface/
lib.rs1pub mod storage;
2pub trait PlanarHandle<T>
6where
7 Self: bevy::ecs::component::Component,
8 Self: Clone,
9 Self: Default,
10 Self: bevy::reflect::FromReflect,
11 Self: bevy::reflect::GetTypeRegistration,
12 Self: bevy::reflect::Reflect,
13 T: bevy::asset::Asset,
14{
15 fn handle(&self) -> &bevy::asset::Handle<T>;
16}
17
18
19pub trait PlanarSync
21where
22 Self: Default,
23 Self: Send,
24 Self: Sync,
25 Self: bevy::reflect::Reflect,
26 Self: 'static,
27{
28 type PackedType; type PlanarType: Planar<PackedType = Self::PackedType>;
30 type PlanarTypeHandle: PlanarHandle<Self::PlanarType>;
31 type GpuPlanarType: GpuPlanar<
32 PackedType = Self::PackedType,
33 PlanarType = Self::PlanarType,
34 >;
35}
36
37
38pub trait GpuPlanar
39where
40 Self: bevy::render::render_asset::RenderAsset<SourceAsset = Self::PlanarType>,
41{
42 type PackedType;
43 type PlanarType;
44
45 fn is_empty(&self) -> bool {
46 self.len() == 0
47 }
48 fn len(&self) -> usize;
49}
50
51pub trait GpuPlanarStorage
55where
56 Self: GpuPlanar,
57 Self: bevy::render::render_asset::RenderAsset<SourceAsset = Self::PlanarType>,
58{
59 fn draw_indirect_buffer(&self) -> &bevy::render::render_resource::Buffer;
60
61 fn bind_group(
62 &self,
63 render_device: &bevy::render::renderer::RenderDevice,
64 layout: &bevy::render::render_resource::BindGroupLayout,
65 ) -> bevy::render::render_resource::BindGroup;
66
67 fn bind_group_layout(
68 render_device: &bevy::render::renderer::RenderDevice,
69 read_only: bool,
70 ) -> bevy::render::render_resource::BindGroupLayout;
71}
72
73
74
75pub trait GpuPlanarTexture
76where
77 Self: GpuPlanar,
78 Self: bevy::render::render_asset::RenderAsset<SourceAsset = Self::PlanarType>,
79{
80 fn bind_group(
81 &self,
82 render_device: &bevy::render::renderer::RenderDevice,
83 gpu_images: &bevy::render::render_asset::RenderAssets<bevy::render::texture::GpuImage>,
84 layout: &bevy::render::render_resource::BindGroupLayout,
85 ) -> bevy::render::render_resource::BindGroup;
86
87 fn bind_group_layout(
88 render_device: &bevy::render::renderer::RenderDevice,
89 ) -> bevy::render::render_resource::BindGroupLayout;
90
91 fn get_asset_handles(&self) -> Vec<bevy::asset::Handle<bevy::image::Image>>;
92}
93
94
95pub trait PlanarTexture
97where
98 Self: PlanarSync,
99{
100 fn prepare(
102 images: &mut bevy::asset::Assets<bevy::image::Image>,
103 planar: &Self::PlanarType,
104 ) -> Self::GpuPlanarType;
105
106 fn get_asset_handles(&self) -> Vec<bevy::asset::Handle<bevy::image::Image>>;
107}
108
109
110
111pub trait ReflectInterleaved {
112 type PackedType;
113
114 fn min_binding_sizes() -> &'static [usize];
115 fn ordered_field_names() -> &'static [&'static str];
116}
117
118
119pub trait Planar
120where
121 Self: bevy::asset::Asset,
122 Self: bevy::reflect::GetTypeRegistration,
123 Self: bevy::reflect::FromReflect,
124{
125 type PackedType;
126
127 fn get(&self, index: usize) -> Self::PackedType;
128 fn is_empty(&self) -> bool {
129 self.len() == 0
130 }
131 fn len(&self) -> usize;
132 fn set(&mut self, index: usize, value: Self::PackedType);
133 fn to_interleaved(&self) -> Vec<Self::PackedType>;
134
135 fn from_interleaved(packed: Vec<Self::PackedType>) -> Self where Self: Sized;
136
137 fn subset(&self, indices: &[usize]) -> Self;
138}