Skip to content

v0.2.0

Choose a tag to compare

@github-actions github-actions released this 08 Jun 12:28

A breaking release that refines the public API of the Python client resoio,
cleaning up leaks from implementation details. It also reworks the locomotion
input model into a partial-update scheme and fixes a bug where view rotation
(yaw/pitch) was not applied on the live client. Migrating from 0.1.x requires
following the API changes listed under Removed / Changed below.

Added

  • Python resoio: Added the received-chunk type SpeakerChunk and the
    generated proto response types ListSessionsResponse / ListRecordsResponse /
    FetchThumbnailResponse for the World modality to the top-level exports

Changed

  • Python resoio Locomotion (breaking): Reworked movement input from the
    single-shot command LocomotionCmd (all fields required) into the partial
    update LocomotionClient.send(field=None) that sends only changed fields.
    Fields left as None are not put on the wire, and the Resonite-side bridge
    retains the previous value. The drive summary is obtained from the
    drive_summary property after the async with block exits. Under the hood,
    the 8 control fields of the proto LocomotionCommand were made optional
    (field presence), and LocomotionPartialInput + MergeInto were added to the
    C# Core to merge only present fields into the held state
  • Python resoio Speaker (breaking): Renamed the received-chunk type
    AudioChunk to SpeakerChunk. Removed the constants CHANNELS / DTYPE /
    SAMPLE_RATE from the top-level exports (kept at the resoio.speaker
    module level since they collide with microphone names)
  • Python resoio Microphone (breaking): Removed the wrapper type
    MicrophoneAudioChunk; stream() / paced() now take a raw NumPy ndarray
    directly (frame_id / unix_nanos are managed automatically by the library)
  • Python resoio Camera (breaking): Changed Frame.width / height /
    channels into read-only properties derived from pixels. Removed the
    width / height / fps_limit arguments from stream() (resolution config
    is the responsibility of the Display modality)
  • Python resoio World (breaking): Removed the output mirror dataclasses
    RecordPage / SessionPage / Thumbnail and now expose the generated proto
    response types directly. The input-side enum remaps (RecordSort, etc.) are
    retained
  • Python resoio (breaking): Moved the socket exceptions
    AmbiguousSocketError / SocketNotFoundError from resoio.connection to the
    internal resoio._client and re-exported them from the top level. The
    resoio.connection module is now purified to Ping only (the top-level
    import names are unchanged, but from resoio.connection import AmbiguousSocketError etc. is breaking)
  • Thunderstore mod: Bundled CHANGELOG.md and LICENSE in the distributed
    package
  • Thunderstore mod: Expanded publish categories (added tools / audio /
    controls in addition to mods)
  • Documentation: Documented Linux-only support (no Windows support) in the
    README and docs site

Removed

  • Python resoio: Removed LocomotionCmd / AudioChunk /
    MicrophoneAudioChunk / CHANNELS / DTYPE / SAMPLE_RATE / RecordPage /
    SessionPage / Thumbnail from the top-level exports (following the API
    rework under Changed above)

Fixed

  • Thunderstore mod: Fixed an issue where the distributed package bundled the
    entire ASP.NET Core shared framework, bloating to 131 files / 24MB (including
    unused DLLs for Blazor / MVC / Razor / Identity / SignalR, etc.) and getting
    rejected by Thunderstore moderation as "files from another mod mixed in"
    (Invalid submission). Switched to an allow-list approach (_BundledAspNetCoreDll)
    that narrows the bundled DLLs to just the real dependency closure of GrpcHost
    (Kestrel + gRPC), reducing it to 67 files / 4.9MB (no change to functionality
    or wire compatibility)
  • Thunderstore mod: Fixed the distributed package not including the Camera v2
    Renderer-side plugin (ResoniteIO.Renderer). Because UnityEngine.CoreModule
    is non-redistributable and the renderer cannot be built in CI, the
    locally-built artifact is committed as a prebuilt (mod/prebuilt/renderer/,
    guarded by a source-hash drift check in just run and CI) and pack/CI bundle
    it verbatim into Renderer/ResoniteIO.Renderer/, which the Gale BepisLoader
    installer routes to Renderer/BepInEx/plugins/
  • mod Locomotion: Fixed an issue where view rotation (yaw/pitch) did not reach
    the engine while cursor lock was absent, so the avatar would not turn. Because
    ScreenCameraInputs.Look.Active is gated on InputInterface.IsCursorLocked,
    a low-priority cursor lock is acquired internally only while look input is
    active to satisfy the precondition (released when input is 0 / on Dispose,
    etc.; an existing cursor lock is not overwritten)
  • Python resoio Locomotion: Fixed LocomotionClient.__aexit__ leaking the
    connection by skipping channel close when the drive task raised; it now always
    closes via try/finally