Ejemplo n.º 1
0
    public void UpdatePoses(WVR_PoseOriginModel origin, bool isSimulator)
    {
        if (!this.Initialized)
        {
            return;
        }

        Log.gpl.d(LOG_TAG, "UpdatePoses");

#if UNITY_EDITOR
        if (Application.isEditor)
        {
            if (isSimulator)
            {
                WaveVR_Utils.WVR_GetSyncPose_S((int)origin, poses, poses.Length);
            }
        }
        else
#endif
        {
            bool _focusCapturedBySystem = Interop.WVR_IsInputFocusCapturedBySystem();
            if (this.FocusCapturedBySystem != _focusCapturedBySystem)
            {
                this.FocusCapturedBySystem = _focusCapturedBySystem;
                WaveVR_Utils.Event.Send(WaveVR_Utils.Event.SYSTEMFOCUS_CHANGED, this.FocusCapturedBySystem);

                // When getting system focus again, reset button events.
                if (!this.FocusCapturedBySystem)
                {
                    Log.i(LOG_TAG, "UpdatePoses() get system focus, reset button events.");
                    ResetButtonEvents();
                }
                else
                {
                    Log.i(LOG_TAG, "UpdatePoses() lost system focus.");
                }
            }
            Interop.WVR_GetSyncPose(origin, poses, (uint)poses.Length);
        }

        for (uint i = 0; i < DeviceTypes.Length; i++)
        {
            bool _hasType = false;

            for (uint j = 0; j < poses.Length; j++)
            {
                WVR_DevicePosePair_t _pose = poses[j];

                if (_pose.type == DeviceTypes [i])
                {
                    _hasType          = true;
                    deviceIndexMap[i] = j;

                    if (connected [i] != _pose.pose.IsValidPose)
                    {
                        connected [i] = _pose.pose.IsValidPose;
                        Log.i(LOG_TAG, "device " + DeviceTypes [i] + " is " + (connected [i] ? "connected" : "disconnected"));
                        WaveVR_Utils.Event.Send(WaveVR_Utils.Event.DEVICE_CONNECTED, DeviceTypes [i], connected[i]);
                    }

                    if (connected [i])
                    {
                        rtPoses[j].update(_pose.pose.PoseMatrix);
                    }

                    break;
                }
            }

            // no such type
            if (!_hasType)
            {
                if (connected [i] == true)
                {
                    connected [i] = false;
                    Log.i(LOG_TAG, "device " + DeviceTypes [i] + " is disconnected.");
                    WaveVR_Utils.Event.Send(WaveVR_Utils.Event.DEVICE_CONNECTED, DeviceTypes [i], connected[i]);
                }
            }
        }

        for (int i = 0; i < poses.Length; i++)
        {
            WVR_DeviceType _type      = poses [i].type;
            bool           _connected = false;
#if UNITY_EDITOR
            if (isSimulator)
            {
                _connected = WaveVR_Utils.WVR_IsDeviceConnected_S((int)_type);
            }
            else
#endif
            {
                _connected = Interop.WVR_IsDeviceConnected(_type);
            }

            bool _posevalid = poses [i].pose.IsValidPose;

            Log.gpl.d(LOG_TAG, "Device " + _type + " is " + (_connected ? "connected" : "disconnected")
                      + ", pose is " + (_posevalid ? "valid" : "invalid")
                      + ", pos: {" + rtPoses [i].pos.x + ", " + rtPoses [i].pos.y + ", " + rtPoses [i].pos.z + "}"
                      + ", rot: {" + rtPoses [i].rot.x + ", " + rtPoses [i].rot.y + ", " + rtPoses [i].rot.z + ", " + rtPoses [i].rot.w + "}");
        }

        try
        {
            WaveVR_Utils.Event.Send(WaveVR_Utils.Event.NEW_POSES, poses, rtPoses);
        }
        catch (Exception ex)
        {
            Log.e(LOG_TAG, "Send NEW_POSES Event Exception : " + ex);
        }
        Log.gpl.d(LOG_TAG, "after new poses");
        try
        {
            WaveVR_Utils.Event.Send(WaveVR_Utils.Event.AFTER_NEW_POSES);
        }
        catch (Exception ex)
        {
            Log.e(LOG_TAG, "Send AFTER_NEW_POSES Event Exception : " + ex);
        }
    }
Ejemplo n.º 2
0
        public void OnNewPoses(params object[] args)
        {
            if (WaveVR.Instance == null)
            {
                return;
            }

            var poses   = (WVR_DevicePosePair_t[])args[0];
            var posesRT = (WaveVR_Utils.RigidTransform[])args[1];

            FlushDeviceState();

            for (int i = 0, imax = poses.Length; i < imax; ++i)
            {
                uint deviceIndex;
                var  deviceType = poses[i].type;
                if (!TryGetAndTouchDeviceIndexByType(deviceType, out deviceIndex))
                {
                    continue;
                }

                IVRModuleDeviceState   prevState;
                IVRModuleDeviceStateRW currState;
                EnsureValidDeviceState(deviceIndex, out prevState, out currState);

#if VIU_WAVEVR_2_1_0_OR_NEWER && UNITY_EDITOR
                var deviceConnected = WaveVR.Instance.isSimulatorOn && WaveVR_Utils.WVR_IsDeviceConnected_S((int)deviceType);
#else
                var deviceConnected = Interop.WVR_IsDeviceConnected(deviceType);
#endif

                if (!deviceConnected)
                {
                    if (prevState.isConnected)
                    {
                        currState.Reset();

                        switch (deviceType)
                        {
                        case WVR_DeviceType.WVR_DeviceType_HMD: m_headState = null; break;

                        case WVR_DeviceType.WVR_DeviceType_Controller_Right: m_rightState = null; break;

                        case WVR_DeviceType.WVR_DeviceType_Controller_Left: m_leftState = null; break;
                        }
                    }
                }
                else
                {
                    if (!prevState.isConnected)
                    {
                        currState.isConnected     = true;
                        currState.deviceClass     = s_type2class[(int)deviceType];
                        currState.deviceModel     = s_type2model[(int)deviceType];
                        currState.serialNumber    = deviceType.ToString();
                        currState.modelNumber     = deviceType.ToString();
                        currState.renderModelName = deviceType.ToString();

                        switch (deviceType)
                        {
                        case WVR_DeviceType.WVR_DeviceType_HMD: m_headState = currState; break;

                        case WVR_DeviceType.WVR_DeviceType_Controller_Right: m_rightState = currState; break;

                        case WVR_DeviceType.WVR_DeviceType_Controller_Left: m_leftState = currState; break;
                        }
                    }

                    // update pose
                    var devicePose = poses[i].pose;
                    currState.velocity        = new Vector3(devicePose.Velocity.v0, devicePose.Velocity.v1, -devicePose.Velocity.v2);
                    currState.angularVelocity = new Vector3(-devicePose.AngularVelocity.v0, -devicePose.AngularVelocity.v1, devicePose.AngularVelocity.v2);

                    var rigidTransform = posesRT[i];
                    currState.position = rigidTransform.pos;
                    currState.rotation = rigidTransform.rot;

                    currState.isPoseValid = devicePose.IsValidPose;
                }
            }

            if (m_rightState != null)
            {
                ApplyVirtualArmAndSimulateInput(m_rightState, m_headState, RIGHT_ARM_MULTIPLIER);
            }

            if (m_leftState != null)
            {
                ApplyVirtualArmAndSimulateInput(m_leftState, m_headState, LEFT_ARM_MULTIPLIER);
            }

            ResetAndDisconnectUntouchedDevices();

            ProcessConnectedDeviceChanged();
            ProcessDevicePoseChanged();
        }