bevy_interleave_interface/
lib.rs

1pub mod storage;
2// pub mod texture;
3
4
5pub 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
19// TODO: migrate to PlanarSync
20pub trait PlanarSync
21where
22    Self: Default,
23    Self: Send,
24    Self: Sync,
25    Self: bevy::reflect::Reflect,
26    Self: 'static,
27{
28    type PackedType;  // Self
29    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
51// #[cfg(feature = "debug_gpu")]
52// pub debug_gpu: PlanarType,
53// TODO: when `debug_gpu` feature is enabled, add a function to access the main -> render world copied asset (for ease of test writing)
54pub 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
95// TODO: find a better name, PlanarTexture is implemented on the packed type
96pub trait PlanarTexture
97where
98    Self: PlanarSync,
99{
100    // note: planar texture's gpu type utilizes bevy's image render asset
101    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}