Skip to content

scenix v0.6.0

Choose a tag to compare

@github-actions github-actions released this 25 May 11:56
· 11 commits to main since this release
30f6c9f

scenix v0.6.0

Install

[dependencies]
scenix = { version = "0.6.0", features = ["renderer"] }

Highlights

  • New optional scenix-renderer crate powered by wgpu 29 with surface and headless render targets.
  • Renderer-owned mesh, material, texture, and light registration keeps SceneGraph renderer-agnostic while enabling real GPU frame submission.
  • Added RendererConfig, FrameContext, FrameStats, GpuScene, GpuMaterial, PipelineCache, GBuffer, ShadowMapAtlas, culling helpers, transparent sorting, and embedded WGSL shader entry points.
  • The facade crate remains CPU-only by default; opt into GPU APIs with features = ["renderer"].
  • Loader, image decoding, post-processing, WASM wrappers, and GLTF asset pipelines remain deferred to later milestones.

Crates published to crates.io

Crate Version Description
scenix-math 0.6.0 Custom no_std 3D math primitives
scenix-core 0.6.0 Shared IDs, colors, errors, and traits
scenix-input 0.6.0 Platform-agnostic input state types
scenix-scene 0.6.0 GPU-free scene graph and traversal APIs
scenix-camera 0.6.0 GPU-free cameras, frustums, and controllers
scenix-mesh 0.6.0 CPU-side geometry, primitive generation, instancing, and batching
scenix-material 0.6.0 GPU-free material descriptions and pipeline keys
scenix-light 0.6.0 GPU-free lights, shadow configuration, and light probes
scenix-texture 0.6.0 CPU-side texture data, samplers, atlases, and mipmaps
scenix-renderer 0.6.0 Optional wgpu renderer, resource registries, targets, passes, and pipeline cache
scenix 0.6.0 Facade crate with optional renderer APIs

Headless renderer example

use scenix::{
    Color, MaterialId, MeshId, PerspectiveCamera, PbrMaterial, Renderer,
    RendererConfig, SceneGraph, SceneNode, Vec3, box_geometry,
};

# async fn run() -> Result<(), scenix::ScenixError> {
let mut renderer = Renderer::headless(RendererConfig::new(256, 256)).await?;
let mesh_id = MeshId::new(1);
let material_id = MaterialId::new(1);

renderer.register_mesh(mesh_id, &box_geometry(1.0, 1.0, 1.0, 1, 1, 1))?;
renderer.register_pbr_material(
    material_id,
    &PbrMaterial::new().albedo(Color::from_rgb(0.8, 0.25, 0.15)),
)?;

let mut scene = SceneGraph::new();
scene.add(SceneNode::mesh("cube", mesh_id, material_id));
scene.update_world_transforms();

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(&scene, &camera)?;

assert_eq!(stats.visible_meshes, 1);
# 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
  • SCENIX_RUN_GPU_TESTS=1 WGPU_BACKEND=vulkan cargo test -p scenix-renderer --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