feat(iphone): emit skeleton topology on connect

This commit is contained in:
clement
2026-06-30 21:54:41 +02:00
parent 6f941c52cb
commit 67f347e705
@@ -67,7 +67,14 @@ final class ARBodySession: NSObject, ObservableObject, ARSessionDelegate {
super.init() super.init()
session.delegate = self session.delegate = self
usb.onState = { [weak self] s in usb.onState = { [weak self] s in
Task { @MainActor in self?.usbState = s } Task { @MainActor in
guard let self else { return }
let was = self.usbState
self.usbState = s
if s == .connected && was != .connected {
self.publishTopology()
}
}
} }
videoEncoder.onPayload = { [weak self] payload in videoEncoder.onPayload = { [weak self] payload in
Task { @MainActor in Task { @MainActor in
@@ -338,4 +345,19 @@ final class ARBodySession: NSObject, ObservableObject, ARSessionDelegate {
payload: p2.encoded()) payload: p2.encoded())
} }
/// Send the ARKit body joint names + parent indices once, so the Mac
/// renders bones generically. Static data available before any body
/// is tracked, so it is safe to emit right after connect.
@MainActor
private func publishTopology() {
guard usbState == .connected else { return }
let def = ARSkeletonDefinition.defaultBody3D
let names = def.jointNames
let parents = def.parentIndices.map { Int16(clamping: $0) }
let payload = TopologyPayload(jointNames: names, parents: parents)
usb.send(tag: .topology, pid: -1,
timestamp: lastFrameTime,
payload: payload.encoded())
}
} }