/** * This is more of a temporary workaround to an issue with getting the render target * size from the RenderManager. On the game thread, we can't get the render target sizes * unless we have already initialized the render manager, which we can only do on the render * thread. In the future, we'll move those RenderManager APIs to OSVR-Core so we can call * them from any thread with access to the client context. */ static void GetRenderTargetSize_GameThread(float windowWidth, float windowHeight, float &width, float &height) { auto clientContext = IOSVR::Get().GetEntryPoint()->GetClientContext(); size_t length; osvrClientGetStringParameterLength(clientContext, "/renderManagerConfig", &length); if (length > 0) { char* renderManagerConfigStr = new char[length]; osvrClientGetStringParameter(clientContext, "/renderManagerConfig", renderManagerConfigStr, length); auto reader = TJsonReaderFactory<>::Create(renderManagerConfigStr); TSharedPtr<FJsonObject> jsonObject; if (FJsonSerializer::Deserialize(reader, jsonObject)) { auto subObj = jsonObject->GetObjectField("renderManagerConfig"); double renderOverfillFactor = subObj->GetNumberField("renderOverfillFactor"); double renderOversampleFactor = subObj->GetNumberField("renderOversampleFactor"); width = windowWidth * renderOverfillFactor * renderOversampleFactor; height = windowHeight * renderOverfillFactor * renderOversampleFactor; } delete[] renderManagerConfigStr; } else { width = windowWidth; height = windowHeight; } }
bool OSVRHMDDescription::Init(OSVR_ClientContext OSVRClientContext) { Valid = false; static const char* Path = "/display"; #if OSVR_ENABLED size_t Length; if (osvrClientGetStringParameterLength(OSVRClientContext, Path, &Length) == OSVR_RETURN_FAILURE) return false; FMemMark MemStackMark(FMemStack::Get()); char* Buffer = new (FMemStack::Get()) char[Length]; if (osvrClientGetStringParameter(OSVRClientContext, Path, Buffer, Length) == OSVR_RETURN_FAILURE) return false; Valid = GetData(Data).InitFromJSON(Buffer); #endif // OSVR_ENABLED return Valid; }