DocsProject

Changelog

All notable changes to Cinder. The format follows Keep a Changelog; versions follow semantic versioning. Dates are the day the phase gate passed on Linux x86-64 (REPORT.md has the runs).

0.1.0 - 2026-11-09 #

First release: a complete Linux x86-64 engine with a playable sample. macOS arm64 is a declared target but has not been built or run (no machine or runner was available; see REPORT.md, Blockers).

Added #

  • Build and toolchain. pixi environment pinning Mojo 1.2.0, CMake/Ninja and Python; one C11 shim libcinder_native over pinned submodules (wgpu-native v29.0.1.1, SDL release-3.4.20, Jolt Physics v5.6.0 via joltc, cgltf v1.15, stb, KTX-Software v4.4.2, meshoptimizer v1.3, MikkTSpace, miniaudio 0.11.26, Dear ImGui v1.93.0-docking via Dear Bindings v0.27, Tracy v0.15.0, flecs v4.2.0 for the ECS benchmark; exact commits in REPORT.md); generated Mojo bindings with a layout test covering every struct offset and enum constant; ASan/UBSan shim build and test runner; Docker toolchain container.
  • Core (cinder/core): logging with sinks, assertions, arena and generational handle pools, rings, SIMD vector/matrix/quaternion math, work-stealing job system with per-frame graphs, time, filesystem, PNG images, Tracy profiler zones, heap cells with stable addresses.
  • Platform (cinder/platform): SDL3 windows, event translation for keyboard, mouse, wheel, window and gamepad, surface creation for X11, Wayland and Metal, ImGui event forwarding.
  • Gfx (cinder/gfx): typed wgpu layer with pooled generational handles and leak accounting, WGSL shader manager with path:line:col diagnostics and hot reload with last-good fallback, pipelines, command recording, swapchain with resize and loss recovery, debug draw.
  • Renderer (cinder/render): frame graph (ordering, culling, transient aliasing, external resources, DOT dump), clustered forward+ lighting, four cascaded shadow maps and a spot/point shadow atlas, GPU-baked image-based lighting, GTAO, physically based bloom, AgX and ACES tone mapping, exposure, 4x MSAA, FXAA, GPU skinning and morph targets, instancing, meshoptimizer LODs, debug views; zero heap allocations per steady-state frame.
  • Assets (cinder/assets): glTF 2.0 import (files, GLB, data URIs, KHR_texture_transform, KHR_materials_emissive_strength, skins, animations), cooked mesh/material/clip/skeleton formats, incremental content-hash cooker and cinder-cook CLI, KTX2 textures through libktx (ETC1S/UASTC, BC7 transcode), AssetServer with async loads, refcounts and hot reload.
  • ECS (cinder/ecs): archetype world with tightly packed columns, typed queries with with/without filters and cached query specs, change ticks, command buffers, parent/local/world transforms with propagation, access-declared schedules running stages in parallel on the job system; measured within 10% of flecs (ADR-0011).
  • Scene (cinder/scene): diffable text format with exact floats and a binary format, a component registry with versioned migrations, the ECS to render-scene bridge, glTF spawning into the world with collision triangle extraction.
  • Physics (cinder/physics): Jolt world with bit layers, box/sphere/capsule/cylinder/convex hull/mesh/scaled shapes, static/kinematic/dynamic bodies, sensors, continuous collision, queued contact and activation events, ray and shape casts, CharacterController over CharacterVirtual (slopes, steps, moving platforms, pushing), ECS sync with interpolation, deterministic replay.
  • Animation (cinder/anim): skeletons from glTF and .cskel, step/linear/cubic sampling, phase-synchronised 1D and 2D blend trees, crossfades, events, root motion, one job per animator.
  • Audio (cinder/audio): miniaudio buses, decoded and streamed sounds, one-shots, 3D attenuation, ECS sources and a camera-following listener, headless engine for tests.
  • Input (cinder/input): action/axis maps over keyboard, mouse and gamepad, dead zones, runtime rebinding, exact text save/load.
  • App (cinder/app): the App runtime and Game trait, fixed-step loop with interpolated rendering, windowed and --headless modes with frame readback, shared CLI options, per-phase timing and allocation accounting.
  • Tools (cinder/tools): ImGui debug overlay with frame-time graph, entity inspector editing through the scene registry, asset browser, render-graph view and log console; Tracy client with manual lifetime.
  • Sample game (sample/): third-person collect-them-all with a skeletal character on the character controller, arena and Sponza levels, 32 orbiting shadowed lights, 500+ crates, 3D audio and music, pause menu with saved settings and rebindable keys, save/load, autopilot. CC0 assets fetched with pinned hashes.
  • Tutorial game (examples/first_game): the code built in docs/TUTORIAL.md, run headless by its own test.
  • Benchmarks (bench/): stress scene (50k instances, 2,000 bodies, 256 lights), sample game, ECS vs flecs; JSON results, adapter-scoped baselines and a 10% regression gate (tools/bench_check.py); allocation counter library and the zero-allocation test.
  • Documentation: README quick start, docs/ARCHITECTURE.md, docs/THREADING.md, docs/TOOLCHAIN.md, docs/MOJO_NOTES.md, docs/RENDER_VALIDATION.md, docs/BENCHMARKS.md, docs/TUTORIAL.md, a guide per subsystem in docs/guides/, the generated API reference in docs/api/, fourteen ADRs, docs/STATUS.md and REPORT.md.

Quality gates #

  • Every public symbol has a docstring (pixi run api-docs-check, part of pixi run test) and every code name quoted in the guides exists (pixi run docs-check).
  • A pre-release review of every public function fixed about 60 defects across all subsystems, each with a test (REPORT.md, section 5).

Known limitations #

  • Only the first directional light is used.

  • Not built or run on macOS; golden images exist for lavapipe only; the section 8 budgets are recorded on lavapipe, not met on reference hardware (none available).

  • The sample's Sponza level loads source glTF textures and starts in more than two seconds.

  • KTX-Software's vendored allocator mismatch is tolerated under ASan (alloc_dealloc_mismatch=0); see REPORT.md.

  • Built-in components are not SceneComponents, so the inspector edits game-registered types only.

View as MarkdownSource: CHANGELOG.md