mirror of
https://github.com/xiaopeng12138/MaiDXR.git
synced 2024-12-19 04:15:53 +01:00
189 lines
5.1 KiB
C#
189 lines
5.1 KiB
C#
/*
|
|
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
* All rights reserved.
|
|
*
|
|
* Licensed under the Oculus SDK License Agreement (the "License");
|
|
* you may not use the Oculus SDK except in compliance with the License,
|
|
* which is provided at the time of installation or download, or which
|
|
* otherwise accompanies this software in either electronic or hard copy form.
|
|
*
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* https://developer.oculus.com/licenses/oculussdk/
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, the Oculus SDK
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
using System.Collections;
|
|
using System.Collections.Generic;
|
|
using UnityEngine;
|
|
|
|
public class OVRHeadsetEmulator : MonoBehaviour {
|
|
public enum OpMode
|
|
{
|
|
Off,
|
|
EditorOnly,
|
|
AlwaysOn
|
|
}
|
|
|
|
public OpMode opMode = OpMode.EditorOnly;
|
|
public bool resetHmdPoseOnRelease = true;
|
|
public bool resetHmdPoseByMiddleMouseButton = true;
|
|
|
|
public KeyCode[] activateKeys = new KeyCode[] { KeyCode.LeftControl, KeyCode.RightControl };
|
|
|
|
public KeyCode[] pitchKeys = new KeyCode[] { KeyCode.LeftAlt, KeyCode.RightAlt };
|
|
|
|
OVRManager manager;
|
|
|
|
const float MOUSE_SCALE_X = -2.0f;
|
|
const float MOUSE_SCALE_X_PITCH = -2.0f;
|
|
const float MOUSE_SCALE_Y = 2.0f;
|
|
const float MOUSE_SCALE_HEIGHT = 1.0f;
|
|
const float MAX_ROLL = 85.0f;
|
|
|
|
private bool lastFrameEmulationActivated = false;
|
|
|
|
private Vector3 recordedHeadPoseRelativeOffsetTranslation;
|
|
private Vector3 recordedHeadPoseRelativeOffsetRotation;
|
|
|
|
private bool hasSentEvent = false;
|
|
private bool emulatorHasInitialized = false;
|
|
|
|
private CursorLockMode previousCursorLockMode = CursorLockMode.None;
|
|
|
|
// Use this for initialization
|
|
void Start () {
|
|
}
|
|
|
|
// Update is called once per frame
|
|
void Update () {
|
|
//todo: enable for Unity Input System
|
|
#if ENABLE_LEGACY_INPUT_MANAGER
|
|
if (!emulatorHasInitialized)
|
|
{
|
|
if (OVRManager.OVRManagerinitialized)
|
|
{
|
|
previousCursorLockMode = Cursor.lockState;
|
|
manager = OVRManager.instance;
|
|
recordedHeadPoseRelativeOffsetTranslation = manager.headPoseRelativeOffsetTranslation;
|
|
recordedHeadPoseRelativeOffsetRotation = manager.headPoseRelativeOffsetRotation;
|
|
emulatorHasInitialized = true;
|
|
lastFrameEmulationActivated = false;
|
|
}
|
|
else
|
|
return;
|
|
}
|
|
bool emulationActivated = IsEmulationActivated();
|
|
if (emulationActivated)
|
|
{
|
|
if (!lastFrameEmulationActivated)
|
|
{
|
|
previousCursorLockMode = Cursor.lockState;
|
|
Cursor.lockState = CursorLockMode.Locked;
|
|
}
|
|
|
|
if (!lastFrameEmulationActivated && resetHmdPoseOnRelease)
|
|
{
|
|
manager.headPoseRelativeOffsetTranslation = recordedHeadPoseRelativeOffsetTranslation;
|
|
manager.headPoseRelativeOffsetRotation = recordedHeadPoseRelativeOffsetRotation;
|
|
}
|
|
|
|
if (resetHmdPoseByMiddleMouseButton && Input.GetMouseButton(2))
|
|
{
|
|
manager.headPoseRelativeOffsetTranslation = Vector3.zero;
|
|
manager.headPoseRelativeOffsetRotation = Vector3.zero;
|
|
}
|
|
else
|
|
{
|
|
Vector3 emulatedTranslation = manager.headPoseRelativeOffsetTranslation;
|
|
float deltaMouseScrollWheel = Input.GetAxis("Mouse ScrollWheel");
|
|
float emulatedHeight = deltaMouseScrollWheel * MOUSE_SCALE_HEIGHT;
|
|
emulatedTranslation.y += emulatedHeight;
|
|
manager.headPoseRelativeOffsetTranslation = emulatedTranslation;
|
|
|
|
float deltaX = Input.GetAxis("Mouse X");
|
|
float deltaY = Input.GetAxis("Mouse Y");
|
|
|
|
Vector3 emulatedAngles = manager.headPoseRelativeOffsetRotation;
|
|
float emulatedRoll = emulatedAngles.x;
|
|
float emulatedYaw = emulatedAngles.y;
|
|
float emulatedPitch = emulatedAngles.z;
|
|
if (IsTweakingPitch())
|
|
{
|
|
emulatedPitch += deltaX * MOUSE_SCALE_X_PITCH;
|
|
}
|
|
else
|
|
{
|
|
emulatedRoll += deltaY * MOUSE_SCALE_Y;
|
|
emulatedYaw += deltaX * MOUSE_SCALE_X;
|
|
}
|
|
|
|
manager.headPoseRelativeOffsetRotation = new Vector3(emulatedRoll, emulatedYaw, emulatedPitch);
|
|
}
|
|
|
|
if (!hasSentEvent)
|
|
{
|
|
OVRPlugin.SendEvent("headset_emulator", "activated");
|
|
hasSentEvent = true;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (lastFrameEmulationActivated)
|
|
{
|
|
Cursor.lockState = previousCursorLockMode;
|
|
|
|
recordedHeadPoseRelativeOffsetTranslation = manager.headPoseRelativeOffsetTranslation;
|
|
recordedHeadPoseRelativeOffsetRotation = manager.headPoseRelativeOffsetRotation;
|
|
|
|
if (resetHmdPoseOnRelease)
|
|
{
|
|
manager.headPoseRelativeOffsetTranslation = Vector3.zero;
|
|
manager.headPoseRelativeOffsetRotation = Vector3.zero;
|
|
}
|
|
}
|
|
}
|
|
lastFrameEmulationActivated = emulationActivated;
|
|
#endif
|
|
}
|
|
|
|
bool IsEmulationActivated()
|
|
{
|
|
if (opMode == OpMode.Off)
|
|
{
|
|
return false;
|
|
}
|
|
else if (opMode == OpMode.EditorOnly && !Application.isEditor)
|
|
{
|
|
return false;
|
|
}
|
|
|
|
foreach (KeyCode key in activateKeys)
|
|
{
|
|
if (Input.GetKey(key))
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
bool IsTweakingPitch()
|
|
{
|
|
if (!IsEmulationActivated())
|
|
return false;
|
|
|
|
foreach (KeyCode key in pitchKeys)
|
|
{
|
|
if (Input.GetKey(key))
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
}
|