#bind-group #bevy #packed #shader-types #planar #macro #interleaved

bevy_interleave

bevy support for e2e packed to planar bind groups

11 releases (5 breaking)

0.6.1 Dec 29, 2024
0.6.0 Dec 29, 2024
0.5.1 Dec 28, 2024
0.4.3 Dec 28, 2024
0.1.1 Feb 11, 2024

#285 in Game dev

Download history 1/week @ 2024-09-25 1/week @ 2024-10-30 132/week @ 2024-12-18 632/week @ 2024-12-25 31/week @ 2025-01-01 14/week @ 2025-01-08

809 downloads per month

MIT license

52KB
501 lines

bevy_interleave 🧩

test GitHub License GitHub Releases GitHub Issues crates.io

bevy static bind group api (e.g. statically typed meshes)

features

  • storage/texture bind group automation
  • packed -> planar main world representation /w serialization
  • packed -> planar storage/texture GPU representation
  • derive macro automation

minimal example

use bevy::prelude::*;
use bevy_interleave::prelude::*;


#[derive(
    Clone,
    Debug,
    Default,
    Planar,
    Reflect,
    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 main() {
    let interleaved = 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] },
    ];

    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"]
}


// TODO: gpu node binding example, see bevy_gaussian_splatting

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

~49–82MB
~1.5M SLoC