Changelog
Changelog
All notable changes to this project are documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
Unreleased
4.0.0 - 2026-08-04
⚠ Breaking changes
- Scene JSON files saved by older versions of simview will not load. Terrain's
frictionData/stiffnessDatafields and theirbounds.minFriction/maxFriction/minStiffness/maxStiffnessentries are replaced by a genericterrain.propertiesobject ({name: {data, min, max}}— see the JSON Format Specification). Re-save any existing scene file with the current version ofsimview(orSimulationScene.load()+save()) to pick up the new format; there is no automatic migration. scene.create_terrain()/SimViewModel.create_terrain()no longer acceptfriction_map=/stiffness_map=; passproperties={"friction": ..., "stiffness": ...}instead (or any other named per-cell scalar map — see below).- The batch-names sidecar file (
.<scene>.<hash>.batchnames.json) written before staleness-fingerprinting was added (pre-3.x) is no longer read; a freshPOST /batch-namesregenerates it in the current format. - The model JSON's long-superseded
batchSizefield (renamed tosimBatchesseveral releases ago) is no longer read as a fallback.
Added
- Terrain scalar properties (friction, stiffness, or any other per-cell field) are
now a fully generic, arbitrarily-named mechanism end to end — Python
(
SimViewTerrain.properties), the CLI (simview terrain --layer <name>,simview info,simview merge), and the viewer (color mode dropdown, Legend, hover/probe tooltip, Terrain Profile tab) all support any property name supplied at authoring time, with zero code changes required to add a new one. scene.create_pointcloud()now accepts optionalcolor(static per-point RGB) andembedding(per-point feature vector) tensors;scene.create_terrain()gains a matchingembedding_map(per-cell feature vector). When present, clicking a point or terrain cell recolors the whole body/grid by cosine similarity to the clicked location, computed client-side — a new "similarity" Point Color Mode for point clouds and "features" terrain color mode, both with a matching colormap legend.
Fixed
- Clicking now only recolors a point cloud/terrain by similarity when the matching mode is already selected from its dropdown; otherwise it's an ordinary selection, and a click does nothing at all unless "Data Probe" or similarity mode is active.
- The Analysis panel's "Terrain" tab no longer appears for bodies with no trajectory (e.g. a static point cloud), and now plots the whole trajectory up front instead of only revealing it progressively during playback.
- "Scene Info" now shows full metadata keys/values instead of truncating them.
3.6 - 2026-07-29
Added
SimulationScene/SimViewModelnow accept an optional free-formmetadatadict (e.g. engine name, checkpoint path, git commit, CLI args) carried through to the saved JSON,simview info, and a read-only "Scene Info" panel in the browser, so a scene stays self-describing long after it was generated.scene.create_terrain()now auto-computes normals from the heightmap gradients ifnormalsis omitted.scene.create_terrain()now acceptsgrid_resto auto-infer spatialx_lim/y_limconstraints instead of requiring manual definition.simview terrain <file> --along-body BODY: sample terrain layer(s) bilinear-interpolated at a body's per-frame (x, y) position — "what terrain is under the robot's driven path". With--batches A B, both batches' terrains are sampled along batch A's (reference, typically ground-truth) trajectory and reported asvalue_a/value_b/deltaper layer, so the delta reflects property differences under the path rather than trajectory divergence. Honors--layer/--everyand the usual--json/--csvoutput modes.- "Terrain" tab in the browser Analysis panel: plots a terrain layer
(height/friction/stiffness) sampled under a body's path over time, one
series per batch, with layer/body pickers, a path picker ("own path"
per batch, or every batch's terrain along one reference batch's path —
e.g. ground truth's), playback-synced reveal, click-to-seek, and CSV
export. The browser-side counterpart of
simview terrain --along-body. --fail-on-exceedflag forsimview diff: exits with code 2 (after printing the normal report) when any diffed body's trajectory exceeds--pos-threshold/--rot-threshold-deg, and 0 when within them -- distinct from the usage/parse-error exit 1, so scripts and CI can use an exported scene as a regression tripwire.
Fixed
- Focusing a batch while a Scalars plot was open threw
s.stroke is not a functionon the next redraw (uPlot expectsseries.stroketo stay a function; the focus handler was overwriting it with a color string).
3.5 - 2026-07-28
Added
simview render <file> --output frame.png: headless PNG screenshot via a real (headless) browser driving a realSimViewServerinstance, with--view/--width/--heightoptions. Ships as a new optionalrenderextra rather than a hard dependency.- Terrain diff color overlay: a "diff" color mode (diverging colormap centered on zero) plus Diff Layer/Batch A/Batch B pickers in Terrain Options, with a matching diverging colorbar in the Legend.
- The terrain data probe now shows every batch's height/friction/stiffness at the hovered cell, plus each one's delta from a reference batch, instead of just the hovered batch.
--per-axisflag forsimview diff, reporting signederr_x/err_y/err_z(batch A minus batch B) per frame in--json/--csvoutput.- Mean/min
|delta|stats (alongside the existing max) insimview terrain --batches --areaoutput. - Full documentation site (MkDocs + mkdocs-material + mkdocstrings) covering
usage, the CLI, the JSON format specification, the API reference, and a
developer guide, published to GitHub Pages.
README.mdis trimmed to a landing page that links to it.
Changed
- The Error Metrics panel auto-selects a sensible Batch A/B default from batch names (e.g. ground-truth vs. post-adaptation) instead of always defaulting to indices 0/1, falling back to 0/1 when no batch name matches.
3.4 - 2026-07-27
Added
simview info <file>: a structural summary of a scene JSON (model/terrain/ body/state breakdown, columnar-repack eligibility, consistency warnings) in human-readable text or--json.simview terrain <file> --point/--area: numeric height/friction/stiffness queries (bilinear-interpolated at a point, or a raw grid over an area), plus--batches A Bto compare two batches (value_a/value_b/deltaper layer).simview diff <file> --batches A B: per-frame position/orientation divergence between two batches' trajectories, with--body/--every/--pos-threshold/--rot-threshold-degoptions.--csvoutput forsimview diffandsimview terrain, alongside the existing--json.
Changed
- Only emit uvicorn's access log when running in debug mode.
3.3 - 2026-07-17
Added
- Expose the installed package version as
simview.__version__. - Test against Python 3.14 in CI and advertise it in the package classifiers.
- Dependabot configuration for GitHub Actions, npm, and Python dependencies.
Changed
- Bump the PyPI development-status classifier to
5 - Production/Stable. - Use uvicorn's modern sansio websocket implementation for the live server when
available, silencing the
websockets.legacydeprecation warning. - Raise the CI coverage floor from 80% to 83%.
Removed
- Unused
collapsedMode/focusedModeplaceholder flags fromBatchManager.
3.2 - 2026-07-15
Added
- Shareable view links: the current camera/playback state is encoded in the URL hash so a view can be restored or handed off.
- Single-frame PNG screenshot export.
Changed
- Prepare packaging for PyPI publishing (metadata, build, publish workflow).
- Replace CCapture with the browser-native
MediaRecorderfor video recording, covered by an e2e test.
Fixed
- Unblock CI: guard the optional
numpyimport and add--no-launchtoexample.py. - Plot visualization fixes.
3.1 - 2026-07-14
Added
- Live streaming mode:
LiveViewerpushes states to connected browser tabs over WebSocket as a simulation runs. - Non-blocking
scene.show()with Jupyter iframe support (_repr_html_). - Smooth interpolated playback (position lerp + quaternion slerp) with a toggle.
- Error-metric summary stats and CSV export in the analysis panel.
Changed
- Vendor three.js and chroma-js locally so the viewer works fully offline.
- Serve states as per-body whole-trajectory binary columns ("v4" columnar
repack), backed by a
Float32ArrayStateStore, for much cheaper playback of long recordings.
Fixed
- Binary-search seek for non-uniform timelines, parallel blob fetches, and versioned immutable blob URLs.
Testing / infrastructure
- Add vitest + Playwright frontend tests, pyright type checking, and a CI coverage floor.
3.0 - 2026-07-13
Baseline release. Highlights of the surface established by this version:
- Authoring API —
SimulationScenewith incremental model building,add_state/add_trajectory(batched, binary-encoded), gzip support, and JSON save/load. - Wire format — HTTP-served
model/states, binary-encoded numeric fields, parent-relative (rigid and articulated) body transforms, grouped body names. - Frontend — vanilla-JS/THREE.js viewer with batched split-screen comparison, camera tracking, trajectory trails, terrain data probe, a unified Analysis panel (Scalars + Error Metrics, plotted with uPlot), and synchronized timeline scrubbing.
- Tooling — CLI (
simviewview /clear/--save-merged), multi-file merge pipeline, CORS-hardened server with cache headers,py.typed, and CI across Python 3.12/3.13 with a base-install-only check.