Hey
I’ve been converting objC example to swift one. But I hit a wall. I stripped down 99% of the code to barebone example here. It connects to steamVR, XR headset displays on icon as green, but 5 seconds in to the connection I get disconnected and then steam client crashes internally.
Can any1 shed some light on where we messed up the conversion ?
TIA
import Foundation
import UIKit
import ARKit
import MetalKit
import CoreGraphics
class xrView : UIViewController, ARSessionDelegate {
var arTransform : simd_float4x4!;
var mMetalDevice : MTLDevice?;
var mMetalCommandQueue : MTLCommandQueue?;
var mReceiver : cxrReceiverHandle?;
var mDesc : cxrReceiverDesc!;
var mArSession : ARSession!;
override func viewDidLoad() {
super.viewDidLoad()
arTransform = simd_float4x4()
//arTransform.columns.0.x=1.0;
//arTransform.columns.1.y=1.0;
//arTransform.columns.2.z=1.0;
mMetalDevice = MTLCreateSystemDefaultDevice()
if var device = mMetalDevice {
mArSession = ARSession();
mArSession.delegate = self;
mArSession.run(ARWorldTrackingConfiguration());
device.makeCommandQueue()
mMetalCommandQueue = device.makeCommandQueue()
mDesc = cxrReceiverDesc();
let major : UInt32 = 2
let minor : UInt32 = 1
let ver : UInt32 = (major << 16) | (minor);
mDesc.requestedVersion = ver
mDesc.deviceDesc.width = UInt32(self.view.bounds.size.width);
mDesc.deviceDesc.height = UInt32(self.view.bounds.size.height);
print("Width : \(mDesc.deviceDesc.width)")
print("Height : \(mDesc.deviceDesc.height)")
let aspect = Float(mDesc.deviceDesc.width) / Float(mDesc.deviceDesc.height);
let fov : Float = 3.14159 * 0.5;
let top : Float = tan(fov * 0.5);
let bottom = -top;
let left = -(top * aspect);
let right = -left;
mDesc.deviceDesc.maxResFactor = 1.0;
mDesc.deviceDesc.fps = 60.0;
mDesc.deviceDesc.ipd = 0.062;
mDesc.deviceDesc.proj.0.0 = left;
mDesc.deviceDesc.proj.0.1 = right;
mDesc.deviceDesc.proj.0.2 = bottom;
mDesc.deviceDesc.proj.0.3 = top;
mDesc.deviceDesc.proj.1.0 = left;
mDesc.deviceDesc.proj.1.1 = right;
mDesc.deviceDesc.proj.1.2 = bottom;
mDesc.deviceDesc.proj.1.3 = top;
mDesc.deviceDesc.predOffset = 0.1;
mDesc.deviceDesc.audio = UInt8(0) ; //cxrFalse;
mDesc.deviceDesc.embedInfoInVideo = UInt8(0);//cxrFalse;
mDesc.deviceDesc.disablePosePrediction = UInt8(0);//cxrFalse;
mDesc.deviceDesc.angularVelocityInDeviceSpace = UInt8(0);//cxrFalse;
mDesc.deviceDesc.foveatedScaleFactor = 100;
mDesc.deviceDesc.posePollFreq = 0;
mDesc.deviceDesc.ctrlType = cxrControllerType_HtcVive;
mDesc.clientCallbacks.GetTrackingState = GetTrackingState;
mDesc.clientCallbacks.TriggerHaptic = TriggerHaptic;
mDesc.clientCallbacks.RenderAudio = RenderAudio;
mDesc.clientCallbacks.ReceiveUserData = ReceiveUserData;
mDesc.clientCallbacks.Disconnect = Disconnect;
mDesc.clientContext = UnsafeMutableRawPointer(Unmanaged.passUnretained(self).toOpaque()); // (__bridge void*)self;
mDesc.shareContext = nil; //0
mDesc.numStreams = 2;//(self.streamingXR) ? 2 : 1;
mDesc.receiverMode = cxrStreamingMode_XR;//(self.streamingXR) ? cxrStreamingMode_XR : cxrStreamingMode_Generic;
mDesc.debugFlags = 0;
mDesc.logMaxSizeKB = 65536;
mDesc.logMaxAgeDays = 30;
var e : cxrError = cxrCreateReceiver(&mDesc, &mReceiver);
print("Receiver After : \(mReceiver)")
if(e != cxrError_Success) {
print("Receiver create failed with code \(e) [%s]", cxrErrorString(e));
}
e = cxrConnect(mReceiver, "192.168.0.33");
if(e != cxrError_Success) {
print("Receiver connect failed with code \(e) [%s]", cxrErrorString(e));
}
}
}
func session(_ session: ARSession, didUpdate frame: ARFrame)
{
arTransform = frame.camera.transform;
}
}
func GetTrackingState(context: UnsafeMutableRawPointer?, state : UnsafeMutablePointer<cxrVRTrackingState>?) {
if let con = context {
let controller = Unmanaged<xrView>.fromOpaque(context!).takeUnretainedValue()
if let st = state{
var trackingState = st.pointee
memset(trackingState , 0, MemoryLayout<cxrVRTrackingState>.size);
let transform : simd_float4x4 = controller.arTransform;
var transposed : simd_float4x4 = simd_transpose(transform);
//memcpy(&trackingState.hmd.pose.deviceToAbsoluteTracking.m.0, &transposed.columns.0, MemoryLayout<simd_float4>.stride * 4);
//memcpy(&trackingState.hmd.pose.deviceToAbsoluteTracking.m.1, &transposed.columns.1, MemoryLayout<simd_float4>.stride * 4);
//memcpy(&trackingState.hmd.pose.deviceToAbsoluteTracking.m.2, &transposed.columns.2, MemoryLayout<simd_float4>.stride * 4);
trackingState.hmd.pose.deviceToAbsoluteTracking.m.0.0 = transposed.columns.0.x
trackingState.hmd.pose.deviceToAbsoluteTracking.m.0.1 = transposed.columns.0.y
trackingState.hmd.pose.deviceToAbsoluteTracking.m.0.2 = transposed.columns.0.z
trackingState.hmd.pose.deviceToAbsoluteTracking.m.0.3 = transposed.columns.0.w
trackingState.hmd.pose.deviceToAbsoluteTracking.m.1.0 = transposed.columns.1.x
trackingState.hmd.pose.deviceToAbsoluteTracking.m.1.1 = transposed.columns.1.y
trackingState.hmd.pose.deviceToAbsoluteTracking.m.1.2 = transposed.columns.1.z
trackingState.hmd.pose.deviceToAbsoluteTracking.m.1.3 = transposed.columns.1.w
trackingState.hmd.pose.deviceToAbsoluteTracking.m.2.0 = transposed.columns.2.x
trackingState.hmd.pose.deviceToAbsoluteTracking.m.2.1 = transposed.columns.2.y
trackingState.hmd.pose.deviceToAbsoluteTracking.m.2.2 = transposed.columns.2.z
trackingState.hmd.pose.deviceToAbsoluteTracking.m.2.3 = transposed.columns.2.w
trackingState.hmd.pose.deviceIsConnected = UInt8(1);
trackingState.hmd.pose.trackingResult = cxrTrackingResult_Running_OK;
trackingState.hmd.pose.poseIsValid = UInt8(1);
trackingState.hmd.activityLevel = cxrDeviceActivityLevel_UserInteraction;
trackingState.poseTimeOffset = 0.042;
}
}else{
}
}
// A controller vibration must be started.
func TriggerHaptic(context : UnsafeMutableRawPointer?, haptic : UnsafePointer<cxrHapticFeedback>?) {
}
// An audio buffer is available for playback.
func RenderAudio(context : UnsafeMutableRawPointer?, audioFrame : UnsafePointer<cxrAudioFrame>?) {
}
func ReceiveUserData( context : UnsafeMutableRawPointer?, data: UnsafeRawPointer? , size: UInt32){
}
// The connection was lost or closed by the server
func Disconnect(context : UnsafeMutableRawPointer?, reason : cxrDisconnectReason) {
}