/* Copyright (c) 2017, NVIDIA CORPORATION. All rights reserved. * * NVIDIA CORPORATION and its licensors retain all intellectual property * and proprietary rights in and to this software, related documentation * and any modifications thereto. Any use, reproduction, disclosure or * distribution of this software and related documentation without an express * license agreement from NVIDIA CORPORATION is strictly prohibited. */ #include "GfeSDKHighlights.h" #include "NVIDIAGfeSDKPrivatePCH.h" #define VALIDATE_MODULE_HIGHLIGHTS() \ if (!GFEHandle && Callback) \ { \ Callback(GfeSDK::NVGSDK_ERR_MODULE_NOT_LOADED, Context); \ return; \ } #define VALIDATE_MODULE_HIGHLIGHTS_SPECIALIZED() \ if (!GFEHandle && Callback) \ { \ Callback(GfeSDK::NVGSDK_ERR_MODULE_NOT_LOADED, nullptr, Context); \ return; \ } struct LocaleStringPair { std::string localeCode; std::string localizedString; }; struct LocaleHighlightsList { std::vector Strings; std::vector Pairs; }; FGfeSDKHighlights::FGfeSDKHighlights(GfeSDK::NVGSDK_HANDLE* Handle) : GFEHandle(Handle) {} FGfeSDKHighlights::~FGfeSDKHighlights() {} void FGfeSDKHighlights::ConfigureAsync(FGfeSDKHighlightConfigParams const& Params, GfeSDK::NVGSDK_EmptyCallback Callback, void* Context) { VALIDATE_MODULE_HIGHLIGHTS(); std::string UTF8DefaultLocale = TCHAR_TO_UTF8(*Params.DefaultLocale); GfeSDK::NVGSDK_HighlightConfigParams cParams; memset(&cParams, 0, sizeof(cParams)); cParams.defaultLocale = UTF8DefaultLocale.c_str(); // Temporary storages for structure elements required by ConfigureAsync function std::vector Highlights(Params.HighlightDefinitions.Num()); // TCHAR_TO_UTF8 shares internal buffer, so its results need to be assigned by copy, not pointer. std::vector id(Params.HighlightDefinitions.Num()); // Workaround for usage of TCHAR_TO_UTF8. std::vector LocaleStringPairs(Params.HighlightDefinitions.Num()); for (int32 i=0; i cGroupViews(Params.GroupViews.Num()); std::vector StringCache(Params.GroupViews.Num()); for (size_t i = 0; i < cGroupViews.size(); i++) { StringCache[i] = TCHAR_TO_UTF8(*Params.GroupViews[i].GroupId); cGroupViews[i].groupId = StringCache[i].c_str(); cGroupViews[i].tagsFilter = TranslateBitfieldEnum(kHighlightTypeUnrealToSdk, Params.GroupViews[i].TagsFilter); cGroupViews[i].significanceFilter = TranslateBitfieldEnum(kHighlightSignificanceUnrealToSdk, Params.GroupViews[i].SignificanceFilter); } cParams.groupSummaryTable = cGroupViews.data(); cParams.groupSummaryTableSize = cGroupViews.size(); GfeSDK::NVGSDK_Highlights_OpenSummaryAsync(GFEHandle, &cParams, Callback, Context); } void FGfeSDKHighlights::GetNumberOfHighlightsAsync(FGfeSDKHighlightGroupView const& GroupView, GfeSDK::NVGSDK_Highlights_GetNumberOfHighlightsCallback Callback, void* Context) { VALIDATE_MODULE_HIGHLIGHTS_SPECIALIZED(); GfeSDK::NVGSDK_GroupView groupView; memset(&groupView, 0, sizeof(groupView)); std::string gID = TCHAR_TO_UTF8(*GroupView.GroupId); groupView.groupId = gID.c_str(); groupView.tagsFilter = TranslateBitfieldEnum(kHighlightTypeUnrealToSdk, GroupView.TagsFilter); groupView.significanceFilter = TranslateBitfieldEnum(kHighlightSignificanceUnrealToSdk, GroupView.SignificanceFilter); GfeSDK::NVGSDK_Highlights_GetNumberOfHighlightsAsync(GFEHandle, &groupView, Callback, Context); } struct SNumHighlightsInfo { volatile bool Ready; int32 NumberOfHighlights; SNumHighlightsInfo(): Ready(false), NumberOfHighlights(0) {} }; void __stdcall OnGetNumberOfHighlightsCallbackBlocking(GfeSDK::NVGSDK_RetCode rt, GfeSDK::NVGSDK_Highlights_NumberOfHighlights const* NumberOfHighlights, void* context) { SNumHighlightsInfo* NCB = static_cast(context); if (NCB) { NCB->NumberOfHighlights = NumberOfHighlights->numberOfHighlights; NCB->Ready = true; } } int32 FGfeSDKHighlights::GetNumberOfHighlights(FGfeSDKHighlightGroupView const& GroupView) { SNumHighlightsInfo NCB; GetNumberOfHighlightsAsync(GroupView, &OnGetNumberOfHighlightsCallbackBlocking, &NCB); int32 IterationCounter = 0; // Polling cycle (not sure if this is correct for UE4, if we need a blocking function) // Wait for 10 seconds and return 0 if time is up while (!NCB.Ready && (IterationCounter < 1000)) { Poll(); FPlatformProcess::Sleep(0.001f); IterationCounter++; } return NCB.NumberOfHighlights; } void FGfeSDKHighlights::Poll() { if (GFEHandle) GfeSDK::NVGSDK_Poll(GFEHandle); }