- Rejoin whitespace-split program args so ISO paths with spaces work
(Gradle --args splits on spaces, which caused a silent load failure
and a blank white window).
- Black scene background and black video canvas fill; scale video to
fit and center it instead of drawing top-left at native size.
- Playback completion now invokes MoviePlayer.onPlayListEnd so the menu
advances past the anti-piracy warning instead of freezing.
- RcoRenderer implements Display: draws the live RCO object tree onto a
Canvas, decodes PNG textures, handles focus and resource changes
(thread-safe via Platform.runLater).
- PageObject now implements root/children semantics and open/close/display
so opening a page adds its objects to the renderer.
- Object getImage() returns the ImageObject so the UI can decode PNGs.
- PlayerApp wires menu + video: loads the RCO, runs the VSMX script,
executes onAutoPlay, plays video via PlaybackEngine with YUV->ARGB
blitting and PTS pacing, and routes arrow/Enter keys to the controller.
- Runs end-to-end on Batman Begins (window, menu load, playback).
- Playlist.streamForPlayListNumber maps the 1-based playListNumber to the
actual stream entry; stream names are not sequential across discs
(The Dark Knight: 00001/00003/00004; The Day After Tomorrow has
duplicate 00002 names).
- CLI menu playback now resolves the correct .MPS file for every region.
- ui module: JavaFX via org.openjfx.javafxplugin + PlayerApp smoke test
(window verified on this display).
- Validated menus + playback on 4 discs: Batman Begins (USA), Jackass
(Australia), The Dark Knight (Europe), The Day After Tomorrow (Japan).