diff --git a/content/posts/newsletter-014/index.md b/content/posts/newsletter-014/index.md index efdc56433..a26f12f5b 100644 --- a/content/posts/newsletter-014/index.md +++ b/content/posts/newsletter-014/index.md @@ -129,6 +129,83 @@ prior to Jan 1, 2021. ## Library & Tooling Updates +### [Thunderdome] + +[Thunderdome] is a ~~gladitorial~~ generational arena library inspired by +[generational-arena], [slotmap], and [slab]. It provides constant time +insertion, lookup, and removal via small (8 byte) keys that stay 8 bytes when +wrapped in `Option`. + +Data structures like Thunderdome's `Arena` store values and return keys that can +be later used to access those values. These keys are stable across removals and +have a generation counter to solve the [ABA Problem]. + +```rust +let mut arena = Arena::new(); + +let foo = arena.insert("Foo"); +let bar = arena.insert("Bar"); + +assert_eq!(arena[foo], "Foo"); +assert_eq!(arena[bar], "Bar"); + +arena[bar] = "Replaced"; +assert_eq!(arena[bar], "Replaced"); + +let foo_value = arena.remove(foo); +assert_eq!(foo_value, Some("Foo")); + +// The slot previously used by foo will be reused for baz. +let baz = arena.insert("Baz"); +assert_eq!(arena[baz], "Baz"); + +// foo is no longer a valid key. +assert_eq!(arena.get(foo), None); +``` + +_Discussions: +[twitter](https://twitter.com/LPGhatguy/status/1303375906493276160)_ + +[Thunderdome]: https://github.com/LPGhatguy/thunderdome +[generational-arena]: https://crates.io/crates/generational-arena +[slotmap]: https://crates.io/crates/slotmap +[slab]: https://crates.io/crates/slab +[ABA Problem]: https://en.wikipedia.org/wiki/ABA_problem + +### [Crevice] + +[Crevice] is a library that helps define GLSL-compatible (std140) structs for +use in uniform and storage buffers. It uses new `const fn` capabilities +stabilized in [Rust 1.46.0] to align types with explicitly zeroed padding. + +Crevice depends heavily on [mint] to support almost any Rust math library. It +also contains helpers for safely sizing and writing buffers, making dynamic +buffer layout a breeze. + +```rust +#[derive(AsStd140)] +struct MainUniform { + orientation: mint::ColumnMatrix3, + position: mint::Vector3, + scale: f32, +} + +let value = MainUniform { + orientation: cgmath::Matrix3::identity().into(), + position: [1.0, 2.0, 3.0].into(), + scale: 4.0, +}; + +upload_data_to_gpu(value.as_std140().as_bytes()); +``` + +_Discussions: +[twitter](https://twitter.com/LPGhatguy/status/1308499131212599296)_ + +[Crevice]: https://github.com/LPGhatguy/crevice +[Rust 1.46.0]: https://blog.rust-lang.org/2020/08/27/Rust-1.46.0.html +[mint]: https://github.com/kvark/mint + ### [gfx-rs] and [gfx-portability] ![gfx-rs logo](gfx-logo.png)