nx_bvhmotion.nx
buildroot/runtime/nx_bvhmotion.nx
about
nx_bvhmotion.nx -- BVH MOTION CAPTURE CENSUS (thin CLI over nx_bvh_lib).
NAMING (deliberate, do not "fix" to nx_bvh): nx_bvh.nx is a BOUNDING VOLUME HIERARCHY for the
slicer. The collision is real and it already cost a false capability reading -- a grep for "bvh"
reported this format as ALREADY SUPPORTED when nothing of the kind existed.
*A NAME IS NOT A CAPABILITY.
WHY: measured 2026-08-07 against vrstormlab.com/dancexr/play (their served bytes): the LW build
ingests VMD + BVH motion. BVH is the universal interchange, and unlike VMD its corpus has a
commercially-clean tier -- which matters because our banked license truth says the SMPL/AMASS
academic stack is non-commercial even for TRAINING.
PROVEN ON REAL THIRD-PARTY DATA 2026-08-07 (not only on a fixture I authored):
test_mocapbank.bvh 19 joints / 60 chan / 455 frames -> 27,300 values = 455*60 EXACT
test_freebvh.bvh 55 joints / 168 chan / 69 frames -> 11,592 values = 69*168 EXACT
Both channel sums also reconcile independently (6 + 18*3 = 60; 6 + 54*3 = 168).
usage: nx_bvhmotion info <file.bvh> joints, channels, frames, frame time, derived fps
nx_bvhmotion joints <file.bvh> joint tree: index, parent, nchan, offset xyz, name
nx_bvhmotion dump <file.bvh> [n] first n motion rows
nx_bvhmotion --kat selftest: 7 teeth, 3 of them anti-vacuity
exit 0 ok | 2 unreadable | 3 usage | 4 REFUSED | 1 selftest RED
license_tier: ORIGINAL No hw writes (Rule 26). expect_exit: 0
dependencies 1 imports · 0 importers
imports: nx_bvh_lib.nx
imported by: nobody (leaf or entry point)
call flow from main pre-order; caps 40 nodes / depth 6 declared; ↻ = already shown
structs
| none |
consts
| 25 | const M_MAGIC_5000: i64 = 5000 |
| 26 | const M_MAGIC_33333: i64 = 33333 |
| 27 | const M_MAGIC_2500: i64 = 2500 |
| 28 | const M_MAGIC_11000: i64 = 11000 |
| 29 | const M_MAGIC_90000: i64 = 90000 |
| 31 | const M_DUMP_DEF: i64 = 4 |
| 32 | const M_KATBUF: i64 = 4096 |
functions
| 34 | func m_info(H: *i64) -> i64 |
| 47 | func m_joints(H: *i64, names: *u8, parent: *i64, nchan: *i64, off: *i64) -> i64 |
| 64 | func m_dump(buf: *u8, len: i64, H: *i64, maxn: i64) -> i64 |
| 81 | func m_cat(b: *u8, o: i64, s: *u8) -> i64 |
| 88 | func m_kat_build(b: *u8, frames: *u8, rows: i64) -> i64 |
| 106 | func m_kat() -> i64 |
| 176 | func main(argc: i64, argv: *i64) -> i64 |