1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133
|
/*=========================================================================
Program: Visualization Toolkit
Module: vtkOpenXRManagerRemoteConnection.cxx
Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
All rights reserved.
See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
This software is distributed WITHOUT ANY WARRANTY; without even
the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
PURPOSE. See the above copyright notice for more information.
=========================================================================*/
#include "vtkOpenXRManagerRemoteConnection.h"
#include "vtkObjectFactory.h"
#include "vtkOpenXRManager.h"
#include "vtkResourceFileLocator.h"
#include "vtksys/SystemTools.hxx"
#include <openxr_msft_holographic_remoting.h> // Defines XR_MSFT_holographic_remoting
#include "XrConnectionExtensions.h" // Provides holographic remoting extensions
#include <thread> // used to sleep after connection
VTK_ABI_NAMESPACE_BEGIN
vtkStandardNewMacro(vtkOpenXRManagerRemoteConnection);
//------------------------------------------------------------------------------
bool vtkOpenXRManagerRemoteConnection::Initialize()
{
// Get the path for the current executable
std::string exePath = vtkResourceFileLocator::GetLibraryPathForSymbolWin32(nullptr);
std::string exeDir = vtksys::SystemTools::GetFilenamePath(exePath);
// Look for the RemotingXR.json file provided by the microsoft.holographic.remoting.openxr
// package, in the system PATH and next to the executable.
// If found, set the XR_RUNTIME_JSON environment variable. It will be used by the OpenXR loader
// to not use the system default OpenXR runtime but instead redirect to the Holographic Remoting
// OpenXR runtime.
std::string remotingXRPath = vtksys::SystemTools::FindFile("RemotingXR.json", { exeDir });
if (!remotingXRPath.empty() && vtksys::SystemTools::PutEnv("XR_RUNTIME_JSON=" + remotingXRPath))
{
return true;
}
return false;
}
//------------------------------------------------------------------------------
bool vtkOpenXRManagerRemoteConnection::ConnectToRemote(XrInstance instance, XrSystemId id)
{
if (this->IPAddress.empty())
{
vtkErrorMacro("Remoting IP address unspecified.");
return false;
}
XrRemotingConnectionStateMSFT connectionState;
xr::ConnectionExtensionDispatchTable extensions;
extensions.PopulateDispatchTable(instance);
extensions.xrRemotingGetConnectionStateMSFT(instance, id, &connectionState, nullptr);
if (connectionState != XR_REMOTING_CONNECTION_STATE_DISCONNECTED_MSFT)
{
vtkErrorMacro("Error connecting to " << this->IPAddress << ": " << connectionState);
return false;
}
// Apply remote context properties while disconnected.
{
XrRemotingRemoteContextPropertiesMSFT contextProperties;
contextProperties = XrRemotingRemoteContextPropertiesMSFT{ static_cast<XrStructureType>(
XR_TYPE_REMOTING_REMOTE_CONTEXT_PROPERTIES_MSFT) };
contextProperties.enableAudio = false;
contextProperties.maxBitrateKbps = 20000;
contextProperties.videoCodec = XR_REMOTING_VIDEO_CODEC_ANY_MSFT;
contextProperties.depthBufferStreamResolution =
XR_REMOTING_DEPTH_BUFFER_STREAM_RESOLUTION_HALF_MSFT;
extensions.xrRemotingSetContextPropertiesMSFT(instance, id, &contextProperties);
}
XrRemotingConnectInfoMSFT connectInfo{ static_cast<XrStructureType>(
XR_TYPE_REMOTING_CONNECT_INFO_MSFT) };
connectInfo.remoteHostName = this->IPAddress.c_str();
connectInfo.remotePort = 8265;
connectInfo.secureConnection = false;
if (!vtkOpenXRManager::GetInstance().XrCheckError(
extensions.xrRemotingConnectMSFT(instance, id, &connectInfo), "Failed to connect"))
{
return false;
}
// Make sure the connection is established before the event loop gets started
using namespace std::chrono_literals;
std::this_thread::sleep_for(2500ms);
return true;
}
//------------------------------------------------------------------------------
const char* vtkOpenXRManagerRemoteConnection::GetExtensionName()
{
return XR_MSFT_HOLOGRAPHIC_REMOTING_EXTENSION_NAME;
}
//------------------------------------------------------------------------------
bool vtkOpenXRManagerRemoteConnection::HandleXrEvent(const XrEventDataBuffer& eventData)
{
switch ((XrRemotingStructureType)eventData.type)
{
case XR_TYPE_REMOTING_EVENT_DATA_CONNECTED_MSFT:
{
vtkDebugMacro("Holographic Remoting: Connected.");
return true;
}
case XR_TYPE_REMOTING_EVENT_DATA_DISCONNECTED_MSFT:
{
vtkDebugMacro("Holographic Remoting: Disconnected.");
return true;
}
default:
{
break;
}
}
return false;
}
VTK_ABI_NAMESPACE_END
|