scenix v0.7.0
Install
[dependencies]
scenix = { version = "0.7.0", features = ["loader", "renderer", "post"] }
Highlights
- New optional
scenix-loader crate for CPU-side glTF/GLB, OBJ/MTL, STL, PNG/JPEG/WebP, KTX2, HDR/EXR, and canonical path cache loading.
- New optional
scenix-post crate for a wgpu full-screen post stack with bloom, SSAO, tonemap, FXAA, TAA, SMAA, depth of field, fog, outline, and motion blur passes.
Renderer can now apply an optional post stack through Renderer::set_post_stack without changing the existing Renderer::render signature.
- The facade crate still keeps CPU authoring features enabled by default; opt into loaders with
features = ["loader"] and GPU post-processing with features = ["renderer", "post"].
- Raycasting, debug helpers, WASM wrappers, and
animato integration remain deferred to later milestones.
Crates published to crates.io
| Crate |
Version |
Description |
scenix-math |
0.7.0 |
Custom no_std 3D math primitives |
scenix-core |
0.7.0 |
Shared IDs, colors, errors, and traits |
scenix-input |
0.7.0 |
Platform-agnostic input state types |
scenix-scene |
0.7.0 |
GPU-free scene graph and traversal APIs |
scenix-camera |
0.7.0 |
GPU-free cameras, frustums, and controllers |
scenix-mesh |
0.7.0 |
CPU-side geometry, primitive generation, instancing, and batching |
scenix-material |
0.7.0 |
GPU-free material descriptions and pipeline keys |
scenix-light |
0.7.0 |
GPU-free lights, shadow configuration, and light probes |
scenix-texture |
0.7.0 |
CPU-side texture data, samplers, atlases, and mipmaps |
scenix-loader |
0.7.0 |
CPU-side glTF, OBJ, STL, image, KTX2, HDR, and cache loaders |
scenix-post |
0.7.0 |
Optional wgpu post-processing stack and full-screen effects |
scenix-renderer |
0.7.0 |
Optional wgpu renderer, resource registries, targets, passes, and pipeline cache |
scenix |
0.7.0 |
Facade crate with optional loader, renderer, and post APIs |
glTF + post-processing example
use scenix::{
BloomConfig, FxaaConfig, GltfLoader, PerspectiveCamera, PostStack,
Renderer, RendererConfig, ToneMapper, Vec3,
};
# async fn run() -> Result<(), scenix::ScenixError> {
let asset = GltfLoader::new().load_file("scene.gltf")?;
let mut renderer = Renderer::headless(RendererConfig::new(256, 256)).await?;
renderer.set_post_stack(Some(
PostStack::new()
.with_bloom(BloomConfig::default())
.with_tonemap(ToneMapper::Aces)
.with_fxaa(FxaaConfig::default()),
));
for (mesh_id, geometry) in &asset.meshes {
renderer.register_mesh(*mesh_id, geometry)?;
}
for (material_id, material) in &asset.materials {
renderer.register_pbr_material(*material_id, material)?;
}
let camera = PerspectiveCamera::new(60.0, 16.0 / 9.0, 0.1, 100.0)
.position(Vec3::new(0.0, 0.0, 4.0))
.target(Vec3::ZERO);
let stats = renderer.render(&asset.scene, &camera)?;
assert!(stats.visible_meshes > 0);
# Ok(())
# }
Verification
cargo test --workspace --all-features
cargo test -p scenix-math -p scenix-core -p scenix-input -p scenix-scene -p scenix-camera -p scenix-mesh -p scenix-material -p scenix-light -p scenix-texture --no-default-features
cargo test -p scenix-loader --all-features
SCENIX_RUN_GPU_TESTS=1 WGPU_BACKEND=vulkan cargo test -p scenix-renderer -p scenix-post --all-features
cargo clippy --workspace --all-features -- -D warnings
cargo fmt --check
cargo doc --workspace --all-features --no-deps
cargo publish --dry-run for every crate before publish