A collection of experiments and demos for building social VR with bevy and wgpu.
Rome wasn't built in a day - likewise a Rust social VR game will take some time and ecosystem maturity to build. This repo can be used to track Rust and bevy's "skilltree" in social VR. We will provide a collection of example and demo code that will serve to demonstrate what is and isn't possible right now in the ecosystem.
Eventually when the skilltree is fleshed out enough, we will take this exploratory work and translate it into a full fledged game.
- Skills: Single isolated example of a specific technical feat - like doing
IK, or loading a VRM. See
skills
. - Demos: Integrates multiple skills into a larger cohesive tech demo. See
demos
.
Both demos and skills are presented as binary crates that you can actually run and try out yourself.
Legend:
- ✅ = Finished
- 🚧 = Active WIP
- 💩 = Outdated/Broken
- 📋 = Planned
- ❌ = Blocked
Feel free to add to the following lists:
- ✅ Single textured 3d cube
- 📋 Flycam camera controller
- 📋 First person camera controller (for desktop users)
- 📋 In game UI ( egui, bevyui, whatever )
- 📋 Entity inspector (
bevy_inspector_egui
) - 📋 Custom vertex and fragment shader in WGSL + bevy
- ✅ Render a GLTF/VRM model (standard shader)
- ✅ Animate a skinned mesh with IK and FK
- 🚧 Mirror
- 🚧 VR Inverse Kinematics
- 📋 Prove that custom vertex and fragment shaders on skinned meshes is possible
- 📋 MToon shader implemented in WGSL + bevy
- 📋 Render to side-by-side texture
- 📋 Display side-by-side textures as OpenVR overlay or stereokit window. This is probably laggy, but allows use of VR before OpenXR is ready in bevy.
- 📋 Spatial audio
- 📋 Animate a skinned mesh with blendshapes/morph targets
- 📋 Non-deformable physics
- 📋 Jiggle physics/Dynamic bones
- 📋 Cloth or hair physics
- 📋 Hot reload shaders (no lag spike)
- 📋 Hot reload skinned meshes (no lag spike)
- 📋 Hot reload scene (no lag spike)
- 📋 Dynamic scaling of resolution
- 📋 Touch controls for flat in-game surfaces
- 📋 Dynamic foveated rendering
- 📋 Get tracked positions from SlimeVR/SolarXR
- 📋 Laser pointers
- ✅ Rotating and resize flatscreen
- 📋 Friends list ( Social Feature )
- 📋 Avatar list ( Social Feature )
- 📋 Active game worlds ( Social Feature )
- 📋 Invite and Invite accept ( Social Feature )
- ✅ OpenXR 6dof headset and controller tracking
- 📋 OpenXR Vive trackers (
XR_HTCX_vive_tracker_interaction
)
Note: The OpenXR stuff should be unblocked soon, there are community crates being developed to add openxr to bevy right now. See also
- 📋 Comparison of different bevy networking libraries for shared state
- 📋 Create a VOIP API, abstract it over transport, and compare latency of different web-compatible transports (probably WebRTC, WebTransport, WebSocket)
- 📋 Explore auto atlasing, shader merging, shader registry (is it possible?)
There are a few options to get set up. We suggest Option 1. Once you've done this first time setup, you can go read the README of any of the skills/demos that interest you for instructions on how to run them.
- Install rustup
- Install bevy's dependencies
- Install git lfs and run
git lfs install && git lfs pull
- Have the nix package manager installed
- Enable flakes
nix profile install nixpkgs#direnv
- hook direnv into your shell
cp .envrc.example .envrc
- feel free to customize thisdirenv allow
git lfs install && git lfs pull
Unless otherwise specified, all code in this repository is dual-licensed under either:
- MIT License (LICENSE-MIT)
- BSD 2-Clause Plus Patent License (LICENSE-BSD)
at your option. This means you can select the license you prefer!
Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, shall be dual licensed as above, without any additional terms or conditions.