Venue control routing

The plugin does not assume that arbitrary OSC/DMX automatically appears on ShowServer’s RTC data channel. The optional control gateway explicitly bridges local protocol inputs into a normal ShowServer contribute source. Run it on the venue ShowServer host, or on a machine that can reach that host.

Copy Scripts/gateway.example.json, give it a unique medianode-unreal-* identity and your venue URL. Supply BPSHOW_TOKEN in the gateway process environment. Then run:

./Binaries/ThirdParty/Win64/BPUnrealRTC.Bridge.exe --control-gateway ./gateway.json

Only the configured UDP ports are opened, and the default bind is 127.0.0.1. Change bind to a specific venue NIC IP to accept other machines, with the venue’s normal network access controls. The gateway publishes a data-only source named Venue Controls; set the Unreal component’s SourceId to that source’s ShowServer ID. The Unreal publisher can simultaneously return camera video in its own room. Additional video/audio returns use additional components.

The gateway accepts:

  • OSC 1.0 messages on oscPort: int32, float32, strings and boolean tags. OSC bundles, timetags, blobs and OSC-over-TCP are not handled by this adapter. Applications can still send raw payloads through OnData.
  • Art-Net ArtDmx on artNetPort: protocol version >=14, 2–512 even slots, zero-based Art-Net port-address/universe. This is not an sACN adapter.
  • UTF-8 JSON on facePort: {"weights":{"jawOpen":0.7,"eyeBlinkLeft":0.1}}. Values must be finite in [0,1]. This is a named-weight interchange, not a proprietary Live Link Face packet decoder. Convert that source’s protocol upstream or publish the JSON from your tracker.

Each outgoing envelope includes version:1, a new process streamId, monotonically increasing sequence, and UTC timestampMs. Unreal’s typed control events reject duplicates, reordered frames and controls older than MaxControlAgeMs (default 1000 ms). Synchronize venue/EC2 clocks. Set age to zero only when intentionally disabling age checks. OnData provides the original bytes even when typed dispatch rejects an envelope.

TopicPayload fields in addition to envelopeExample actor behavior
bps.unreal.face.v1weights: morph name → 0..1Applies matching names to optional FaceMesh
bps.unreal.dmx.v1universe: 0..32767, address: first 1-based slot, values: integer array 0..255Maps selected universe/address to DMXLight intensity
bps.unreal.osc.v1address: OSC address, arguments: typed JSON array/camera/location x,y,z in Unreal centimeters; /camera/rotation pitch,yaw,roll in degrees

The camera’s face binding requires matching morph names. MetaHuman/Control Rig remapping is project-specific; bind OnFacialData to your animation pipeline when direct morph targets are insufficient. DMX fixtures and OSC command routing are likewise extensible through the Blueprint events. The sample transforms apply to the camera actor, not physical venue gear.

The gateway drops packets while disconnected. Reliable delivery across a disconnect, cue acknowledgement, universe merging, ArtSync, a jitter buffer for animation, and clock/genlock synchronization are outside this adapter. The sample holds the last pose/light value when controls stop; implement your show’s chosen safe state in the project.