vibbit in 2026! wow! I’m very hopeful that this is the year. My first commits to the rust project, which originally went under a different name, were around december 2022 - Summer of 2023 began a total rewrite of that framework, which is where vibbit officially begins development.
The first major update for the year is the inclusion of SDL3. This is done as a feature flag for the crate, meaning it’s actually still possible to choose to build on SDL2 if you need it. There are some issues with the version of SDL2 rust has, that make it incompatible once you’ve got CMake 4.0 installed, so it was a necessary change for linux especially to compile.
SDL3 does not really give us too many new goodies, since my renderer is custom OpenGL stuff, but one day (when the rust bindings improve compatibility) it would be really great to use another feature flag to toggle between using SDL_GPU vs my OpenGL layer. It would basically be another full rewrite of that layer of the framework, but because I’ve set up rust traits for what the renderer needs to be able to do, it is designed to be pretty swappable.
As before, the next two stops are still:
I more or less know how I’ll be integrating controller support from gilrs - Rust - but the rust audio ecosystem is still pretty unfamiliar and i’ll likely need to test a lot of options.
Onto other stuff! This is not a part of vibbit, but it’s being rendered by it! After banging my head against ECS systems a bit, I have finally found a pattern and method for organizing game logic i personally like. Really the trick ended up being when I decided that your scene/world system needs to have the collision stuff baked into the lowest level.
I’ve built out a simple collision testing library for circles/AABBs - then structured an “entity system” around that. For game objects, you can define any struct you like, and then you implement an Actor trait on it - this trait provides the lifecycle hooks like update(), draw(), and on_collide(). What’s nice is that it doesn’t tie in whatsoever to vibbit, by default. My tests and examples actually jump between a few rendering frameworks - but of course the two libraries should stack on top of each other nicely, and i’ll certainly be using them together.
To get around “references” and the rust borrow checker, there is an ID system that uses generic types - so the enemies, for example could track the player movement by holding onto an ID<Player>. During your enemy update logic, you can quickly world.get(player_id) for a readonly view of it, that also ensures the object is still live in the scene. If i need to mutate the player, I can “queue” up an action on it
world.with(player_id, |player| {
player.health -= 1;
});
The framework delays the execution of that action until after the enemy is done updating.
To me, this solves so so so many of the ergonomics issues the ECS libraries within rust have. It’s very little boilerplate - you get to create your own object types, give them a simple update() function, and add them to the world at runtime. It does not require you to create a big “manifest” file that you update every time you create a new type of actor. I feel like this is the closest ive seen rust get to being usable like a “scripting” language, which i was pretty worried about even being possible. To me this will be most familiar to folks who have worked with Unity or Monogame. The whole thing is very WIP (you cant even delete objects from a scene yet) and I don’t have a name but expect more to come.