#bind-group #bevy #shader-types #packed #field #e2e #pipeline

bevy_interleave

bevy support for e2e packed to planar bind groups

5 unstable releases

new 0.3.0 Dec 20, 2024
0.2.1 Feb 19, 2024
0.2.0 Feb 19, 2024
0.1.1 Feb 11, 2024
0.1.0 Feb 11, 2024

#1298 in Game dev

Download history 1/week @ 2024-09-20 1/week @ 2024-11-01

298 downloads per month

MIT license

39KB
392 lines

bevy_interleave 🧩

test GitHub License GitHub Releases GitHub Issues crates.io

bevy support for e2e packed to planar bind groups

minimal example

use bevy_interleave::prelude::*;

#[derive(
    Debug,
    Planar,
    ReflectInterleaved,
    StorageBindings,
    TextureBindings,
)]
pub struct MyStruct {
    #[texture_format(TextureFormat::R32Sint)]
    pub field: i32,

    #[texture_format(TextureFormat::R32Uint)]
    pub field2: u32,

    #[texture_format(TextureFormat::R8Unorm)]
    pub bool_field: bool,

    #[texture_format(TextureFormat::Rgba32Uint)]
    pub array: [u32; 4],
}

fn interleaved() -> Vec<MyStruct> {
    vec![
        MyStruct { field: 0, field2: 1_u32, bool_field: true, array: [0, 1, 2, 3] },
        MyStruct { field: 2, field2: 3_u32, bool_field: false, array: [4, 5, 6, 7] },
        MyStruct { field: 4, field2: 5_u32, bool_field: true, array: [8, 9, 10, 11] },
    ];
}

fn main() {
    // TODO: add unzip implementation for Vec<MyStruct> `let planar = interleaved().unzip()`
    let planar = PlanarMyStruct::from_interleaved(interleaved());

    println!("{:?}", planar.field);
    println!("{:?}", planar.field2);
    println!("{:?}", planar.bool_field);
    println!("{:?}", planar.array);

    // Prints:
    // [0, 2, 4]
    // [1, 3, 5]
    // [true, false, true]
    // [[0, 1, 2, 3], [4, 5, 6, 7], [8, 9, 10, 11]]

    println!("\n\n{:?}", MyStruct::min_binding_sizes());
    println!("{:?}", MyStruct::ordered_field_names());

    // Prints:
    // [4, 4, 1, 16]
    // ["field", "field2", "bool_field", "array"]


    let mut app = App::new()
        .add_plugins((
            DefaultPlugins,
            PlanarPlugin::<PlanarMyStruct>::default(),
            PlanarTexturePlugin::<PlanarTextureMyStruct>::default(),
        ));

    app.sub_app_mut(bevy::render::RenderApp)
        .add_systems(
            bevy::render::Render,
            check_bind_group.in_set(bevy::render::RenderSet::QueueMeshes),
        );

    app.run();
}

fn setup_planar_asset(
    mut commands: Commands,
    mut planar_assets: ResMut<Assets<PlanarMyStruct>>,
) {
    let planar = PlanarMyStruct::from_interleaved(interleaved());

    commands.spawn(planar_assets.add(planar));
}

fn check_bind_group(
    bind_group: Query<&PlanarTextureBindGroup::<PlanarTextureMyStruct>>,
) {
    // attach bind group to render pipeline
    // size:
    //     2 x 2 x bpp
    // format:
    //     binding: 0 - texture - R32Sint - depth 1
    //     binding: 1 - texture - R32Uint - depth 1
    //     binding: 2 - texture - R8Unorm - depth 1
    //     binding: 3 - texture - Rgba32Uint - depth 1
}

why bevy?

bevy_interleave simplifies bind group creation within bevy. Planar derives can be used in conjunction with ShaderType's to support both packed and planar data render pipelines.

compatible bevy versions

bevy_interleave bevy
0.3 0.15
0.2 0.13
0.1 0.12

Dependencies

~47–81MB
~1.5M SLoC