Esempio n. 1
0
 //全デバイス情報を更新
 public void Update(ETrackingUniverseOrigin origin = ETrackingUniverseOrigin.TrackingUniverseStanding)
 {
     allDevicePose = new TrackedDevicePose_t[OpenVR.k_unMaxTrackedDeviceCount];
     if (!IsReady())
     {
         return;
     }
     //すべてのデバイスの情報を取得
     openvr.GetDeviceToAbsoluteTrackingPose(origin, PredictedTime, allDevicePose);
     //最終更新フレームを更新
     LastFrameCount = Time.frameCount;
 }
    void UpdateTrackedObj()
    {
        TrackedDevicePose_t[] allPoses = new TrackedDevicePose_t[OpenVR.k_unMaxTrackedDeviceCount];

        _vrSystem.GetDeviceToAbsoluteTrackingPose(ETrackingUniverseOrigin.TrackingUniverseStanding, 0, allPoses);

        for (int i = 0; i < _validDeviceIds.Count; i++)
        {
            if (i < targetObjs.Length)
            {
                var pose        = allPoses[_validDeviceIds[i]];
                var absTracking = pose.mDeviceToAbsoluteTracking;
                var mat         = new SteamVR_Utils.RigidTransform(absTracking);
                targetObjs[i].transform.SetPositionAndRotation(mat.pos, mat.rot);

                //Debug.Log(mat.pos+":"+ mat.rot);

                float test;

                this.GetComponent <InputVive> ().Vive_Y_set(mat.rot.y);

                //	Debug.Log (GetComponent<InputVive> ().Vive_Y_get());
            }
        }
    }
Esempio n. 3
0
        public bool DoPulse()
        {
            m_vrSystem.GetDeviceToAbsoluteTrackingPose(ETrackingUniverseOrigin.TrackingUniverseRawAndUncalibrated, 0f, m_trackedPoses);

            while (m_vrSystem.PollNextEvent(ref m_vrEvent, m_eventSize))
            {
                switch (m_vrEvent.eventType)
                {
                case (uint)EVREventType.VREvent_Quit:
                case (uint)EVREventType.VREvent_RestartRequested:
                case (uint)EVREventType.VREvent_ProcessQuit:
                    m_active = false;
                    break;

                case (uint)EVREventType.VREvent_TrackedDeviceDeactivated:
                {
                    if (m_leftHandController == m_vrEvent.trackedDeviceIndex)
                    {
                        m_leftHandController = OpenVR.k_unTrackedDeviceIndexInvalid;
                    }
                    if (m_rightHandController == m_vrEvent.trackedDeviceIndex)
                    {
                        m_rightHandController = OpenVR.k_unTrackedDeviceIndexInvalid;
                    }
                }
                break;
                }
            }

            if (m_trackedPoses[OpenVR.k_unTrackedDeviceIndex_Hmd].bPoseIsValid)
            {
                GlmSharp.mat4 l_matrix = GlmSharp.mat4.Identity;
                m_trackedPoses[OpenVR.k_unTrackedDeviceIndex_Hmd].mDeviceToAbsoluteTracking.Convert(ref l_matrix);
                m_core.GetControlManager().SetHeadTransform(l_matrix);
            }

            if (m_leftHandController != OpenVR.k_unTrackedDeviceIndexInvalid)
            {
                GlmSharp.mat4 l_matrix = GlmSharp.mat4.Identity;
                m_trackedPoses[m_leftHandController].mDeviceToAbsoluteTracking.Convert(ref l_matrix);
                m_core.GetControlManager().SetHandTransform(ControlManager.Hand.Left, l_matrix);
            }
            else
            {
                m_leftHandController = m_vrSystem.GetTrackedDeviceIndexForControllerRole(ETrackedControllerRole.LeftHand);
            }

            if (m_rightHandController != OpenVR.k_unTrackedDeviceIndexInvalid)
            {
                GlmSharp.mat4 l_matrix = GlmSharp.mat4.Identity;
                m_trackedPoses[m_rightHandController].mDeviceToAbsoluteTracking.Convert(ref l_matrix);
                m_core.GetControlManager().SetHandTransform(ControlManager.Hand.Right, l_matrix);
            }
            else
            {
                m_rightHandController = m_vrSystem.GetTrackedDeviceIndexForControllerRole(ETrackedControllerRole.RightHand);
            }

            return(m_active);
        }
Esempio n. 4
0
 public void UpdatePoses()
 {
     vr.GetDeviceToAbsoluteTrackingPose(ETrackingUniverseOrigin.TrackingUniverseStanding, 0, Poses);
     foreach (var index in Indexes)
     {
         this.AllDevices[index].Pose = Poses[index].mDeviceToAbsoluteTracking;
     }
 }
Esempio n. 5
0
        private void TrackingLoop()
        {
            try
            {
                EVRInitError initError = EVRInitError.None;
                CVRSystem    cvrSystem = OpenVR.Init(ref initError, EVRApplicationType.VRApplication_Utility);
                var          chaperone = OpenVR.Chaperone;
                var          quadArea  = new HmdQuad_t();
                chaperone.GetPlayAreaRect(ref quadArea);
                _playArea = quadArea.ToPlayArea();
                if (initError != EVRInitError.None)
                {
                    throw new InvalidOperationException($"EVR init erro: {initError}");
                }
                while (_keepReading)
                {
                    TrackedDevicePose_t[] trackedDevicePoses = new TrackedDevicePose_t[OpenVR.k_unMaxTrackedDeviceCount];
                    cvrSystem.GetDeviceToAbsoluteTrackingPose(ETrackingUniverseOrigin.TrackingUniverseStanding, 0f, trackedDevicePoses);
                    for (uint trackedDeviceIndex = 0; trackedDeviceIndex < OpenVR.k_unMaxTrackedDeviceCount; trackedDeviceIndex++)
                    {
                        if (cvrSystem.IsTrackedDeviceConnected(trackedDeviceIndex))
                        {
                            ETrackedDeviceClass deviceClass = cvrSystem.GetTrackedDeviceClass(trackedDeviceIndex);
                            if (true)
                            {
                                VRControllerState_t controllerState = new VRControllerState_t();
                                cvrSystem.GetControllerState(1, ref controllerState, (uint)System.Runtime.InteropServices.Marshal.SizeOf(typeof(VRControllerState_t)));
                                ETrackingResult trackingResult = trackedDevicePoses[trackedDeviceIndex].eTrackingResult;

                                bool trigger    = controllerState.rAxis1.x > 0.9f;
                                bool menuButton = (controllerState.ulButtonPressed & (1ul << (int)EVRButtonId.k_EButton_ApplicationMenu)) != 0;
                                bool gripButton = (controllerState.ulButtonPressed & (1ul << (int)EVRButtonId.k_EButton_Grip)) != 0;

                                if (trackingResult == ETrackingResult.Running_OK)
                                {
                                    HmdMatrix34_t trackingMatrix = trackedDevicePoses[trackedDeviceIndex].mDeviceToAbsoluteTracking;

                                    Vector3            speedVector    = trackedDevicePoses[trackedDeviceIndex].vVelocity.ToVelocityVector();
                                    Vector3            position       = trackingMatrix.ToPositionVector();
                                    DeviceTrackingData trackingUpdate = new DeviceTrackingData((int)trackedDeviceIndex, deviceClass.ToString(), position, trackingMatrix.ToRotationQuaternion());
                                    NewPoseUpdate?.Invoke(this, trackingUpdate);
                                }
                            }
                        }
                    }
                    Thread.Sleep(UpdatedInterval);
                }
            }
            catch (Exception e)
            {
                Console.WriteLine($"Error: {e}");
            }
            finally
            {
                OpenVR.Shutdown();
            }
        }
Esempio n. 6
0
        private static void SteamVr()
        {
            Console.WriteLine("Starting");
            EVRInitError initError = EVRInitError.None;
            CVRSystem    cvrSystem = OpenVR.Init(ref initError, EVRApplicationType.VRApplication_Utility);

            Console.WriteLine("Error: " + initError.ToString());
            if (cvrSystem == null)
            {
                Console.WriteLine("Error!");
            }
            while (true)
            {
                Thread.Sleep(1);
                TrackedDevicePose_t[] trackedDevicePose = new TrackedDevicePose_t[OpenVR.k_unMaxTrackedDeviceCount];
                cvrSystem.GetDeviceToAbsoluteTrackingPose(ETrackingUniverseOrigin.TrackingUniverseRawAndUncalibrated, 0f, trackedDevicePose);
                VRControllerState_t controllerState = new VRControllerState_t();
                cvrSystem.GetControllerState(1, ref controllerState,
                                             (uint)System.Runtime.InteropServices.Marshal.SizeOf(typeof(VRControllerState_t)));
                int  trigger   = controllerState.rAxis1.x > 0.9f ? 1 : 0;
                bool topButtom = (controllerState.ulButtonPressed & (1ul << (int)EVRButtonId.k_EButton_ApplicationMenu)) != 0;

                TrackedDevicePose_t pose           = trackedDevicePose[1];
                ETrackingResult     trackingResult = pose.eTrackingResult;
                HmdMatrix34_t       hmdMatrix      = pose.mDeviceToAbsoluteTracking;
                Position            pos            = new Position(hmdMatrix);
                Rotation            rot            = new Rotation(hmdMatrix);
                Console.WriteLine($"Position: {pos} Rotation: {rot} trigger {trigger} app {topButtom}");
                foreach (Socket client in _clients.ToArray())
                {
                    try
                    {
                        client.Send(Encoding.ASCII.GetBytes($"S{pos.ToData()} {rot.ToData()} {trigger} {(topButtom ? 1 : 0)}E"));
                    }
                    catch (Exception)
                    {
                        _clients.Remove(client);
                    }
                }
            }
            for (int i = 0; i < OpenVR.k_unMaxTrackedDeviceCount; i++)
            {
                if (cvrSystem?.IsTrackedDeviceConnected((uint)i) ?? false)
                {
                    ETrackedDeviceClass deviceClass = cvrSystem.GetTrackedDeviceClass((uint)i);
                    Console.WriteLine($"index: {i} is {deviceClass}");
                }
            }
            Console.ReadLine();
            OpenVR.Shutdown();
            Console.WriteLine("Shut down");
            Console.ReadLine();
        }
Esempio n. 7
0
    private void QueryPose(int deviceID)
    {
        // this array can be reused
        TrackedDevicePose_t[] allPoses = new TrackedDevicePose_t[OpenVR.k_unMaxTrackedDeviceCount];
        vrSystem.GetDeviceToAbsoluteTrackingPose(ETrackingUniverseOrigin.TrackingUniverseStanding, 0, allPoses);
        var pose = allPoses[deviceID];

        if (pose.bPoseIsValid)
        {
            var absTracking = pose.mDeviceToAbsoluteTracking;
            var mat         = new SteamVR_Utils.RigidTransform(absTracking);
            Debug.Log(mat.pos + " " + mat.rot);
        }
    }
    // get tracked device poses
    void Update()
    {
        // get the poses of all tracked devices
        _vrSystem.GetDeviceToAbsoluteTrackingPose(ETrackingUniverseOrigin.TrackingUniverseStanding, 0.0f, _poses);
        //_vrSystem.

        //print(_poses.Length);

        // send the poses to SteamVR_TrackedObject components
        SteamVR_Events.NewPoses.Send(_poses);
        //SteamVR_Events.

        // Check what happens in SteamVRModule.cs to see if its possible to forward events.
    }
Esempio n. 9
0
    //----------おまけ(deviceの詳細情報)-------------

    //全てのdeviceの情報をログに出力する
    private void showDevices()
    {
#pragma warning disable 0219
        string Tag = "[" + this.GetType().Name + ":" + System.Reflection.MethodBase.GetCurrentMethod(); //クラス名とメソッド名を自動取得
#pragma warning restore 0219

        //すべてのdeviceの接続状態を取得
        TrackedDevicePose_t[] allDevicePose = new TrackedDevicePose_t[OpenVR.k_unMaxTrackedDeviceCount];
        openvr.GetDeviceToAbsoluteTrackingPose(ETrackingUniverseOrigin.TrackingUniverseStanding, 0f, allDevicePose);

        //接続されているdeviceの数をカウントする
        uint connectedDeviceNum = 0;
        for (uint i = 0; i < OpenVR.k_unMaxTrackedDeviceCount; i++)
        {
            if (allDevicePose[i].bDeviceIsConnected)
            {
                connectedDeviceNum++;
            }
        }

        //deviceの詳細情報を1つづつ読み出す
        uint connectedDeviceCount = 0;
        for (uint i = 0; i < OpenVR.k_unMaxTrackedDeviceCount; i++)
        {
            //接続中だったら、読み取り完了数を1増やす
            if (GetPropertyAndPutLog(i, allDevicePose))
            {
                connectedDeviceCount++;
            }
            //接続されている数だけ読み取り終わったら終了する
            if (connectedDeviceCount >= connectedDeviceNum)
            {
                break;
            }
        }
    }
 /// <summary>
 /// Update ViveTracker transforms using the corresponding Vive Tracker devices.
 /// </summary>
 public override void UpdateTrackers()
 {
     if (!_ovrInit)
     {
         return;
     }
     // Fetch last Vive Tracker devices poses.
     _cvrSystem.GetDeviceToAbsoluteTrackingPose(ETrackingUniverseOrigin.TrackingUniverseStanding, 0, _ovrTrackedDevicePoses);
     // Apply poses to ViveTracker objects.
     foreach (var tracker in _trackers)
     {
         TrackedDevicePose_t          pose           = _ovrTrackedDevicePoses[tracker.ID.TrackedDevice_Index];
         SteamVR_Utils.RigidTransform rigidTransform = new SteamVR_Utils.RigidTransform(pose.mDeviceToAbsoluteTracking);
         tracker.UpdateState(pose.bDeviceIsConnected && pose.bPoseIsValid && (pose.eTrackingResult == ETrackingResult.Running_OK), rigidTransform.pos, rigidTransform.rot);
     }
 }
Esempio n. 11
0
        public override bool GetHmdYaw(ref double yaw)
        {
            if (OpenVRConnStatus != OpenVRConnectionStatus.AllOK)
            {
                return(false);
            }

            VRSys.GetDeviceToAbsoluteTrackingPose(ETrackingUniverseOrigin.TrackingUniverseStanding, 0, PoseArray);
            if (!PoseArray[HmdIndex].bPoseIsValid)
            {
                return(false);
            }

            yaw = GetYawFromOrientation(GetOrientation(PoseArray[HmdIndex].mDeviceToAbsoluteTracking));
            return(true);
        }
        private void UpdateTrackedObj()
        {
            TrackedDevicePose_t[] allPoses = new TrackedDevicePose_t[OpenVR.k_unMaxTrackedDeviceCount];

            _vrSystem.GetDeviceToAbsoluteTrackingPose(ETrackingUniverseOrigin.TrackingUniverseStanding, 0, allPoses);

            for (int i = 0; i < _validDeviceIds.Count; i++)
            {
                if (i < targetObjs.Count)
                {
                    var pose        = allPoses[_validDeviceIds[i]];
                    var absTracking = pose.mDeviceToAbsoluteTracking;
                    var mat         = new SteamVR_Utils.RigidTransform(absTracking);
                    targetObjs[i].transform.SetPositionAndRotation(mat.pos, mat.rot);
                }
            }
        }
Esempio n. 13
0
    void UpdateTrackedObj()
    {
        TrackedDevicePose_t[] allPoses = new TrackedDevicePose_t[OpenVR.k_unMaxTrackedDeviceCount];

        _vrSystem.GetDeviceToAbsoluteTrackingPose(ETrackingUniverseOrigin.TrackingUniverseStanding, 0, allPoses);

        for (int i = 0; i < _validDeviceIds.Count; i++)
        {
            if (i < targetObjs.Length)
            {
                var        pose        = allPoses[_validDeviceIds[i]];
                var        absTracking = pose.mDeviceToAbsoluteTracking;
                var        mat         = new SteamVR_Utils.RigidTransform(absTracking);
                Quaternion fixingQ     = Quaternion.AngleAxis(-90f, new Vector3(1f, 0f, 0f));
                targetObjs[i].transform.SetPositionAndRotation(mat.pos, mat.rot * fixingQ);
            }
        }
    }
Esempio n. 14
0
        public void Update()
        {
            if (!Success)
            {
                return;
            }
            TrackedDevices = new VrTrackedDevices(this.vr);
            //Initializing object to hold indexes for various tracked objects
            vr.GetDeviceToAbsoluteTrackingPose(ETrackingUniverseOrigin.TrackingUniverseStanding, 0, Poses);

            //# Iterate through the pose list to find the active Devices and determine their type
            for (int i = 0; i < OpenVR.k_unMaxTrackedDeviceCount; i++)
            {
                if (Poses[i].bPoseIsValid)
                {
                    TrackedDevices.AddTrackedDevice(i);
                }
            }
        }
Esempio n. 15
0
        void HMDCoords()
        {
            if (!vrContext.IsTrackedDeviceConnected((uint)HMD.Id))
            {
                return;
            }

            //TrackedDevicePose_t struct is a OpenVR struct. See line 180 in the openvr.h header.
            TrackedDevicePose_t[] trackedDevicePose = new TrackedDevicePose_t[1];
            //if (vrContext.IsInputFocusCapturedByAnotherProcess())
            //    printf("\nINFO--Input Focus by Another Process");
            vrContext.GetDeviceToAbsoluteTrackingPose(ETrackingUniverseOrigin.TrackingUniverseStanding, 0f, trackedDevicePose);
            var mat = ConvertMatrix(trackedDevicePose[0].mDeviceToAbsoluteTracking);

            HMD.Position = GetPosition(mat);
            HMD.Rotation = GetRotation(mat);
            //Console.WriteLine(111111);
            //Console.WriteLine(mat);
        }
Esempio n. 16
0
        private void UpdatePoses()
        {
            _vrSystem.GetDeviceToAbsoluteTrackingPose(_trackingOrigin, 0, _allPoses);

            for (int i = 0; i < _tracker.Count; i++)
            {
                int index = _tracker[i].DeviceId;

                if (index == -1)
                {
                    continue;
                }

                var pose = _allPoses[index];

                float batteryPercent = 1.0f;
                bool  isCharging     = false;

                if (_tracker[i].HasBattery)
                {
                    var error = ETrackedPropertyError.TrackedProp_UnknownProperty;
                    batteryPercent = _vrSystem.GetFloatTrackedDeviceProperty((uint)index, ETrackedDeviceProperty.Prop_DeviceBatteryPercentage_Float, ref error);

                    isCharging = _vrSystem.GetBoolTrackedDeviceProperty((uint)index, ETrackedDeviceProperty.Prop_DeviceIsCharging_Bool, ref error);
                }

                _tracker[i].SetTrackingState(pose.eTrackingResult, batteryPercent, isCharging, false);

                if (pose.bPoseIsValid)
                {
                    var absTracking = pose.mDeviceToAbsoluteTracking;

                    Vector3    pos;
                    Quaternion rot;
                    HOVR_Utility.GetPosAndRotation(absTracking, out pos, out rot);

                    pos.Scale(_posScale);

                    _tracker[i].ReceivePose(pos, rot);
                }
            }
        }
    // Query a Pose and then assign the pose
    private void QueryPose(int deviceID)
    {
        // this array can be reused
        TrackedDevicePose_t[] allPoses = new TrackedDevicePose_t[OpenVR.k_unMaxTrackedDeviceCount];


        vrSystem.GetDeviceToAbsoluteTrackingPose(ETrackingUniverseOrigin.TrackingUniverseStanding, 0, allPoses);


        var pose = allPoses[genericTrackers[deviceID]];

        if (pose.bPoseIsValid)
        {
            var absTracking = pose.mDeviceToAbsoluteTracking;
            var mat         = new SteamVR_Utils.RigidTransform(absTracking);
            // Assign positions
            transform.position = mat.pos;
            trackerPos         = mat.pos;
            transform.rotation = mat.rot;
        }
    }
 void _getPose()
 {
     lock (thisLock)
     {
         while (!workFinished)
         {
             TrackedDevicePose_t[]
             allPoses = new TrackedDevicePose_t[OpenVR.k_unMaxTrackedDeviceCount];
             vrSystem.GetDeviceToAbsoluteTrackingPose(ETrackingUniverseOrigin.TrackingUniverseStanding, 0, allPoses);
             var pose = allPoses[0];
             if (pose.bPoseIsValid)
             {
                 var absTracking = pose.mDeviceToAbsoluteTracking;
                 var mat         = new SteamVR_Utils.RigidTransform(absTracking);
                 Debug.Log("Position: " + mat.pos + " Rotation: " + mat.rot.eulerAngles);
                 dataManager.AddHeadPos(0.0f, mat.pos, mat.rot.eulerAngles);
             }
         }
         if (workFinished)
         {
             dataManager.WriteHeadPosData();
         }
     }
 }
Esempio n. 19
0
        private async Task ParseTrackingFrameAsync(CancellationToken token)
        {
            try
            {
                for (uint i = 0; i < OpenVR.k_unMaxTrackedDeviceCount; i++)
                {
                    if (!token.IsCancellationRequested)
                    {
                        TrackedDevicePose_t[] trackedDevicePose = new TrackedDevicePose_t[10];

                        if (!m_pHMD.IsTrackedDeviceConnected(i))
                        {
                            continue;
                        }

                        ETrackedDeviceClass trackedDeviceClass = m_pHMD.GetTrackedDeviceClass(i);

                        switch (trackedDeviceClass)
                        {
                        case ETrackedDeviceClass.HMD:

                            m_pHMD.GetDeviceToAbsoluteTrackingPose(ETrackingUniverseOrigin.TrackingUniverseStanding, 0, trackedDevicePose);

                            HmdVector3_t position = GetPosition(trackedDevicePose[0].mDeviceToAbsoluteTracking);    // devicePose->mDeviceToAbsoluteTracking);
                            HmdVector3_t rotation = GetRotationEuler(trackedDevicePose[0].mDeviceToAbsoluteTracking);

                            int positionX = (int)position.v0;
                            int positionY = (int)position.v1;
                            int positionZ = (int)position.v2 * (-1);

                            int rotationX = (int)rotation.v0 + 360;
                            int rotationY = (int)rotation.v1 + 90;
                            int rotationZ = (int)rotation.v2 * (-1);

                            if (ControlViewModel.teleporOffset[0] != -1)
                            {
                                lock (ControlViewModel.teleporOffset)
                                {
                                    ControlViewModel.transOffSetHeadX = ControlViewModel.teleporOffset[0];
                                    ControlViewModel.transOffSetHeadY = ControlViewModel.teleporOffset[1];
                                    ControlViewModel.transOffSetHeadZ = ControlViewModel.teleporOffset[2];
                                    ControlViewModel.rotOffSetHeadZ   = ControlViewModel.teleporOffset[3];
                                }
                            }

                            if (communicationProtocolUdp == false)
                            {
                                MessageBuffer mb       = new MessageBuffer();
                                int           type     = 100;
                                string        ipAdress = ServerManager.clientIpAddressForTracking;
                                mb.add(type);
                                mb.add(userId);
                                mb.add(ipAdress);
                                mb.add(positionX + ControlViewModel.transOffSetHeadX);
                                mb.add(positionY + ControlViewModel.transOffSetHeadY);
                                mb.add(positionZ + ControlViewModel.transOffSetHeadZ);
                                mb.add(rotationX - ControlViewModel.rotOffSetHeadZ);
                                mb.add(rotationY);
                                mb.add(rotationZ);
                                Message msg = new Message(mb, Message.MessagesType.COVISE_MESSAGE_VRB_MESSAGE);
                                lock (tcpSocketManager.send_msg(msg))
                                {
                                    tcpSocketManager.send_msg(msg);
                                }

                                Thread.Sleep(20);
                                break;
                            }
                            break;
                        }
                    }
                }
            }
            catch (Exception e)
            {
                log.Warn("ParseTrackingFrameAsync in Hmd Tracking wurde beendet!");

                RaiseSampleEvent(new TrackingChangedEventArgs(e));
            }
        }
Esempio n. 20
0
        /// <summary>
        /// Overrides the Update method, called every frame.
        /// </summary>
        void LateUpdate()
        {
            try
            {
                // do nothing unless we are in IVA
                hmdIsAllowed = (CameraManager.Instance.currentCameraMode == CameraManager.CameraMode.IVA);

                // start HMD using the Y key
                if (Input.GetKeyDown(KeyCode.Y) && hmdIsAllowed)
                {
                    if (!hmdIsInitialized)
                    {
                        log("Initializing HMD...");
                        try
                        {
                            bool retVal = InitHMD();
                            if (retVal)
                            {
                                log("HMD initialized.");
                            }
                        }
                        catch (Exception e)
                        {
                            err(e.Message);
                        }
                    }
                    else
                    {
                        ResetInitialHmdPosition();
                    }
                }

                // perform regular updates if HMD is initialized
                if (hmdIsAllowed && hmdIsInitialized)
                {
                    EVRCompositorError vrCompositorError = EVRCompositorError.None;

                    // get latest HMD pose
                    //--------------------------------------------------------------
                    vrSystem.GetDeviceToAbsoluteTrackingPose(ETrackingUniverseOrigin.TrackingUniverseSeated, 0.0f, vrDevicePoses);
                    HmdMatrix34_t vrLeftEyeTransform  = vrSystem.GetEyeToHeadTransform(EVREye.Eye_Left);
                    HmdMatrix34_t vrRightEyeTransform = vrSystem.GetEyeToHeadTransform(EVREye.Eye_Right);
                    vrCompositorError = vrCompositor.WaitGetPoses(vrRenderPoses, vrGamePoses);

                    if (vrCompositorError != EVRCompositorError.None)
                    {
                        warn("WaitGetPoses failed: " + (int)vrCompositorError);
                        return;
                    }

                    // convert SteamVR poses to Unity coordinates
                    var hmdTransform         = new SteamVR_Utils.RigidTransform(vrDevicePoses[OpenVR.k_unTrackedDeviceIndex_Hmd].mDeviceToAbsoluteTracking);
                    var hmdLeftEyeTransform  = new SteamVR_Utils.RigidTransform(vrLeftEyeTransform);
                    var hmdRightEyeTransform = new SteamVR_Utils.RigidTransform(vrRightEyeTransform);
                    var ctrlPoseLeft         = new SteamVR_Utils.RigidTransform(vrDevicePoses[ctrlIndexLeft].mDeviceToAbsoluteTracking);
                    var ctrlPoseRight        = new SteamVR_Utils.RigidTransform(vrDevicePoses[ctrlIndexRight].mDeviceToAbsoluteTracking);



                    // Render the LEFT eye
                    //--------------------------------------------------------------
                    // rotate camera according to the HMD orientation
                    InternalCamera.Instance.transform.localRotation = hmdTransform.rot;

                    // translate the camera to match the position of the left eye, from origin
                    InternalCamera.Instance.transform.localPosition = new Vector3(0f, 0f, 0f);
                    InternalCamera.Instance.transform.Translate(hmdLeftEyeTransform.pos);

                    // translate the camera to match the position of the HMD
                    InternalCamera.Instance.transform.localPosition += hmdTransform.pos;

                    // move the FlightCamera to match the position of the InternalCamera (so the outside world moves accordingly)
                    FlightCamera.fetch.transform.position = InternalSpace.InternalToWorld(InternalCamera.Instance.transform.position);
                    FlightCamera.fetch.transform.rotation = InternalSpace.InternalToWorld(InternalCamera.Instance.transform.rotation);

                    // render the set of cameras
                    foreach (CameraProperties camStruct in camerasToRender)
                    {
                        // set projection matrix
                        camStruct.camera.projectionMatrix = camStruct.hmdLeftProjMatrix;

                        // set texture to render to
                        camStruct.camera.targetTexture = hmdLeftEyeRenderTexture;

                        // render camera
                        camStruct.camera.Render();
                    }


                    // Render the RIGHT eye (see previous comments)
                    //--------------------------------------------------------------
                    InternalCamera.Instance.transform.localRotation = hmdTransform.rot;
                    InternalCamera.Instance.transform.localPosition = new Vector3(0f, 0f, 0f);
                    InternalCamera.Instance.transform.Translate(hmdRightEyeTransform.pos);
                    InternalCamera.Instance.transform.localPosition += hmdTransform.pos;
                    FlightCamera.fetch.transform.position            = InternalSpace.InternalToWorld(InternalCamera.Instance.transform.position);
                    FlightCamera.fetch.transform.rotation            = InternalSpace.InternalToWorld(InternalCamera.Instance.transform.rotation);

                    foreach (CameraProperties camStruct in camerasToRender)
                    {
                        camStruct.camera.projectionMatrix = camStruct.hmdRightProjMatrix;
                        camStruct.camera.targetTexture    = hmdRightEyeRenderTexture;
                        camStruct.camera.Render();
                    }

                    try
                    {
                        // Set camera position to an HMD-centered position (for regular screen rendering)
                        //--------------------------------------------------------------
                        if (renderToScreen)
                        {
                            foreach (CameraProperties camStruct in camerasToRender)
                            {
                                camStruct.camera.targetTexture    = null;
                                camStruct.camera.projectionMatrix = camStruct.originalProjMatrix;
                            }
                            InternalCamera.Instance.transform.localRotation = hmdTransform.rot;
                            InternalCamera.Instance.transform.localPosition = hmdTransform.pos;
                            FlightCamera.fetch.transform.position           = InternalSpace.InternalToWorld(InternalCamera.Instance.transform.position);
                            FlightCamera.fetch.transform.rotation           = InternalSpace.InternalToWorld(InternalCamera.Instance.transform.rotation);
                        }


                        // Submit frames to HMD
                        //--------------------------------------------------------------
                        vrCompositorError = vrCompositor.Submit(EVREye.Eye_Left, ref hmdLeftEyeTexture, ref hmdTextureBounds, EVRSubmitFlags.Submit_Default);
                        if (vrCompositorError != EVRCompositorError.None)
                        {
                            warn("Submit (Eye_Left) failed: " + (int)vrCompositorError);
                        }

                        vrCompositorError = vrCompositor.Submit(EVREye.Eye_Right, ref hmdRightEyeTexture, ref hmdTextureBounds, EVRSubmitFlags.Submit_Default);
                        if (vrCompositorError != EVRCompositorError.None)
                        {
                            warn("Submit (Eye_Right) failed: " + (int)vrCompositorError);
                        }

                        vrCompositor.PostPresentHandoff();

                        //  GL.Flush();
                    } catch (Exception e)
                    {
                        err("Exception! " + e.ToString());
                    }

                    // disable highlighting of parts due to mouse
                    // TODO: there needs to be a better way to do this. this affects the Part permanently
                    Part hoveredPart = Mouse.HoveredPart;
                    if (hoveredPart != null)
                    {
                        hoveredPart.HighlightActive  = false;
                        hoveredPart.highlightColor.a = 0f;// = new Color(0f, 0f, 0f, 0f);
                        //Debug.Log("[KerbalVR] hovered part: " + hoveredPart.name);
                    }


                    // DEBUG
                    if (Input.GetKeyDown(KeyCode.O))
                    {
                        log("POSITION hmdTransform : " + hmdTransform.pos.x + ", " + hmdTransform.pos.y + ", " + hmdTransform.pos.z);
                        log("POSITION hmdLTransform : " + hmdLeftEyeTransform.pos.x + ", " + hmdLeftEyeTransform.pos.y + ", " + hmdLeftEyeTransform.pos.z);
                        log("POSITION hmdRTransform : " + hmdRightEyeTransform.pos.x + ", " + hmdRightEyeTransform.pos.y + ", " + hmdRightEyeTransform.pos.z);
                        log("POSITION ctrlPoseRight : " + ctrlPoseRight.pos.x + ", " + ctrlPoseRight.pos.y + ", " + ctrlPoseRight.pos.z);

                        log("POSITION InternalCamera.Instance.transform.abs : " + InternalCamera.Instance.transform.position.x + ", " + InternalCamera.Instance.transform.position.y + ", " + InternalCamera.Instance.transform.position.z);
                        log("POSITION InternalCamera.Instance.transform.rel : " + InternalCamera.Instance.transform.localPosition.x + ", " + InternalCamera.Instance.transform.localPosition.y + ", " + InternalCamera.Instance.transform.localPosition.z);

                        foreach (Camera c in Camera.allCameras)
                        {
                            log("Camera: " + c.name + ", cullingMask = " + c.cullingMask);
                        }
                    }
                }

                // if we are exiting VR, restore the cameras
                if (!hmdIsAllowed && hmdIsAllowed_prev)
                {
                    foreach (CameraProperties camStruct in camerasToRender)
                    {
                        camStruct.camera.projectionMatrix = camStruct.originalProjMatrix;
                        camStruct.camera.targetTexture    = null;
                    }
                }

                hmdIsAllowed_prev = hmdIsAllowed;
            }
            catch (Exception e)
            {
                err(e.ToString());
            }
        }
Esempio n. 21
0
        private static void ReadPoses(float seconsdAhead)
        {//to be called from RENDER thread
            if (m_vrCompositor == null)
            {
                return;
            }
            ProfilerShort.Begin("MOVR:ReadPoses");
            //MyLog.Default.WriteLine("   GetPoses");
            var error3 = m_vrCompositor.WaitGetPoses(renderPose, gamePose);//TODO will not initialize correctly without it but maybe not necessary to do all the time

            m_vrSystem.GetDeviceToAbsoluteTrackingPose(m_vrCompositor.GetTrackingSpace(), seconsdAhead, gamePose);

            uint nDevice = 0;
            bool firstControllerFound = false;

            foreach (var rPose in gamePose)
            {
                if (!rPose.bDeviceIsConnected)
                {
                    break;
                }
                if (rPose.bPoseIsValid)
                {
                    switch (m_vrSystem.GetTrackedDeviceClass(nDevice))
                    {
                    case ETrackedDeviceClass.HMD:
                        if (rPose.eTrackingResult != ETrackingResult.Running_OK)
                        {
                            Log.WriteLineAndConsole("Pose: " + nDevice + " not Running OK");
                            continue;
                        }
                        PoseToViewMatrix(ref m_viewHMD, ref gamePose[nDevice].mDeviceToAbsoluteTracking);
                        PoseToTransMatrixD(ref m_headsetPosD, ref gamePose[nDevice].mDeviceToAbsoluteTracking);
                        m_viewHMD.M42 -= FloorOffset;

                        //QS1 axes: X red ship's rear
                        //          Y up
                        //          Z from red ship to platform

                        //translation up-down is inverted
                        break;

                    case ETrackedDeviceClass.Controller:
                        if (!firstControllerFound)
                        {
                            firstControllerFound = true;
                            if (m_controller1ID != nDevice)
                            {
                                Log.WriteLine("Controller1 is now ID #" + nDevice);
                                m_controller1ID = nDevice;
                            }
                        }
                        else
                        if (m_controller2ID != nDevice)
                        {
                            Log.WriteLine("Controller2 is now ID #" + nDevice);
                            m_controller2ID = nDevice;
                        }
                        if (nDevice == m_controller1ID)
                        {
                            PoseToTransMatrix(ref m_c1pos, ref gamePose[nDevice].mDeviceToAbsoluteTracking);
                        }
                        else
                        if (nDevice == m_controller2ID)
                        {
                            PoseToTransMatrix(ref m_c2pos, ref gamePose[nDevice].mDeviceToAbsoluteTracking);
                        }
                        break;
                    }
                }
                //else
                //    Log.WriteLineAndConsole("Pose: " + nDevice + " not valid");

                nDevice++;
            }
            ProfilerShort.End();
        }
        private void VRInit()
        {
            // init
            var error = EVRInitError.None;

            system = OpenVR.Init(ref error);
            if (error != EVRInitError.None)
            {
                throw new Exception();
            }

            OpenVR.GetGenericInterface(OpenVR.IVRSystem_Version, ref error);
            if (error != EVRInitError.None)
            {
                throw new Exception();
            }

            TrackedDevicePose_t[] m_rTrackedDevicePose = new TrackedDevicePose_t[OpenVR.k_unMaxTrackedDeviceCount];
            TrackedDevicePose_t   TrackedDevicePose    = new TrackedDevicePose_t();
            VRControllerState_t   controllerState      = new VRControllerState_t();

            while (true)
            {
                system.GetDeviceToAbsoluteTrackingPose(ETrackingUniverseOrigin.TrackingUniverseStanding, 0, m_rTrackedDevicePose);

                for (uint unDevice = 0; unDevice < OpenVR.k_unMaxTrackedDeviceCount; unDevice++)
                {
                    if (!system.IsTrackedDeviceConnected(unDevice))
                    {
                        continue;
                    }

                    HmdVector3_t    position;
                    HmdQuaternion_t quaternion;

                    // Get what type of device it is and work with its data
                    ETrackedDeviceClass    trackedDeviceClass    = system.GetTrackedDeviceClass(unDevice);
                    ETrackedControllerRole trackedControllerRole = system.GetControllerRoleForTrackedDeviceIndex(unDevice);
                    ETrackingResult        eTrackingResult;

                    switch (trackedDeviceClass)
                    {
                    case ETrackedDeviceClass.HMD:

                        // get the position and rotation
                        position   = GetPosition(m_rTrackedDevicePose[unDevice].mDeviceToAbsoluteTracking);
                        quaternion = GetRotation(m_rTrackedDevicePose[unDevice].mDeviceToAbsoluteTracking);

                        // for printing some more info to the user about the state of the device/pose
                        eTrackingResult = m_rTrackedDevicePose[unDevice].eTrackingResult;

                        // print the tracking data
                        Dispatcher.Invoke(DispatcherPriority.Normal, new Action(delegate {
                            HmdIndex.Text       = String.Format("{0}", unDevice);
                            HmdVectorX.Text     = String.Format("{0:F4}", position.v0);
                            HmdVectorY.Text     = String.Format("{0:F4}", position.v1);
                            HmdVectorZ.Text     = String.Format("{0:F4}", position.v2);
                            HmdQuaternionX.Text = String.Format("{0:F4}", quaternion.x);
                            HmdQuaternionY.Text = String.Format("{0:F4}", quaternion.y);
                            HmdQuaternionZ.Text = String.Format("{0:F4}", quaternion.z);
                            HmdQuaternionW.Text = String.Format("{0:F4}", quaternion.w);
                            HmdState.Text       = GetDeviceState(eTrackingResult);
                        }));
                        break;

                    case ETrackedDeviceClass.Controller:

                        // get the position and rotation
                        position   = GetPosition(m_rTrackedDevicePose[unDevice].mDeviceToAbsoluteTracking);
                        quaternion = GetRotation(m_rTrackedDevicePose[unDevice].mDeviceToAbsoluteTracking);

                        // for printing some more info to the user about the state of the device/pose
                        eTrackingResult = m_rTrackedDevicePose[unDevice].eTrackingResult;

                        // get Controllers info
                        system.GetControllerStateWithPose(ETrackingUniverseOrigin.TrackingUniverseStanding, unDevice, ref controllerState, (uint)Marshal.SizeOf(controllerState), ref TrackedDevicePose);

                        switch (trackedControllerRole)
                        {
                        case ETrackedControllerRole.LeftHand:

                            // print the tracking data
                            Dispatcher.Invoke(DispatcherPriority.Normal, new Action(delegate {
                                CLIndex.Text       = String.Format("{0}", unDevice);
                                CLVectorX.Text     = String.Format("{0:F4}", position.v0);
                                CLVectorY.Text     = String.Format("{0:F4}", position.v1);
                                CLVectorZ.Text     = String.Format("{0:F4}", position.v2);
                                CLQuaternionX.Text = String.Format("{0:F4}", quaternion.x);
                                CLQuaternionY.Text = String.Format("{0:F4}", quaternion.y);
                                CLQuaternionZ.Text = String.Format("{0:F4}", quaternion.z);
                                CLQuaternionW.Text = String.Format("{0:F4}", quaternion.w);
                                CLState.Text       = GetDeviceState(eTrackingResult);
                                CLulPressed.Text   = String.Format("{0}", controllerState.ulButtonPressed);
                                CLulTouched.Text   = String.Format("{0}", controllerState.ulButtonTouched);
                                CLAxis0X.Text      = String.Format("{0:F4}", controllerState.rAxis0.x);
                                CLAxis0Y.Text      = String.Format("{0:F4}", controllerState.rAxis0.y);
                                CLAxis1X.Text      = String.Format("{0:F4}", controllerState.rAxis1.x);
                                CLAxis1Y.Text      = String.Format("{0:F4}", controllerState.rAxis1.y);
                                CLAxis2X.Text      = String.Format("{0:F4}", controllerState.rAxis2.x);
                                CLAxis2Y.Text      = String.Format("{0:F4}", controllerState.rAxis2.y);
                                CLAxis3X.Text      = String.Format("{0:F4}", controllerState.rAxis3.x);
                                CLAxis3Y.Text      = String.Format("{0:F4}", controllerState.rAxis3.y);
                                CLAxis4X.Text      = String.Format("{0:F4}", controllerState.rAxis4.x);
                                CLAxis4Y.Text      = String.Format("{0:F4}", controllerState.rAxis4.y);
                            }));
                            break;

                        case ETrackedControllerRole.RightHand:

                            // print the tracking data
                            Dispatcher.Invoke(DispatcherPriority.Normal, new Action(delegate {
                                CRIndex.Text       = String.Format("{0}", unDevice);
                                CRVectorX.Text     = String.Format("{0:F4}", position.v0);
                                CRVectorY.Text     = String.Format("{0:F4}", position.v1);
                                CRVectorZ.Text     = String.Format("{0:F4}", position.v2);
                                CRQuaternionX.Text = String.Format("{0:F4}", quaternion.x);
                                CRQuaternionY.Text = String.Format("{0:F4}", quaternion.y);
                                CRQuaternionZ.Text = String.Format("{0:F4}", quaternion.z);
                                CRQuaternionW.Text = String.Format("{0:F4}", quaternion.w);
                                CRState.Text       = GetDeviceState(eTrackingResult);
                                CRulPressed.Text   = String.Format("{0}", controllerState.ulButtonPressed);
                                CRulTouched.Text   = String.Format("{0}", controllerState.ulButtonTouched);
                                CRAxis0X.Text      = String.Format("{0:F4}", controllerState.rAxis0.x);
                                CRAxis0Y.Text      = String.Format("{0:F4}", controllerState.rAxis0.y);
                                CRAxis1X.Text      = String.Format("{0:F4}", controllerState.rAxis1.x);
                                CRAxis1Y.Text      = String.Format("{0:F4}", controllerState.rAxis1.y);
                                CRAxis2X.Text      = String.Format("{0:F4}", controllerState.rAxis2.x);
                                CRAxis2Y.Text      = String.Format("{0:F4}", controllerState.rAxis2.y);
                                CRAxis3X.Text      = String.Format("{0:F4}", controllerState.rAxis3.x);
                                CRAxis3Y.Text      = String.Format("{0:F4}", controllerState.rAxis3.y);
                                CRAxis4X.Text      = String.Format("{0:F4}", controllerState.rAxis4.x);
                                CRAxis4Y.Text      = String.Format("{0:F4}", controllerState.rAxis4.y);
                            }));
                            break;
                        }


                        break;

                    case ETrackedDeviceClass.GenericTracker:

                        system.GetControllerStateWithPose(ETrackingUniverseOrigin.TrackingUniverseStanding, unDevice, ref controllerState, (uint)Marshal.SizeOf(controllerState), ref TrackedDevicePose);
                        // get the position and rotation
                        position   = GetPosition(TrackedDevicePose.mDeviceToAbsoluteTracking);
                        quaternion = GetRotation(TrackedDevicePose.mDeviceToAbsoluteTracking);

                        // for printing some more info to the user about the state of the device/pose
                        eTrackingResult = m_rTrackedDevicePose[unDevice].eTrackingResult;

                        // print the tracking data
                        Dispatcher.Invoke(DispatcherPriority.Normal, new Action(delegate {
                            TrackerIndex.Text       = String.Format("{0}", unDevice);
                            TrackerVectorX.Text     = String.Format("{0:F4}", position.v0);
                            TrackerVectorY.Text     = String.Format("{0:F4}", position.v1);
                            TrackerVectorZ.Text     = String.Format("{0:F4}", position.v2);
                            TrackerQuaternionX.Text = String.Format("{0:F4}", quaternion.x);
                            TrackerQuaternionY.Text = String.Format("{0:F4}", quaternion.y);
                            TrackerQuaternionZ.Text = String.Format("{0:F4}", quaternion.z);
                            TrackerQuaternionW.Text = String.Format("{0:F4}", quaternion.w);
                            TrackerState.Text       = GetDeviceState(eTrackingResult);
                        }));
                        break;
                    }
                    Thread.Sleep(10);
                }
            }
        }
Esempio n. 23
0
        /// <summary>
        /// Overrides the Update method, called every frame.
        /// </summary>
        void Update()
        {
            // do nothing unless we are in IVA
            hmdIsAllowed = (CameraManager.Instance.currentCameraMode == CameraManager.CameraMode.IVA);

            // start HMD using the Y key
            if (Input.GetKeyDown(KeyCode.Y) && hmdIsAllowed)
            {
                if (!hmdIsInitialized)
                {
                    Debug.Log("[KerbalVR] Initializing HMD...");
                    bool retVal = InitHMD();
                    if (retVal)
                    {
                        Debug.Log("[KerbalVR] HMD initialized.");
                    }
                }
                else
                {
                    ResetInitialHmdPosition();
                }
            }

            // perform regular updates if HMD is initialized
            if (hmdIsAllowed && hmdIsInitialized)
            {
                EVRCompositorError vrCompositorError = EVRCompositorError.None;

                // get latest HMD pose
                //--------------------------------------------------------------
                vrSystem.GetDeviceToAbsoluteTrackingPose(ETrackingUniverseOrigin.TrackingUniverseSeated, 0.0f, vrDevicePoses);
                HmdMatrix34_t vrLeftEyeTransform  = vrSystem.GetEyeToHeadTransform(EVREye.Eye_Left);
                HmdMatrix34_t vrRightEyeTransform = vrSystem.GetEyeToHeadTransform(EVREye.Eye_Right);
                vrCompositorError = vrCompositor.WaitGetPoses(vrRenderPoses, vrGamePoses);

                if (vrCompositorError != EVRCompositorError.None)
                {
                    Debug.Log("[KerbalVR] WaitGetPoses failed: " + (int)vrCompositorError);
                    return;
                }

                // convert SteamVR poses to Unity coordinates
                var hmdTransform         = new SteamVR_Utils.RigidTransform(vrDevicePoses[OpenVR.k_unTrackedDeviceIndex_Hmd].mDeviceToAbsoluteTracking);
                var hmdLeftEyeTransform  = new SteamVR_Utils.RigidTransform(vrLeftEyeTransform);
                var hmdRightEyeTransform = new SteamVR_Utils.RigidTransform(vrRightEyeTransform);
                var ctrlPoseLeft         = new SteamVR_Utils.RigidTransform(vrDevicePoses[ctrlIndexLeft].mDeviceToAbsoluteTracking);
                var ctrlPoseRight        = new SteamVR_Utils.RigidTransform(vrDevicePoses[ctrlIndexRight].mDeviceToAbsoluteTracking);



                // Render the LEFT eye
                //--------------------------------------------------------------
                // rotate camera according to the HMD orientation
                InternalCamera.Instance.transform.localRotation = hmdTransform.rot;

                // translate the camera to match the position of the left eye, from origin
                InternalCamera.Instance.transform.localPosition = new Vector3(0f, 0f, 0f);
                InternalCamera.Instance.transform.Translate(hmdLeftEyeTransform.pos);

                // translate the camera to match the position of the HMD
                InternalCamera.Instance.transform.localPosition += hmdTransform.pos;

                // move the FlightCamera to match the position of the InternalCamera (so the outside world moves accordingly)
                FlightCamera.fetch.transform.position = InternalSpace.InternalToWorld(InternalCamera.Instance.transform.position);
                FlightCamera.fetch.transform.rotation = InternalSpace.InternalToWorld(InternalCamera.Instance.transform.rotation);

                // render the set of cameras
                foreach (CameraProperties camStruct in camerasToRender)
                {
                    // set projection matrix
                    camStruct.camera.projectionMatrix = camStruct.hmdLeftProjMatrix;

                    // set texture to render to
                    camStruct.camera.targetTexture = hmdLeftEyeRenderTexture;
                    RenderTexture.active           = hmdLeftEyeRenderTexture;

                    // render camera
                    camStruct.camera.Render();
                }


                // Render the RIGHT eye (see previous comments)
                //--------------------------------------------------------------
                InternalCamera.Instance.transform.localRotation = hmdTransform.rot;
                InternalCamera.Instance.transform.localPosition = new Vector3(0f, 0f, 0f);
                InternalCamera.Instance.transform.Translate(hmdRightEyeTransform.pos);
                InternalCamera.Instance.transform.localPosition += hmdTransform.pos;
                FlightCamera.fetch.transform.position            = InternalSpace.InternalToWorld(InternalCamera.Instance.transform.position);
                FlightCamera.fetch.transform.rotation            = InternalSpace.InternalToWorld(InternalCamera.Instance.transform.rotation);

                foreach (CameraProperties camStruct in camerasToRender)
                {
                    camStruct.camera.projectionMatrix = camStruct.hmdRightProjMatrix;
                    camStruct.camera.targetTexture    = hmdRightEyeRenderTexture;
                    RenderTexture.active = hmdRightEyeRenderTexture;
                    camStruct.camera.Render();
                }

                var origTex = uiCamera.targetTexture;
                uiCamera.targetTexture = uiTexture;
                RenderTexture.active   = uiTexture;
                uiCamera.Render();
                uiCamera.targetTexture = origTex;
                RenderTexture.active   = null;


                // Set camera position to an HMD-centered position (for regular screen rendering)
                //--------------------------------------------------------------
                if (renderToScreen)
                {
                    foreach (CameraProperties camStruct in camerasToRender)
                    {
                        camStruct.camera.targetTexture    = null;
                        RenderTexture.active              = null;
                        camStruct.camera.projectionMatrix = camStruct.originalProjMatrix;
                    }
                    InternalCamera.Instance.transform.localRotation = hmdTransform.rot;
                    InternalCamera.Instance.transform.localPosition = hmdTransform.pos;
                    FlightCamera.fetch.transform.position           = InternalSpace.InternalToWorld(InternalCamera.Instance.transform.position);
                    FlightCamera.fetch.transform.rotation           = InternalSpace.InternalToWorld(InternalCamera.Instance.transform.rotation);
                }



                // Set position of the hand controller props
                //--------------------------------------------------------------

                if (propLeftHand != null)
                {
                    propLeftHand.transform.position = InternalCamera.Instance.transform.parent.position;
                    propLeftHand.transform.rotation = InternalCamera.Instance.transform.parent.rotation;
                    propLeftHand.transform.Translate(ctrlPoseLeft.pos);
                    propLeftHand.transform.rotation *= ctrlPoseLeft.rot;
                    propLeftHandRenderer.enabled     = vrDevicePoses[ctrlIndexLeft].bDeviceIsConnected;

                    uiScreen.transform.position = InternalSpace.InternalToWorld(propLeftHand.transform.position);
                    uiScreen.transform.rotation = InternalSpace.InternalToWorld(propLeftHand.transform.rotation);
                    uiScreen.transform.Rotate(90f, 0f, 0f);
                }

                if (propRightHand != null)
                {
                    propRightHand.transform.position = InternalCamera.Instance.transform.parent.position;
                    propRightHand.transform.rotation = InternalCamera.Instance.transform.parent.rotation;
                    propRightHand.transform.Translate(ctrlPoseRight.pos);
                    propRightHand.transform.rotation *= ctrlPoseRight.rot;
                    propRightHandRenderer.enabled     = vrDevicePoses[ctrlIndexRight].bDeviceIsConnected;

                    InternalProp closestProp        = null;
                    float        closestDistanceSqr = 10000f;
                    foreach (InternalProp prop in activeVesselInternalProps)
                    {
                        if (!prop.name.Equals(propRightHand.name))
                        {
                            Vector3 directionToTarget   = prop.transform.position - gloveCollider.transform.position;
                            float   distanceToTargetSqr = directionToTarget.sqrMagnitude;
                            if (distanceToTargetSqr < closestDistanceSqr)
                            {
                                closestDistanceSqr = distanceToTargetSqr;
                                closestProp        = prop;
                            }
                        }
                    }
                }



                /*
                 * if (closestProp != null && closestDistanceSqr < 0.005f)
                 * {
                 *  Debug.Log("[KerbalVR] closest prop: " + closestProp + ", " + closestDistanceSqr + " m2");
                 *  foreach (InternalModule mod in closestProp.internalModules)
                 *  {
                 *      Debug.Log("[KerbalVR] module: " + mod.name);
                 *  }
                 * }
                 */

                // Submit frames to HMD
                //--------------------------------------------------------------
                vrCompositorError = vrCompositor.Submit(EVREye.Eye_Left, ref hmdLeftEyeTexture, ref hmdTextureBounds, EVRSubmitFlags.Submit_Default);
                if (vrCompositorError != EVRCompositorError.None)
                {
                    Debug.Log("[KerbalVR] Submit (Eye_Left) failed: " + (int)vrCompositorError);
                }


                vrCompositorError = vrCompositor.Submit(EVREye.Eye_Right, ref hmdRightEyeTexture, ref hmdTextureBounds, EVRSubmitFlags.Submit_Default);
                if (vrCompositorError != EVRCompositorError.None)
                {
                    Debug.Log("[KerbalVR] Submit (Eye_Right) failed: " + (int)vrCompositorError);
                }

                // disable highlighting of parts due to mouse
                // TODO: there needs to be a better way to do this. this affects the Part permanently
                Part hoveredPart = Mouse.HoveredPart;
                if (hoveredPart != null)
                {
                    hoveredPart.HighlightActive  = false;
                    hoveredPart.highlightColor.a = 0f;// = new Color(0f, 0f, 0f, 0f);
                    //Debug.Log("[KerbalVR] hovered part: " + hoveredPart.name);
                }


                // DEBUG
                if (Input.GetKeyDown(KeyCode.O))
                {
                    Debug.Log("[KerbalVR] POSITION hmdTransform : " + hmdTransform.pos.x + ", " + hmdTransform.pos.y + ", " + hmdTransform.pos.z);
                    Debug.Log("[KerbalVR] POSITION hmdLTransform : " + hmdLeftEyeTransform.pos.x + ", " + hmdLeftEyeTransform.pos.y + ", " + hmdLeftEyeTransform.pos.z);
                    Debug.Log("[KerbalVR] POSITION hmdRTransform : " + hmdRightEyeTransform.pos.x + ", " + hmdRightEyeTransform.pos.y + ", " + hmdRightEyeTransform.pos.z);
                    Debug.Log("[KerbalVR] POSITION ctrlPoseRight : " + ctrlPoseRight.pos.x + ", " + ctrlPoseRight.pos.y + ", " + ctrlPoseRight.pos.z);

                    Debug.Log("[KerbalVR] POSITION InternalCamera.Instance.transform.abs : " + InternalCamera.Instance.transform.position.x + ", " + InternalCamera.Instance.transform.position.y + ", " + InternalCamera.Instance.transform.position.z);
                    Debug.Log("[KerbalVR] POSITION InternalCamera.Instance.transform.rel : " + InternalCamera.Instance.transform.localPosition.x + ", " + InternalCamera.Instance.transform.localPosition.y + ", " + InternalCamera.Instance.transform.localPosition.z);
                    //Debug.Log("[KerbalVR] POSITION myprop.transform : " + testProp.transform.position.x + ", " + testProp.transform.position.y + ", " + testProp.transform.position.z);

                    uiScreen.layer = (uiScreen.layer == 31) ? 0 : uiScreen.layer + 1;
                    Debug.Log("[KerbalVR] prop layer = " + propLeftHand.gameObject.layer + ", screen obj layer = " + uiScreen.layer);

                    foreach (Camera c in Camera.allCameras)
                    {
                        Debug.Log("[KerbalVR] Camera: " + c.name + ", cullingMask = " + c.cullingMask);
                    }
                }
            }

            // if we are exiting VR, restore the cameras
            if (!hmdIsAllowed && hmdIsAllowed_prev)
            {
                foreach (CameraProperties camStruct in camerasToRender)
                {
                    camStruct.camera.projectionMatrix = camStruct.originalProjMatrix;
                    camStruct.camera.targetTexture    = null;
                    RenderTexture.active = null;
                }
            }

            hmdIsAllowed_prev = hmdIsAllowed;
        }