#bevy #shader-types #groups

bevy_interleave_interface

interface for e2e packed to planar bind groups

10 releases (5 breaking)

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

#1164 in Game dev

41 downloads per month
Used in 3 crates (2 directly)

MIT license

22KB
322 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

~43–75MB
~1.5M SLoC