protected void OnDestroy() { if (m_PhysicsBody != null) { if (MVRNodesMapper.HasInstance()) { var nodesMapper = MVRNodesMapper.Instance; nodesMapper.RemoveMapping(gameObject); } if (MiddleVR.VRPhysicsMgr != null) { vrPhysicsEngine physicsEngine = MiddleVR.VRPhysicsMgr.GetPhysicsEngine(); if (physicsEngine != null) { physicsEngine.DestroyBody(m_PhysicsBodyName); } } m_PhysicsBody.Dispose(); m_PhysicsBody = null; } m_PhysicsBodyName = ""; if (m_MVREventListener != null) { m_MVREventListener.Dispose(); } }
void OnApplicationQuit() { MVRNodesCreator.DestroyInstance(); MVRNodesMapper.DestroyInstance(); MVRTools.VRDestroy(Application.isEditor); }
protected void Awake() { MVRNodesMapper.CreateInstance(); MVRNodesCreator.CreateInstance(); InitializeVR(); }
protected void Awake() { // Attempt to collect objects from previous level System.GC.Collect(); System.GC.WaitForPendingFinalizers(); // Second call to work around a possible mono bug (see https://bugzilla.xamarin.com/show_bug.cgi?id=20503 ) System.GC.WaitForPendingFinalizers(); MVRNodesMapper.CreateInstance(); MVRNodesCreator.CreateInstance(); InitializeVR(); }
public void SetSyncDirection(MVRNodesMapper.ENodesSyncDirection iSyncDirection) { MVRNodesMapper nodesMapper = MVRNodesMapper.Instance; if (nodesMapper != null && m_Node != null) { if (m_SyncDirection != MVRNodesMapper.ENodesSyncDirection.NoSynchronization) { nodesMapper.RemoveMapping(gameObject, false); } if (iSyncDirection != MVRNodesMapper.ENodesSyncDirection.NoSynchronization) { nodesMapper.AddMapping(gameObject, m_Node, iSyncDirection); } } m_SyncDirection = iSyncDirection; }
private void _SetSyncDirection(MVRNodesMapper.ENodesSyncDirection iSyncDirection) { m_SyncDirIsSet = true; m_SyncDirection = iSyncDirection; var nodesMapper = MVRNodesMapper.Instance; if (iSyncDirection != MVRNodesMapper.ENodesSyncDirection.NoSynchronization) { // Set new MiddleVR - Unity nodes mapping if needed m_MiddleVRNode = nodesMapper.AddMapping(this.gameObject, MiddleVRNodeName, iSyncDirection); } else if(m_MiddleVRNode != null) { // No synchronization and existing mvrNode: stop node synchronization nodesMapper.RemoveMapping(m_MiddleVRNode.GetName()); m_MiddleVRNode = null; } }
public vrNode3D InitNode() { // Check for grabbed nodes MVRNodesMapper nodesMapper = MVRNodesMapper.Instance; if (nodesMapper != null) { vrNode3D node = nodesMapper.GetNode(gameObject); if (node != null) { m_Node = node; m_NodeName = m_Node.GetName(); m_SyncDirection = MVRNodesMapper.ENodesSyncDirection.MiddleVRToUnity; m_IsNodeGrabbed = true; return(m_Node); } } return(CreateNode(m_NodeName, MVRNodesMapper.ENodesSyncDirection.MiddleVRToUnity)); }
protected void OnApplicationQuit() { MVRNodesCreator.DestroyInstance(); MVRNodesMapper.DestroyInstance(); MiddleVR.DisposeObject(ref m_shareRandomStateCommand); MiddleVR.DisposeObject(ref m_startParticlesCommand); MVRTools.VRDestroy(Application.isEditor); // Unity 5.6 players crash on exit when any "-force-*" parameter is on the command line. // When launching from middlevr configuration, one of these parameters is always set, // so we kill the process as a workaround. // The environment variable MIDDLEVR_FORCE_KILL_PLAYER can be set to "false" (case insensitive) // to disable this behaviour. #if UNITY_5_6_OR_NEWER && !UNITY_EDITOR string[] crashingArguments = new string[] { "-force-d3d11", "-force-d3d9", "-force-opengl" }; bool commandLineHasCrashingArgument = Environment.GetCommandLineArgs().Any( commandLineArg => crashingArguments.Any( crashingArg => String.Equals(commandLineArg, crashingArg, StringComparison.OrdinalIgnoreCase))); if (commandLineHasCrashingArgument) { bool forceKill = true; string forceKillEnvVar = Environment.GetEnvironmentVariable("MIDDLEVR_FORCE_KILL_PLAYER"); if (forceKillEnvVar != null) { Boolean.TryParse(forceKillEnvVar, out forceKill); } if (forceKill) { System.Diagnostics.Process.GetCurrentProcess().Kill(); } } #endif }
private bool _OnNodeEvent(vrEvent iEvent) { if (!m_IsNodeGrabbed) { vrObjectEvent objectEvent = vrObjectEvent.Cast(iEvent); if (objectEvent != null && objectEvent.GetEventType() == (int)VRObjectEventEnum.VRObjectEvent_Destroy) { MVRNodesMapper nodesMapper = MVRNodesMapper.Instance; if (nodesMapper != null && m_SyncDirection != MVRNodesMapper.ENodesSyncDirection.NoSynchronization) { nodesMapper.RemoveMapping(gameObject, false); } SetSyncDirection(MVRNodesMapper.ENodesSyncDirection.NoSynchronization); m_Node = null; // Destroys the object later this frame, before rendering UnityEngine.Object.Destroy(gameObject); } } return(true); }
// Update is called once per frame void Update() { //MVRTools.Log("VRManagerUpdate"); // Initialize interactions if (!m_InteractionsInitialized) { _SetNavigation(Navigation); _SetManipulation(Manipulation); _SetVirtualHandMapping(VirtualHandMapping); m_InteractionsInitialized = true; } MVRNodesMapper nodesMapper = MVRNodesMapper.Instance; nodesMapper.UpdateNodesUnityToMiddleVR(); if (m_isInit) { MVRTools.Log(4, "[>] Unity Update - Start"); if (m_Kernel.GetFrame() >= m_FirstFrameAfterReset + 1 && !m_isGeometrySet && !Application.isEditor) { if (!DontChangeWindowGeometry) { m_DisplayMgr.SetUnityWindowGeometry(); } m_isGeometrySet = true; } if (m_Kernel.GetFrame() == 0) { // Set the random seed in kernel for dispatching only during start-up. // With clustering, a client will be set by a call to kernel.Update(). if (!m_ClusterMgr.IsCluster() || (m_ClusterMgr.IsCluster() && m_ClusterMgr.IsServer())) { // The cast is safe because the seed is always positive. uint seed = (uint)UnityEngine.Random.seed; m_Kernel._SetRandomSeed(seed); } } m_Kernel.Update(); if (m_Kernel.GetFrame() == 0) { // Set the random seed in a client only during start-up. if (m_ClusterMgr.IsCluster() && m_ClusterMgr.IsClient()) { // The cast is safe because the seed comes from // a previous value of Unity. int seed = (int)m_Kernel.GetRandomSeed(); UnityEngine.Random.seed = seed; } } UpdateInput(); if (ShowFPS) { this.GetComponent <GUIText>().text = m_Kernel.GetFPS().ToString("f2"); } nodesMapper.UpdateNodesMiddleVRToUnity(false); MVRTools.UpdateCameraProperties(); if (m_displayLog) { string txt = m_Kernel.GetLogString(true); print(txt); m_GUI.text = txt; } vrKeyboard keyb = m_DeviceMgr.GetKeyboard(); if (keyb != null) { if (keyb.IsKeyPressed(MiddleVR.VRK_LSHIFT) || keyb.IsKeyPressed(MiddleVR.VRK_RSHIFT)) { if (keyb.IsKeyToggled(MiddleVR.VRK_D)) { ShowFPS = !ShowFPS; } if (keyb.IsKeyToggled(MiddleVR.VRK_W) || keyb.IsKeyToggled(MiddleVR.VRK_Z)) { ShowWand = !ShowWand; ShowWandGeometry(ShowWand); } // Toggle Fly mode on interactions if (keyb.IsKeyToggled(MiddleVR.VRK_F)) { Fly = !Fly; } // Navigation mode switch if (keyb.IsKeyToggled(MiddleVR.VRK_N)) { vrInteraction navigation = _GetNextInteraction("ContinuousNavigation"); if (navigation != null) { MiddleVR.VRInteractionMgr.Activate(navigation); } } } } DeltaTime = m_Kernel.GetDeltaTime(); MVRTools.Log(4, "[<] Unity Update - End"); } else { //Debug.LogWarning("[ ] If you have an error mentioning 'DLLNotFoundException: MiddleVR_CSharp', please restart Unity. If this does not fix the problem, please make sure MiddleVR is in the PATH environment variable."); } // If QualityLevel changed, we have to reset the Unity Manager if (m_NeedDelayedRenderingReset) { if (m_RenderingResetDelay == 0) { MVRTools.Log(3, "[ ] Graphic quality forced, reset Unity Manager."); MVRTools.VRReset(); MVRTools.CreateViewportsAndCameras(DontChangeWindowGeometry, m_AllowRenderTargetAA); m_isGeometrySet = false; m_NeedDelayedRenderingReset = false; } else { --m_RenderingResetDelay; } } }
// Update is called once per frame protected void Update() { // Initialize interactions if (!m_InteractionsInitialized) { _SetNavigation(Navigation); _SetManipulation(Manipulation); _SetVirtualHandMapping(VirtualHandMapping); m_InteractionsInitialized = true; } MVRNodesMapper nodesMapper = MVRNodesMapper.Instance; nodesMapper.UpdateNodesUnityToMiddleVR(); if (m_isInit) { MVRTools.Log(4, "[>] Unity Update - Start"); if (m_Kernel.GetFrame() >= m_FirstFrameAfterReset + 1 && !m_isGeometrySet && !Application.isEditor) { if (!DontChangeWindowGeometry) { m_DisplayMgr.SetUnityWindowGeometry(); } m_isGeometrySet = true; } // Set the random seed in kernel for dispatching only during start-up. if (m_Kernel.GetFrame() == 0) { // Disable obsolescence warning for Random.seed as we only use it to initalize // the MiddleVR random seed. // Using Random.seed was deprecated because it is a single integer and does not // contain the full state of the random number generator and thus could not be // used for restoring or synchronizing the state. #pragma warning disable 618 // The cast is safe because the seed is always positive. m_Kernel._SetRandomSeed((uint)UnityEngine.Random.seed); #pragma warning restore 618 // With clustering, a client will be set by a call to kernel.Update(). if (m_ClusterMgr.IsCluster()) { if (m_shareRandomStateCommand == null) { m_shareRandomStateCommand = new vrCommand("MVR_ShareRandomState", (vrValue val) => { UnityEngine.Random.state = JsonUtility.FromJson <UnityEngine.Random.State>(val.GetString()); return(new vrValue()); }); } if (m_ClusterMgr.IsServer()) { m_shareRandomStateCommand.Do(new vrValue(JsonUtility.ToJson(UnityEngine.Random.state))); } } } m_Kernel.Update(); UpdateInput(); if (ShowFPS) { m_FPSText.text = m_Kernel.GetFPS().ToString("f2"); } nodesMapper.UpdateNodesMiddleVRToUnity(false); MVRTools.UpdateCameraProperties(m_Kernel, m_DisplayMgr, nodesMapper); vrKeyboard keyb = m_DeviceMgr.GetKeyboard(); if (keyb != null) { if (keyb.IsKeyPressed(MiddleVR.VRK_LSHIFT) || keyb.IsKeyPressed(MiddleVR.VRK_RSHIFT)) { if (keyb.IsKeyToggled(MiddleVR.VRK_D)) { ShowFPS = !ShowFPS; } if (keyb.IsKeyToggled(MiddleVR.VRK_W) || keyb.IsKeyToggled(MiddleVR.VRK_Z)) { ShowWand = !ShowWand; ShowWandGeometry(ShowWand); } // Toggle Fly mode on interactions if (keyb.IsKeyToggled(MiddleVR.VRK_F)) { Fly = !Fly; } // Navigation mode switch if (keyb.IsKeyToggled(MiddleVR.VRK_N)) { vrInteraction navigation = _GetNextInteraction("ContinuousNavigation"); if (navigation != null) { MiddleVR.VRInteractionMgr.Activate(navigation); } } } } DeltaTime = m_Kernel.GetDeltaTime(); MVRTools.Log(4, "[<] Unity Update - End"); } else { //Debug.LogWarning("[ ] If you have an error mentioning 'DLLNotFoundException: MiddleVR_CSharp', please restart Unity. If this does not fix the problem, please make sure MiddleVR is in the PATH environment variable."); } }
private void _SetNode(vrNode3D iNode3D, MVRNodesMapper.ENodesSyncDirection iInitialSyncDirection, MVRNodesMapper.ENodesSyncDirection iSyncDirection) { // Check if iNode3D and m_Node3D are the same if (m_Node == iNode3D || (m_Node != null && iNode3D != null && m_Node.GetId() == iNode3D.GetId())) { // Same node, return. return; } MVRNodesMapper nodesMapper = MVRNodesMapper.Instance; // Cleanup old node if (m_Node != null && !m_IsNodeGrabbed) { if (m_EventListener != null) { m_Node.RemoveEventListener(m_EventListener); } if (m_SyncDirection != MVRNodesMapper.ENodesSyncDirection.NoSynchronization) { nodesMapper.RemoveMapping(gameObject, true); } } m_IsNodeGrabbed = false; m_Node = iNode3D; // Setup new node if (m_Node != null) { // First mapping will copy the object's transform if (iInitialSyncDirection != MVRNodesMapper.ENodesSyncDirection.NoSynchronization) { nodesMapper.AddMapping(gameObject, m_Node, iInitialSyncDirection); } if (iInitialSyncDirection != iSyncDirection) { if (iInitialSyncDirection != MVRNodesMapper.ENodesSyncDirection.NoSynchronization) { nodesMapper.RemoveMapping(gameObject, false); } if (iSyncDirection != MVRNodesMapper.ENodesSyncDirection.NoSynchronization) { nodesMapper.AddMapping(gameObject, m_Node, iSyncDirection); } } m_NodeName = m_Node.GetName(); m_SyncDirection = iSyncDirection; if (m_EventListener == null) { m_EventListener = new vrEventListener(_OnNodeEvent); } m_Node.AddEventListener(m_EventListener); } else { m_NodeName = ""; } }
private void _SetSyncDirection(MVRNodesMapper.ENodesSyncDirection iSyncDirection) { MVRNodesMapper nodesMapper = MVRNodesMapper.Instance; if (m_Node3D != null) { if (m_SyncDirection != MVRNodesMapper.ENodesSyncDirection.NoSynchronization) { nodesMapper.RemoveMapping(gameObject, false); } if (iSyncDirection != MVRNodesMapper.ENodesSyncDirection.NoSynchronization) { nodesMapper.AddMapping(gameObject, m_Node3D, iSyncDirection); } } m_SyncDirection = iSyncDirection; }