- oakengine_sequence_move_clip implemented for real (oaktimeline TrackMoveBlockCommand; fixes the graph-ownership/gap-anchor/ripple trim bugs the stub was hiding); same-track via the frozen C ABI, cross-track supported by the module command - oaknode clip blocks now declare a tex_in texture input and set effect_input to it, so timeline clips can host effect chains; facade test covers effect insert/remove on a real clip - oakffmpeg-link: FFMPEG_DIR is now mandatory with a clear panic (a Homebrew upgrade left the system ffmpeg .pc pointing at a deleted dav1d Cellar path, breaking links); reads a git-ignored workspace .env for IDEs that cannot inject env vars (RustRover); links the C++ stdlib for C++ codec libs (svt-av1) - oakengine re-exports oaknode so tests share one crate instance; it_node uses the direct instance's value type where it calls the module FFI (the --workspace dev-dependency feature split builds oaknode twice)
oakcore-rs — Rust value-type foundation for the oak Rust modules
Status: declaration draft for review (no implementation, not wired into any build). Companion to
crates/oaknodeandcrates/oakrender.
Rust reimplementation of the oakcore C++ value types that cross every
module boundary: Rational, TimeRange, TimeRangeList, pixel/sample
format enums. These are pure data types with value semantics — the one
place where duplicating the C++ layout discipline in plain Rust is both
safe and required (a Rust crate cannot hold C++ objects by value).
Rules:
- Bit-exact arithmetic compatibility with
olive::core::Rational(reduction, overflow behavior, comparison) — the golden rule is the C++ test-suite semantics, not "ideal" rational math. #[repr(C)]only where a type crosses the C ABI; everything else is plain Rust withCopy + Clone + Eq + Hash.- No I/O, no allocation in arithmetic paths, no panics on degenerate input (denominator zero follows the C++ sentinel semantics).