bevy_interleave

Crates.iobevy_interleave
lib.rsbevy_interleave
version0.2.1
sourcesrc
created_at2024-02-11 23:31:59.075889
updated_at2024-02-19 23:48:01.008672
descriptionbevy support for e2e packed to planar bind groups
homepagehttps://github.com/mosure/bevy_interleave
repositoryhttps://github.com/mosure/bevy_interleave
max_upload_size
id1136182
size98,823
Mitchell Mosure (mosure)

documentation

README

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() {
    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.2 0.13
0.1 0.12
Commit count: 0

cargo fmt