Skip to content

v0.4.0

Choose a tag to compare

@github-actions github-actions released this 11 Jun 12:57
673226c

A breaking release that renames the Manipulation modality to Grabber
(gRPC route / C# surface / Python module all change), makes Cursor
SetPosition a persistent hold until Release, switches Grab to a
ray-based targeting model, and redesigns the CLI
(manipulategrab, locomotion drivedrive,
display split into get / set). Update the ResoniteIO mod and the
resoio Python package in lockstep.

Changed

  • Breaking — the Manipulation modality is renamed to Grabber: the gRPC
    route changed from /resonite_io.v1.Manipulation/* to
    /resonite_io.v1.Grabber/* (manipulation.protograbber.proto,
    Manipulation* messages → Grabber*), the C# surface is now
    GrabberService / IGrabberBridge / FrooxEngineGrabberBridge, and the
    Python module and client are resoio.grabber / GrabberClient (the
    GrabResult / GrabState dataclasses keep their names). An old mod and a
    new client (or vice versa) cannot talk over the renamed route — update the
    ResoniteIO mod and the resoio Python package in lockstep
  • Breaking — Cursor SetPosition now holds the cursor until Release:
    SetPosition was a one-shot warp (the engine cursor reverted to the OS
    pointer on the next frame, especially under Wine/Proton). It now registers a
    persistent engine-side cursor lock so the in-engine cursor stays at the set
    position across RPCs, while a Harmony patch on
    InputInterface.CollectOutputState masks the lock from the renderer so the
    real OS mouse pointer is never captured (no warp, no confine, no
    center-pin). InputInterface.SetMousePosition (OS warp) is no longer called.
    While held, real mouse movement does not move the in-engine cursor (clicks
    still fire at the held position); switching world focus deactivates the hold
  • Breaking — Manipulation.Grab is now ray-based:
    ManipulationGrabRequest.point (WorldPoint) was removed (field 2 is
    reserved). Grab always targets the point where the desktop cursor ray hits
    the world and grabs grabbables within radius of that point. A ray miss
    returns grabbed=false (not an error); VR mode (screen output inactive)
    returns FAILED_PRECONDITION. The Python client's ManipulationClient.grab
    lost its point parameter and the CLI lost --point. Aim with
    resoio cursor set X Y (held until release), then resoio grab
  • Breaking — resoio display is split into get / set subcommands: the
    implicit branching ("no flags = get, any flag = set") is gone.
    resoio display get prints the current snapshot; resoio display set
    requires at least one of -W/--width, -H/--height, -F/--max-fps and
    prints the post-apply snapshot
  • Breaking — resoio locomotion drive is flattened to resoio drive: the
    locomotion command group is removed; the flags
    (--sprint / --look-rate / --no-wait) are unchanged
  • Breaking — resoio manipulate is renamed to resoio grab (following
    the modality rename): the action positional
    (grab / release / state / interactive) is optional and defaults to
    grab, and --hand / --radius are accepted before or after the action
  • CLI required arguments are now enforced by argparse:
    resoio cursor set <x> <y>, resoio dash invoke <ref_id>, and
    resoio context-menu highlight/invoke <index> reject missing positionals as
    a usage error at parse time instead of failing mid-command. The argv shape
    of valid invocations is unchanged

Added

  • Cursor.Release RPC: releases the held cursor and returns control to the
    OS pointer. Idempotent (releasing while not held succeeds and returns the
    current state). Exposed as CursorClient.release() and
    resoio cursor release
  • CursorState.held field: reports whether the cursor is currently held,
    returned by SetPosition / GetPosition / Release and shown in the CLI
    output (held=True/False)

Fixed

  • Grabbed objects no longer fly behind the user's head: in desktop mode
    the hand moves from its rest pose to a holding pose right after a grab, and
    a far-away grab left a large holder-local offset that got swung around with
    the hand. The bridge now pins the grabbed object at its grab-time pose (the
    cursor position) until the hand settles, so it stays where it was grabbed
    and follows the hand from there