From c4f5a0aff93e05b3c01de0dbdc7c05e5d9530eda Mon Sep 17 00:00:00 2001 From: Igor Govorov Date: Wed, 11 Apr 2018 18:28:51 +0300 Subject: Push GeForceExperience SDK 1.1.201 --- samples/DX_APIUsage/DX_APIUsage.vcxproj | 8 +- samples/DX_APIUsage/DX_APIUsage.vcxproj.filters | 18 +- samples/DX_APIUsage/GfeSDKHighlights.c | 482 ------------------------ samples/DX_APIUsage/GfeSDKHighlights.cpp | 383 ------------------- samples/DX_APIUsage/GfeSDKHighlights.h | 43 --- samples/DX_APIUsage/GfeSDKHighlights.hpp | 61 --- samples/DX_APIUsage/GfeSDKWrapper.c | 482 ++++++++++++++++++++++++ samples/DX_APIUsage/GfeSDKWrapper.cpp | 383 +++++++++++++++++++ samples/DX_APIUsage/GfeSDKWrapper.h | 44 +++ samples/DX_APIUsage/GfeSDKWrapper.hpp | 61 +++ samples/DX_APIUsage/Main.cpp | 159 +++++++- 11 files changed, 1129 insertions(+), 995 deletions(-) delete mode 100644 samples/DX_APIUsage/GfeSDKHighlights.c delete mode 100644 samples/DX_APIUsage/GfeSDKHighlights.cpp delete mode 100644 samples/DX_APIUsage/GfeSDKHighlights.h delete mode 100644 samples/DX_APIUsage/GfeSDKHighlights.hpp create mode 100644 samples/DX_APIUsage/GfeSDKWrapper.c create mode 100644 samples/DX_APIUsage/GfeSDKWrapper.cpp create mode 100644 samples/DX_APIUsage/GfeSDKWrapper.h create mode 100644 samples/DX_APIUsage/GfeSDKWrapper.hpp (limited to 'samples/DX_APIUsage') diff --git a/samples/DX_APIUsage/DX_APIUsage.vcxproj b/samples/DX_APIUsage/DX_APIUsage.vcxproj index cc01078..c14a4de 100644 --- a/samples/DX_APIUsage/DX_APIUsage.vcxproj +++ b/samples/DX_APIUsage/DX_APIUsage.vcxproj @@ -49,7 +49,7 @@ - + true true false @@ -59,7 +59,7 @@ true true - + true true true @@ -88,8 +88,8 @@ - - + + diff --git a/samples/DX_APIUsage/DX_APIUsage.vcxproj.filters b/samples/DX_APIUsage/DX_APIUsage.vcxproj.filters index 852441a..41a4832 100644 --- a/samples/DX_APIUsage/DX_APIUsage.vcxproj.filters +++ b/samples/DX_APIUsage/DX_APIUsage.vcxproj.filters @@ -44,14 +44,14 @@ DXUT\Optional - - Highlights + + GfeSDKWrapper jsoncpp - - Highlights + + GfeSDKWrapper @@ -64,7 +64,7 @@ {e6c31087-9bca-4c1f-9cf1-578a4d193ded} - + {326dccc8-f9e7-498f-aba9-a6c7698130c3} @@ -129,8 +129,8 @@ DXUT\Optional - - Highlights + + GfeSDKWrapper jsoncpp @@ -138,8 +138,8 @@ jsoncpp - - Highlights + + GfeSDKWrapper diff --git a/samples/DX_APIUsage/GfeSDKHighlights.c b/samples/DX_APIUsage/GfeSDKHighlights.c deleted file mode 100644 index 9ffc36d..0000000 --- a/samples/DX_APIUsage/GfeSDKHighlights.c +++ /dev/null @@ -1,482 +0,0 @@ -/* Copyright (c) 2018, 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. -*/ -/*! -* \file -* Shows example usage of the GfeSDK C API by a directX application. -*/ - -#include - -#include "GfeSDKHighlights.h" - -#include -#include - -#include -#include -#include -#include - -char g_logBuffer[512]; -void dbgprint(const char *fmt, ...) { - va_list args; - va_start(args, fmt); - vsprintf_s(g_logBuffer, sizeof(g_logBuffer) / sizeof(g_logBuffer[0]), fmt, args); - printf(g_logBuffer); - printf("\n"); - OutputDebugStringA(g_logBuffer); - OutputDebugStringA("\n"); - va_end(args); -} -#define LOG(fmt, ...) dbgprint(fmt, __VA_ARGS__) - -#define VALIDATE_HANDLE() \ - if (!g_sdk) { \ - LOG("Invalid handle!"); \ - return; \ - } -#define COUNT_OF(x) ((sizeof(x)/sizeof(0[x])) / ((size_t)(!(sizeof(x) % sizeof(0[x]))))) - -NVGSDK_HANDLE* g_sdk = NULL; -#define MAX_QUERY_STRING 2000 -wchar_t g_lastQueryResult[MAX_QUERY_STRING]; -wchar_t g_lastResult[NVGSDK_MAX_LENGTH]; -wchar_t g_permissionStr[NVGSDK_MAX_LENGTH]; -wchar_t g_overlayStateStr[NVGSDK_MAX_LENGTH]; - -static void ConfigureHighlights(char const* defaultLocale, NVGSDK_Highlight* highlights, size_t numHighlights); -static void __stdcall handleNotification(NVGSDK_NotificationType type, NVGSDK_Notification const* response, void* context); -static void __stdcall handlePermissionChanged(NVGSDK_ScopePermission* scopePermissionTable, size_t size); -static void __stdcall handleGenericResponse(NVGSDK_RetCode rc, void* context); -static void __stdcall handlePermissionRequested(NVGSDK_RetCode rc, void* context); -static void updateResultString(NVGSDK_RetCode rc); - -typedef struct -{ - char const* defaultLocale; - NVGSDK_Highlight* highlights; - size_t numHighlights; -} TConfigHolder; - -void __stdcall handlePermissionRequested(NVGSDK_RetCode rc, void* context) -{ - updateResultString(rc); - TConfigHolder* configHolder = context; - - if (NVGSDK_SUCCEEDED(rc)) - { - ConfigureHighlights(configHolder->defaultLocale, configHolder->highlights, configHolder->numHighlights); - } - - free(context); -} - -void Init(char const* gameName, char const* defaultLocale, NVGSDK_Highlight* highlights, size_t numHighlights) -{ - memset(g_lastQueryResult, 0, MAX_QUERY_STRING); - memset(g_lastResult, 0, NVGSDK_MAX_LENGTH); - memset(g_permissionStr, 0, NVGSDK_MAX_LENGTH); - memset(g_overlayStateStr, 0, NVGSDK_MAX_LENGTH); - - //! [Creation C] - NVGSDK_CreateInputParams inParams; - memset(&inParams, 0, sizeof(inParams)); - - NVGSDK_Scope scopes[] = { NVGSDK_SCOPE_HIGHLIGHTS, NVGSDK_SCOPE_HIGHLIGHTS_VIDEO, NVGSDK_SCOPE_HIGHLIGHTS_SCREENSHOT }; - NVGSDK_ScopePermission scopePermissions[COUNT_OF(scopes)]; - - inParams.appName = "gfesdk_dx_sample"; - inParams.pollForCallbacks = true; - inParams.scopeTable = &scopes[0]; - inParams.scopeTableSize = COUNT_OF(scopes); - inParams.notificationCallback = handleNotification; - - NVGSDK_CreateResponse outParams; - memset(&outParams, 0, sizeof(outParams)); - outParams.scopePermissionTable = &scopePermissions[0]; - outParams.scopePermissionTableSize = COUNT_OF(scopes); - - NVGSDK_RetCode rc = NVGSDK_Create(&g_sdk, &inParams, &outParams); - if (NVGSDK_SUCCEEDED(rc)) - { - // Valid handle has been returned - LOG("Success: %s", NVGSDK_RetCodeToString(rc)); - LOG("PC is running GFE version %s", outParams.gfeVersionStr); - LOG("PC is running GfeSDK version %d.%d", outParams.versionMajor, outParams.versionMinor); - switch (rc) - { - case NVGSDK_SUCCESS_VERSION_OLD_GFE: - LOG("Compatible, but the user should update to the latest version of GFE."); - break; - case NVGSDK_SUCCESS_VERSION_OLD_SDK: - LOG("Compatible, but this application should update to a more recent GfeSDK to get latest features/bugfixes"); - break; - } - } - else - { - // No valid handle - LOG("Failure: %s", NVGSDK_RetCodeToString(rc)); - switch (rc) - { - case NVGSDK_ERR_SDK_VERSION: - LOG("This version of the SDK is too old to communicate with the user's SDK. We're never planning on this happening."); - LOG("PC is running GFE version %s", outParams.gfeVersionStr); - LOG("PC is running GfeSDK version %d.%d", outParams.versionMajor, outParams.versionMinor); - break; - case NVGSDK_SUCCESS_VERSION_OLD_SDK: - LOG("The installed version of GFE is too old to continue. User must upgrade."); - LOG("PC is running GFE version %s", outParams.gfeVersionStr); - LOG("PC is running GfeSDK version %d.%d", outParams.versionMajor, outParams.versionMinor); - break; - } - return; - } - //! [Creation C] - - handlePermissionChanged(outParams.scopePermissionTable, outParams.scopePermissionTableSize); - - //! [Permissions C] - // Request Permissions if user hasn't decided yet - NVGSDK_RequestPermissionsParams requestPermissionsParams = { 0 }; - NVGSDK_Scope requestScopes[COUNT_OF(scopes)]; - memset(requestScopes, NVGSDK_SCOPE_MAX, COUNT_OF(scopes)); - requestPermissionsParams.scopeTable = &requestScopes[0]; - - // 'response' came from create call. It tells us which permissions we requested during Create, - // but the user hasn't yet made a decision on - for (size_t i = 0, j = 0; i < outParams.scopePermissionTableSize; ++i) - { - if (outParams.scopePermissionTable[i].permission == NVGSDK_PERMISSION_MUST_ASK) - { - requestPermissionsParams.scopeTable[j++] = outParams.scopePermissionTable[i].scope; - requestPermissionsParams.scopeTableSize++; - } - } - - if (requestPermissionsParams.scopeTableSize > 0) - { - TConfigHolder* configHolder = malloc(sizeof(TConfigHolder)); - configHolder->defaultLocale = defaultLocale; - configHolder->highlights = highlights; - configHolder->numHighlights = numHighlights; - - // If the user hasn't given permission for recording yet, ask them to do so now via overlay - NVGSDK_RequestPermissionsAsync(g_sdk, &requestPermissionsParams, &handlePermissionRequested, configHolder); - } - else - { - // Otherwise, go ahead and set up now - ConfigureHighlights(defaultLocale, highlights, numHighlights); - } - //! [Permissions C] -} - -void DeInit() -{ - VALIDATE_HANDLE(); - - //! [Release C] - NVGSDK_Release(g_sdk); - //! [Release C] -} - -void OnTick() -{ - VALIDATE_HANDLE(); - - NVGSDK_Poll(g_sdk); -} - -void OnOpenGroup(char const* groupId) -{ - VALIDATE_HANDLE(); - - //! [OpenGroup C] - NVGSDK_HighlightOpenGroupParams params = { 0 }; - params.groupId = groupId; - NVGSDK_Highlights_OpenGroupAsync(g_sdk, ¶ms, &handleGenericResponse, NULL); - //! [OpenGroup C] -} - -void OnCloseGroup(char const* groupId, bool destroy) -{ - VALIDATE_HANDLE(); - - //! [CloseGroup C] - NVGSDK_HighlightCloseGroupParams params = { 0 }; - params.groupId = groupId; - params.destroyHighlights = destroy; - NVGSDK_Highlights_CloseGroupAsync(g_sdk, ¶ms, &handleGenericResponse, NULL); - //! [CloseGroup C] -} - -void OnSaveScreenshot(char const* highlightId, char const* groupId) -{ - VALIDATE_HANDLE(); - - NVGSDK_ScreenshotHighlightParams params; - params.groupId = groupId; - params.highlightId = highlightId; - NVGSDK_Highlights_SetScreenshotHighlightAsync(g_sdk, ¶ms, &handleGenericResponse, NULL); -} - -void OnSaveVideo(char const* highlightId, char const* groupId, int startDelta, int endDelta) -{ - VALIDATE_HANDLE(); - - //! [SaveVideo C] - NVGSDK_VideoHighlightParams params; - params.groupId = groupId; - params.highlightId = highlightId; - params.startDelta = startDelta; - params.endDelta = endDelta; - NVGSDK_Highlights_SetVideoHighlightAsync(g_sdk, ¶ms, &handleGenericResponse, NULL); - //! [SaveVideo C] -} - -void __stdcall handleSummaryOpened(NVGSDK_RetCode rc, void* context) -{ - updateResultString(rc); - NVGSDK_SummaryParams* params = context; - free(params); -} - -void OnOpenSummary(char const* groupIds[], size_t numGroups, int sigFilter, int tagFilter) -{ - VALIDATE_HANDLE(); - - //! [OpenSummary C] - NVGSDK_SummaryParams* params = calloc(1, sizeof(NVGSDK_SummaryParams)); - params->groupSummaryTable = calloc(numGroups, sizeof(NVGSDK_GroupView)); - params->groupSummaryTableSize = numGroups; - - for (size_t i = 0; i < numGroups; ++i) - { - params->groupSummaryTable[i].groupId = groupIds[i]; - params->groupSummaryTable[i].significanceFilter = sigFilter; - params->groupSummaryTable[i].tagsFilter = tagFilter; - } - - NVGSDK_Highlights_OpenSummaryAsync(g_sdk, params, &handleSummaryOpened, params); - //! [OpenSummary C] -} - -void __stdcall handleGotNumHighlights(NVGSDK_RetCode rc, NVGSDK_Highlights_NumberOfHighlights const* response, void* context) -{ - updateResultString(rc); - if (NVGSDK_SUCCEEDED(rc)) - { - swprintf(g_lastQueryResult, MAX_QUERY_STRING, L"#: %d", response->numberOfHighlights); - } -} - -void OnGetNumHighlights(char const* groupId, int sigFilter, int tagFilter) -{ - VALIDATE_HANDLE(); - - NVGSDK_GroupView groupView; - groupView.groupId = groupId; - groupView.significanceFilter = sigFilter; - groupView.tagsFilter = tagFilter; - - NVGSDK_Highlights_GetNumberOfHighlightsAsync(g_sdk, &groupView, handleGotNumHighlights, NULL); -} - -void __stdcall handleGotLanguage(NVGSDK_RetCode rc, NVGSDK_Language const* response, void* context) -{ - updateResultString(rc); - if (NVGSDK_SUCCEEDED(rc)) - { - swprintf(g_lastQueryResult, MAX_QUERY_STRING, L"%hs", response->cultureCode); - } -} - -void OnRequestLanguage() -{ - VALIDATE_HANDLE(); - - NVGSDK_GetUILanguageAsync(g_sdk, handleGotLanguage, NULL); -} - -void __stdcall handleGotUserSettings(NVGSDK_RetCode rc, NVGSDK_Highlights_UserSettings const* response, void* context) -{ - updateResultString(rc); - if (NVGSDK_SUCCEEDED(rc)) - { - size_t endOfStr = 0; - for (size_t i = 0; i < response->highlightSettingTableSize; ++i) - { - endOfStr += swprintf(g_lastQueryResult + endOfStr, MAX_QUERY_STRING - endOfStr, L"\n%hs: %hs", response->highlightSettingTable[i].id, response->highlightSettingTable[i].enabled ? "ON" : "OFF"); - } - } -} - -void OnRequestUserSettings() -{ - VALIDATE_HANDLE(); - - NVGSDK_Highlights_GetUserSettingsAsync(g_sdk, &handleGotUserSettings, NULL); -} - -wchar_t const* GetCurrentPermissionStr() -{ - return g_permissionStr; -} - -wchar_t const* GetLastOverlayEvent() -{ - return g_overlayStateStr; -} - -wchar_t const* GetLastResult() -{ - return g_lastResult; -} - -wchar_t const* GetLastQueryResult() -{ - return g_lastQueryResult; -} - -void InitHighlightsWrapper(HighlightsWrapper* hl) -{ - hl->Init = &Init; - hl->DeInit = &DeInit; - hl->OnTick = &OnTick; - hl->OnOpenGroup = &OnOpenGroup; - hl->OnCloseGroup = &OnCloseGroup; - hl->OnSaveScreenshot = &OnSaveScreenshot; - hl->OnSaveVideo = &OnSaveVideo; - hl->OnGetNumHighlights = &OnGetNumHighlights; - hl->OnOpenSummary = &OnOpenSummary; - hl->OnRequestLanguage = &OnRequestLanguage; - hl->OnRequestUserSettings = &OnRequestUserSettings; - hl->GetCurrentPermissionStr = &GetCurrentPermissionStr; - hl->GetLastOverlayEvent = &GetLastOverlayEvent; - hl->GetLastQueryResult = &GetLastQueryResult; - hl->GetLastResult = &GetLastResult; -} - -void __stdcall handleConfigured(NVGSDK_RetCode rc, void* context) -{ - updateResultString(rc); - - if (NVGSDK_FAILED(rc)) - { - return; - } - - NVGSDK_HighlightConfigParams* params = context; - - for (size_t i = 0; i < params->highlightTableSize; ++i) - { - for (size_t name = 0; name < params->highlightDefinitionTable[i].nameTableSize; ++name) - { - free((void*)params->highlightDefinitionTable[i].nameTable[name].localeCode); - free((void*)params->highlightDefinitionTable[i].nameTable[name].localizedString); - } - free(params->highlightDefinitionTable[i].nameTable); - } - - free(params->highlightDefinitionTable); - free(params); -} - -void ConfigureHighlights(char const* defaultLocale, NVGSDK_Highlight* hl, size_t numHighlights) -{ - // Re-creating the highlights table to show the sample code - - //! [ConfigureHighlights C] - NVGSDK_Highlight* highlights = calloc(numHighlights, sizeof(NVGSDK_Highlight)); - highlights[0].userInterest = false; - - NVGSDK_HighlightConfigParams* params = calloc(1, sizeof(NVGSDK_HighlightConfigParams)); - params->defaultLocale = defaultLocale; - params->highlightDefinitionTable = highlights; - params->highlightTableSize = numHighlights; - - for (size_t i = 0; i < numHighlights; ++i) - { - highlights[i].id = hl[i].id; - highlights[i].highlightTags = hl[i].highlightTags; - highlights[i].significance = hl[i].significance; - highlights[i].userInterest = hl[i].userInterest; - - highlights[i].nameTableSize = hl[i].nameTableSize; - highlights[i].nameTable = hl[i].nameTableSize > 0 ? calloc(hl[i].nameTableSize, sizeof(NVGSDK_LocalizedPair)) : NULL; - for (size_t name = 0; name < hl[i].nameTableSize; ++name) - { - highlights[i].nameTable[name].localeCode = calloc(NVGSDK_MAX_LENGTH, sizeof(char)); - strncpy_s((char*)highlights[i].nameTable[name].localeCode, NVGSDK_MAX_LENGTH, hl[i].nameTable[name].localeCode, NVGSDK_MAX_LENGTH); - highlights[i].nameTable[name].localizedString = calloc(NVGSDK_MAX_LENGTH, sizeof(char)); - strncpy_s((char*)highlights[i].nameTable[name].localizedString, NVGSDK_MAX_LENGTH, hl[i].nameTable[name].localizedString, NVGSDK_MAX_LENGTH); - } - } - - NVGSDK_Highlights_ConfigureAsync(g_sdk, params, &handleConfigured, params); - //! [ConfigureHighlights C] -} - -void __stdcall handleNotification(NVGSDK_NotificationType type, NVGSDK_Notification const* response, void* context) -{ - switch (type) - { - case NVGSDK_NOTIFICATION_PERMISSIONS_CHANGED: - handlePermissionChanged(response->permissionsChanged.scopePermissionTable, response->permissionsChanged.scopePermissionTableSize); - break; - case NVGSDK_NOTIFICATION_OVERLAY_STATE_CHANGED: - { - size_t endOfStr = 0; - switch (response->overlayStateChanged.state) - { - case NVGSDK_OVERLAY_STATE_MAIN: endOfStr += swprintf(g_overlayStateStr, NVGSDK_MAX_LENGTH, L"%hs", "Main Overlay Window"); break; - case NVGSDK_OVERLAY_STATE_PERMISSION: endOfStr += swprintf(g_overlayStateStr, NVGSDK_MAX_LENGTH, L"%hs", "Permission Overlay Window"); break; - case NVGSDK_OVERLAY_STATE_HIGHLIGHTS_SUMMARY: endOfStr += swprintf(g_overlayStateStr, NVGSDK_MAX_LENGTH, L"%hs", "Highlights Summary Overlay Window"); break; - default: endOfStr += swprintf(g_overlayStateStr, NVGSDK_MAX_LENGTH, L"%hs", "Unknown Window"); break; - } - - swprintf(g_overlayStateStr + endOfStr, NVGSDK_MAX_LENGTH - endOfStr, L" %hs", response->overlayStateChanged.open ? "OPEN" : "CLOSED"); - break; - } - default: - LOG("Unknown notification type"); - break; - } -} - -void __stdcall handlePermissionChanged(NVGSDK_ScopePermission* scopePermissionTable, size_t size) -{ - NVGSDK_Permission permission = NVGSDK_PERMISSION_MUST_ASK; - for (size_t i = 0; i < size; ++i) - { - if (scopePermissionTable[i].scope == NVGSDK_SCOPE_HIGHLIGHTS_VIDEO) - { - permission = scopePermissionTable[i].permission; - } - } - - switch (permission) - { - case NVGSDK_PERMISSION_MUST_ASK: swprintf(g_permissionStr, NVGSDK_MAX_LENGTH, L"%hs", "Must Ask"); break; - case NVGSDK_PERMISSION_GRANTED: swprintf(g_permissionStr, NVGSDK_MAX_LENGTH, L"%hs", "Granted"); break; - case NVGSDK_PERMISSION_DENIED: swprintf(g_permissionStr, NVGSDK_MAX_LENGTH, L"%hs", "Denied"); break; - default: swprintf(g_permissionStr, NVGSDK_MAX_LENGTH, L"%hs", "Unknown"); break; - } -} - -void __stdcall handleGenericResponse(NVGSDK_RetCode rc, void* context) -{ - updateResultString(rc); -} - -void updateResultString(NVGSDK_RetCode rc) -{ - swprintf(g_lastResult, NVGSDK_MAX_LENGTH, L"%hs", NVGSDK_RetCodeToString(rc)); -} diff --git a/samples/DX_APIUsage/GfeSDKHighlights.cpp b/samples/DX_APIUsage/GfeSDKHighlights.cpp deleted file mode 100644 index 0839c6a..0000000 --- a/samples/DX_APIUsage/GfeSDKHighlights.cpp +++ /dev/null @@ -1,383 +0,0 @@ -/* Copyright (c) 2018, 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. -*/ -/*! -* \file -* Shows example usage of the GfeSDK C++ API by a directX application. -*/ - -#include - -#include "GfeSDKHighlights.hpp" - -#include - -char g_logBuffer[512]; -void dbgprint(const char *fmt, ...) { - va_list args; - va_start(args, fmt); - vsprintf_s(g_logBuffer, sizeof(g_logBuffer) / sizeof(g_logBuffer[0]), fmt, args); - printf(g_logBuffer); - printf("\n"); - OutputDebugStringA(g_logBuffer); - OutputDebugStringA("\n"); - va_end(args); -} -#define LOG(fmt, ...) dbgprint(fmt, __VA_ARGS__) - -static std::wstring permissionToStringW(GfeSDK::NVGSDK_Permission p) -{ - switch (p) - { - case GfeSDK::NVGSDK_PERMISSION_MUST_ASK: return L"Must Ask"; - case GfeSDK::NVGSDK_PERMISSION_GRANTED: return L"Granted"; - case GfeSDK::NVGSDK_PERMISSION_DENIED: return L"Denied"; - default: - return L"UNKNOWN"; - } -} - -HighlightsWrapper::HighlightsWrapper() : - m_currentPermission(permissionToStringW(GfeSDK::NVGSDK_PERMISSION_MUST_ASK)) -{ -} - -void HighlightsWrapper::Init(char const* gameName, char const* defaultLocale, GfeSDK::NVGSDK_Highlight* highlights, size_t numHighlights) -{ - using namespace std::placeholders; - - //! [Creation CPP] - GfeSDK::CreateInputParams createParams; - createParams.appName = "gfesdk_dx_sample"; // appName will only be used/visible if GFE cannot identify your game - createParams.pollForCallbacks = true; // We will poll for callbacks in order to execute callbacks from game loop - createParams.requiredScopes = { - GfeSDK::NVGSDK_SCOPE_HIGHLIGHTS, - GfeSDK::NVGSDK_SCOPE_HIGHLIGHTS_VIDEO, - GfeSDK::NVGSDK_SCOPE_HIGHLIGHTS_SCREENSHOT - }; - createParams.notificationCallback = std::bind(&HighlightsWrapper::OnNotification, this, _1, _2); - - GfeSDK::CreateResponse response; - GfeSDK::Core* gfesdkCore = GfeSDK::Core::Create(createParams, response); - if (GfeSDK::NVGSDK_SUCCEEDED(response.returnCode)) - { - // Valid handle has been returned - LOG("Success: %s", GfeSDK::NVGSDK_RetCodeToString(response.returnCode)); - LOG("PC is running GFE version %s", response.nvidiaGfeVersion.c_str()); - LOG("PC is running GfeSDK version %d.%d", response.versionMajor, response.versionMinor); - switch (response.returnCode) - { - case GfeSDK::NVGSDK_SUCCESS_VERSION_OLD_GFE: - LOG("Compatible, but the user should update to the latest version of GFE."); - break; - case GfeSDK::NVGSDK_SUCCESS_VERSION_OLD_SDK: - LOG("Compatible, but this application should update to a more recent GfeSDK to get latest features/bugfixes"); - break; - } - } - else - { - // No valid handle - LOG("Failure: %s", GfeSDK::NVGSDK_RetCodeToString(response.returnCode)); - switch (response.returnCode) - { - case GfeSDK::NVGSDK_ERR_SDK_VERSION: - LOG("This version of the SDK is too old to communicate with the user's SDK. We're never planning on this happening."); - LOG("PC is running GFE version %s", response.nvidiaGfeVersion.c_str()); - LOG("PC is running GfeSDK version %d.%d", response.versionMajor, response.versionMinor); - break; - case GfeSDK::NVGSDK_SUCCESS_VERSION_OLD_SDK: - LOG("The installed version of GFE is too old to continue. User must upgrade."); - LOG("PC is running GFE version %s", response.nvidiaGfeVersion.c_str()); - LOG("PC is running GfeSDK version %d.%d", response.versionMajor, response.versionMinor); - break; - } - return; - } - //! [Creation CPP] - - m_gfesdk.reset(gfesdkCore); - UpdateLastResultString(response.returnCode); - - if (response.scopePermissions.find(GfeSDK::NVGSDK_SCOPE_HIGHLIGHTS_VIDEO) != response.scopePermissions.end()) - { - m_currentPermission = permissionToStringW(response.scopePermissions[GfeSDK::NVGSDK_SCOPE_HIGHLIGHTS_VIDEO]); - } - - //! [Permissions CPP] - // Request Permissions if user hasn't decided yet - GfeSDK::RequestPermissionsParams requestPermissionsParams; - - // 'response' came from create call. It tells us which permissions we requested during Create, - // but the user hasn't yet made a decision on - for (auto&& entry : response.scopePermissions) - { - if (entry.second == GfeSDK::NVGSDK_PERMISSION_MUST_ASK) - { - requestPermissionsParams.scopes.push_back(entry.first); - } - } - - if (!requestPermissionsParams.scopes.empty()) - { - // If the user hasn't given permission for recording yet, ask them to do so now via overlay - m_gfesdk->RequestPermissionsAsync(requestPermissionsParams, [this, defaultLocale, highlights, numHighlights](GfeSDK::NVGSDK_RetCode rc, void* cbContext) { - UpdateLastResultString(rc); - if (GfeSDK::NVGSDK_SUCCEEDED(rc)) - { - ConfigureHighlights(defaultLocale, highlights, numHighlights); - } - }); - } - else - { - // Otherwise, go ahead and set up now - ConfigureHighlights(defaultLocale, highlights, numHighlights); - } - //! [Permissions CPP] -} - -void HighlightsWrapper::DeInit() -{ - // Releasing from smart pointer just to document how to delete handle - GfeSDK::Core* gfesdkCore = m_gfesdk.release(); - - //! [Release CPP] - delete gfesdkCore; - //! [Release CPP] -} - -void HighlightsWrapper::OnTick(void) -{ - if (!m_gfesdk) return; - - // Poll for callbacks in order to execute these callbacks from the game update thread, - // not a third party thead owned by GfeSDK. This lets us update game state from the callbacks - // without causing a threading problem - m_gfesdk->Poll(); -} - -void HighlightsWrapper::OnNotification(GfeSDK::NVGSDK_NotificationType type, GfeSDK::NotificationBase const& notification) -{ - switch (type) - { - case GfeSDK::NVGSDK_NOTIFICATION_PERMISSIONS_CHANGED: - { - GfeSDK::PermissionsChangedNotification const& n = static_cast(notification); - - auto hlPermission = n.scopePermissions.find(GfeSDK::NVGSDK_SCOPE_HIGHLIGHTS_VIDEO); - if (hlPermission != n.scopePermissions.end()) - { - m_currentPermission = permissionToStringW(hlPermission->second); - } - break; - } - case GfeSDK::NVGSDK_NOTIFICATION_OVERLAY_STATE_CHANGED: - { - GfeSDK::OverlayStateChangedNotification const& n = static_cast(notification); - - m_lastOverlayEvent.clear(); - switch (n.state) - { - case GfeSDK::NVGSDK_OVERLAY_STATE_MAIN: m_lastOverlayEvent += L"Main Overlay Window"; break; - case GfeSDK::NVGSDK_OVERLAY_STATE_PERMISSION: m_lastOverlayEvent += L"Permission Overlay Window"; break; - case GfeSDK::NVGSDK_OVERLAY_STATE_HIGHLIGHTS_SUMMARY: m_lastOverlayEvent += L"Highlights Summary Overlay Window"; break; - default: - m_lastOverlayEvent += L"UNKNOWNWindow"; - } - m_lastOverlayEvent += (n.open ? L" OPEN" : L" CLOSE"); - break; - } - } -} - -void HighlightsWrapper::OnOpenGroup(std::string const& id) -{ - if (!m_highlights) return; - - //! [OpenGroup CPP] - GfeSDK::HighlightOpenGroupParams params; - params.groupId = id; - params.groupDescriptionLocaleTable["en-US"] = id; - m_highlights->OpenGroupAsync(params, [this](GfeSDK::NVGSDK_RetCode rc, void*) { - UpdateLastResultString(rc); - }); - //! [OpenGroup CPP] -} - -void HighlightsWrapper::OnCloseGroup(std::string const& id, bool destroy) -{ - if (!m_highlights) return; - - //! [CloseGroup CPP] - GfeSDK::HighlightCloseGroupParams params; - params.groupId = id; - params.destroyHighlights = destroy; - m_highlights->CloseGroupAsync(params, [this](GfeSDK::NVGSDK_RetCode rc, void*) { - UpdateLastResultString(rc); - }); - //! [CloseGroup CPP] - -#ifdef DOXYGEN - //! [Async Call No Callback] - // If the caller doesn't care about the return value, no need to pass callbacks - GfeSDK::HighlightCloseGroupParams params = { "GROUP_1" }; - m_highlights->CloseGroupAsync(params); - //! [Async Call No Callback] -#endif -} - -void HighlightsWrapper::OnSaveScreenshot(std::string const& highlightId, std::string const& groupId) -{ - GfeSDK::ScreenshotHighlightParams params; - params.groupId = groupId; - params.highlightId = highlightId; - m_highlights->SetScreenshotHighlightAsync(params, [this](GfeSDK::NVGSDK_RetCode rc, void*) { - UpdateLastResultString(rc); - }); -} - -void HighlightsWrapper::OnSaveVideo(std::string const& highlightId, std::string const& groupId, int startDelta, int endDelta) -{ - //! [SaveVideo CPP] - GfeSDK::VideoHighlightParams params; - params.startDelta = startDelta; - params.endDelta = endDelta; - params.groupId = groupId; - params.highlightId = highlightId; - m_highlights->SetVideoHighlightAsync(params, [this](GfeSDK::NVGSDK_RetCode rc, void*) { - UpdateLastResultString(rc); - }); - //! [SaveVideo CPP] -} - -void HighlightsWrapper::OnGetNumHighlights(std::string const& groupId, GfeSDK::NVGSDK_HighlightSignificance sigFilter, GfeSDK::NVGSDK_HighlightType tagFilter) -{ - GfeSDK::GroupView v; - v.groupId = groupId; - v.significanceFilter = sigFilter; - v.tagsFilter = tagFilter; - - m_highlights->GetNumberOfHighlightsAsync(v, [this](GfeSDK::NVGSDK_RetCode rc, GfeSDK::GetNumberOfHighlightsResponse const* response, void*) { - UpdateLastResultString(rc); - if (GfeSDK::NVGSDK_SUCCEEDED(rc)) - { - m_lastQueryResult = std::to_wstring(response->numHighlights); - } - }); -} - -void HighlightsWrapper::OnOpenSummary(char const* groupIds[], size_t numGroups, GfeSDK::NVGSDK_HighlightSignificance sigFilter, GfeSDK::NVGSDK_HighlightType tagFilter) -{ - //! [OpenSummary CPP] - GfeSDK::SummaryParams params; - - // Can show more than one group at a time, each with their own filters if desired - for (size_t i = 0; i < numGroups; ++i) - { - GfeSDK::GroupView v; - v.groupId = groupIds[i]; - v.significanceFilter = sigFilter; - v.tagsFilter = tagFilter; - params.groupViews.push_back(v); - } - - m_highlights->OpenSummaryAsync(params, [this](GfeSDK::NVGSDK_RetCode rc, void*) { - UpdateLastResultString(rc); - }); - //! [OpenSummary CPP] -} - -void HighlightsWrapper::OnRequestLanguage(void) -{ - //! [Asynchonous Call] - // We are passing two arguments to this function, the function lambda, and a user context. In this case, we're passing - // the 'this' pointer as the user context. This gets passed through unmodified for use in the callback function. - m_gfesdk->GetUILanguageAsync([this](GfeSDK::NVGSDK_RetCode rc, GfeSDK::GetUILanguageResponse const* response, void* context) { - // Passed this pointer through as context - HighlightsWrapper* thiz = reinterpret_cast(context); - - UpdateLastResultString(rc); - if (GfeSDK::NVGSDK_SUCCEEDED(rc)) - { - m_lastQueryResult = m_converter.from_bytes(response->cultureCode); - } - }, this); - //! [Asynchonous Call] -} - -void HighlightsWrapper::OnRequestUserSettings(void) -{ - m_highlights->GetUserSettingsAsync([this](GfeSDK::NVGSDK_RetCode rc, GfeSDK::GetUserSettingsResponse const* response, void*) { - UpdateLastResultString(rc); - m_lastQueryResult = L""; - if (GfeSDK::NVGSDK_SUCCEEDED(rc)) - { - for (auto it = response->highlightSettings.begin(); it != response->highlightSettings.end(); ++it) - { - m_lastQueryResult += L"\n" + m_converter.from_bytes(it->highlightId) + (it->enabled ? L": ON" : L": OFF"); - } - } - }); -} - -wchar_t const* HighlightsWrapper::GetCurrentPermissionStr(void) -{ - return m_currentPermission.c_str(); -} - -wchar_t const* HighlightsWrapper::GetLastOverlayEvent(void) -{ - return m_lastOverlayEvent.c_str(); -} - -wchar_t const* HighlightsWrapper::GetLastResult(void) -{ - return m_lastResult.c_str(); -} - -wchar_t const* HighlightsWrapper::GetLastQueryResult(void) -{ - return m_lastQueryResult.c_str(); -} - -void HighlightsWrapper::ConfigureHighlights(char const* defaultLocale, GfeSDK::NVGSDK_Highlight* highlights, size_t numHighlights) -{ - //! [ConfigureHighlights CPP] - // Create handle to highlights module - m_highlights.reset(GfeSDK::Highlights::Create(m_gfesdk.get())); - - GfeSDK::HighlightConfigParams configParams; - configParams.defaultLocale = defaultLocale; - - // Set up highlight definition table - for (size_t i = 0; i < numHighlights; ++i) - { - GfeSDK::HighlightDefinition highlightDef; - highlightDef.id = highlights[i].id; - highlightDef.userDefaultInterest = highlights[i].userInterest; - highlightDef.significance = highlights[i].significance; - highlightDef.highlightTags = highlights[i].highlightTags; - for (size_t j = 0; j < highlights[i].nameTableSize; ++j) - { - highlightDef.nameLocaleTable[highlights[i].nameTable[j].localeCode] = highlights[i].nameTable[j].localizedString; - } - - configParams.highlightDefinitions.push_back(highlightDef); - } - - m_highlights->ConfigureAsync(configParams, [this](GfeSDK::NVGSDK_RetCode rc, void*) { - UpdateLastResultString(rc); - }); - //! [ConfigureHighlights CPP] -} - -void HighlightsWrapper::UpdateLastResultString(GfeSDK::NVGSDK_RetCode rc) -{ - m_lastResult = m_converter.from_bytes(GfeSDK::RetCodeToString(rc)); -} diff --git a/samples/DX_APIUsage/GfeSDKHighlights.h b/samples/DX_APIUsage/GfeSDKHighlights.h deleted file mode 100644 index e9233ff..0000000 --- a/samples/DX_APIUsage/GfeSDKHighlights.h +++ /dev/null @@ -1,43 +0,0 @@ -/* Copyright (c) 2018, 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. -*/ - -#pragma once - -#ifdef __cplusplus -extern "C" { -#endif - -#include -#include - -typedef struct _HighlightsWrapper -{ - void(*Init)(char const* gameName, char const* defaultLocale, NVGSDK_Highlight* highlights, size_t numHighlights); - void(*DeInit)(); - void(*OnTick)(); - void(*OnOpenGroup)(char const* groupId); - void(*OnCloseGroup)(char const* groupId, bool destroy); - void(*OnSaveScreenshot)(char const* highlightId, char const* groupId); - void(*OnSaveVideo)(char const* highlightId, char const* groupId, int startDelta, int endDelta); - void(*OnGetNumHighlights)(char const* groupId, int sigFilter, int tagFilter); - void(*OnOpenSummary)(char const* groupIds[], size_t numGroups, int sigFilter, int tagFiler); - void(*OnRequestLanguage)(); - void(*OnRequestUserSettings)(); - - wchar_t const* (*GetCurrentPermissionStr)(); - wchar_t const* (*GetLastOverlayEvent)(); - wchar_t const* (*GetLastResult)(); - wchar_t const* (*GetLastQueryResult)(); -} HighlightsWrapper; - -void InitHighlightsWrapper(HighlightsWrapper* hl); - -#ifdef __cplusplus -} -#endif diff --git a/samples/DX_APIUsage/GfeSDKHighlights.hpp b/samples/DX_APIUsage/GfeSDKHighlights.hpp deleted file mode 100644 index 98b9991..0000000 --- a/samples/DX_APIUsage/GfeSDKHighlights.hpp +++ /dev/null @@ -1,61 +0,0 @@ -/* Copyright (c) 2018, 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. -*/ - -#pragma once - -#include -#include -#include - -#include -#include - -namespace Json -{ -class Value; -} - -class HighlightsWrapper -{ -public: - HighlightsWrapper(); - - void Init(char const* gameName, char const* defaultLocale, GfeSDK::NVGSDK_Highlight* highlights, size_t numHighlights); - void DeInit(); - void OnTick(void); - void OnNotification(GfeSDK::NVGSDK_NotificationType type, GfeSDK::NotificationBase const&); - void OnOpenGroup(std::string const& id); - void OnCloseGroup(std::string const& id, bool destroy = false); - void OnSaveScreenshot(std::string const& highlightId, std::string const& groupId); - void OnSaveVideo(std::string const& highlightId, std::string const& groupId, int startDelta, int endDelta); - void OnGetNumHighlights(std::string const& groupId, GfeSDK::NVGSDK_HighlightSignificance sigFilter, GfeSDK::NVGSDK_HighlightType tagFilter); - void OnOpenSummary(char const* groupIds[], size_t numGroups, GfeSDK::NVGSDK_HighlightSignificance sigFilter, GfeSDK::NVGSDK_HighlightType tagFilter); - void OnRequestLanguage(void); - void OnRequestUserSettings(void); - - wchar_t const* GetCurrentPermissionStr(void); - wchar_t const* GetLastOverlayEvent(void); - wchar_t const* GetLastResult(void); - wchar_t const* GetLastQueryResult(void); - -private: - void ConfigureHighlights(char const* defaultLocale, GfeSDK::NVGSDK_Highlight* highlights, size_t numHighlights); - void UpdateLastResultString(GfeSDK::NVGSDK_RetCode rc); - - std::unique_ptr m_gfesdk; - std::unique_ptr m_highlights; - - std::wstring_convert> m_converter; - std::wstring m_currentPermission; - std::wstring m_lastOverlayEvent; - std::wstring m_lastResult; - std::wstring m_lastQueryResult; -}; - -inline void InitHighlightsWrapper(HighlightsWrapper* hl) {} diff --git a/samples/DX_APIUsage/GfeSDKWrapper.c b/samples/DX_APIUsage/GfeSDKWrapper.c new file mode 100644 index 0000000..809d64b --- /dev/null +++ b/samples/DX_APIUsage/GfeSDKWrapper.c @@ -0,0 +1,482 @@ +/* Copyright (c) 2018, 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. +*/ +/*! +* \file +* Shows example usage of the GfeSDK C API by a directX application. +*/ + +#include + +#include "GfeSDKWrapper.h" + +#include +#include + +#include +#include +#include +#include + +char g_logBuffer[512]; +void dbgprint(const char *fmt, ...) { + va_list args; + va_start(args, fmt); + vsprintf_s(g_logBuffer, sizeof(g_logBuffer) / sizeof(g_logBuffer[0]), fmt, args); + printf(g_logBuffer); + printf("\n"); + OutputDebugStringA(g_logBuffer); + OutputDebugStringA("\n"); + va_end(args); +} +#define LOG(fmt, ...) dbgprint(fmt, __VA_ARGS__) + +#define VALIDATE_HANDLE() \ + if (!g_sdk) { \ + LOG("Invalid handle!"); \ + return; \ + } +#define COUNT_OF(x) ((sizeof(x)/sizeof(0[x])) / ((size_t)(!(sizeof(x) % sizeof(0[x]))))) + +NVGSDK_HANDLE* g_sdk = NULL; +#define MAX_QUERY_STRING 2000 +wchar_t g_lastQueryResult[MAX_QUERY_STRING]; +wchar_t g_lastResult[NVGSDK_MAX_LENGTH]; +wchar_t g_permissionStr[NVGSDK_MAX_LENGTH]; +wchar_t g_overlayStateStr[NVGSDK_MAX_LENGTH]; + +static void ConfigureHighlights(char const* defaultLocale, NVGSDK_Highlight* highlights, size_t numHighlights); +static void __stdcall handleNotification(NVGSDK_NotificationType type, NVGSDK_Notification const* response, void* context); +static void __stdcall handlePermissionChanged(NVGSDK_ScopePermission* scopePermissionTable, size_t size); +static void __stdcall handleGenericResponse(NVGSDK_RetCode rc, void* context); +static void __stdcall handlePermissionRequested(NVGSDK_RetCode rc, void* context); +static void updateResultString(NVGSDK_RetCode rc); + +typedef struct +{ + char const* defaultLocale; + NVGSDK_Highlight* highlights; + size_t numHighlights; +} TConfigHolder; + +void __stdcall handlePermissionRequested(NVGSDK_RetCode rc, void* context) +{ + updateResultString(rc); + TConfigHolder* configHolder = context; + + if (NVGSDK_SUCCEEDED(rc)) + { + ConfigureHighlights(configHolder->defaultLocale, configHolder->highlights, configHolder->numHighlights); + } + + free(context); +} + +void Init(char const* gameName, char const* defaultLocale, NVGSDK_Highlight* highlights, size_t numHighlights) +{ + memset(g_lastQueryResult, 0, MAX_QUERY_STRING); + memset(g_lastResult, 0, NVGSDK_MAX_LENGTH); + memset(g_permissionStr, 0, NVGSDK_MAX_LENGTH); + memset(g_overlayStateStr, 0, NVGSDK_MAX_LENGTH); + + //! [Creation C] + NVGSDK_CreateInputParams inParams; + memset(&inParams, 0, sizeof(inParams)); + + NVGSDK_Scope scopes[] = { NVGSDK_SCOPE_HIGHLIGHTS, NVGSDK_SCOPE_HIGHLIGHTS_VIDEO, NVGSDK_SCOPE_HIGHLIGHTS_SCREENSHOT }; + NVGSDK_ScopePermission scopePermissions[COUNT_OF(scopes)]; + + inParams.appName = "gfesdk_dx_sample"; + inParams.pollForCallbacks = true; + inParams.scopeTable = &scopes[0]; + inParams.scopeTableSize = COUNT_OF(scopes); + inParams.notificationCallback = handleNotification; + + NVGSDK_CreateResponse outParams; + memset(&outParams, 0, sizeof(outParams)); + outParams.scopePermissionTable = &scopePermissions[0]; + outParams.scopePermissionTableSize = COUNT_OF(scopes); + + NVGSDK_RetCode rc = NVGSDK_Create(&g_sdk, &inParams, &outParams); + if (NVGSDK_SUCCEEDED(rc)) + { + // Valid handle has been returned + LOG("Success: %s", NVGSDK_RetCodeToString(rc)); + LOG("PC is running GFE version %s", outParams.gfeVersionStr); + LOG("PC is running GfeSDK version %d.%d", outParams.versionMajor, outParams.versionMinor); + switch (rc) + { + case NVGSDK_SUCCESS_VERSION_OLD_GFE: + LOG("Compatible, but the user should update to the latest version of GFE."); + break; + case NVGSDK_SUCCESS_VERSION_OLD_SDK: + LOG("Compatible, but this application should update to a more recent GfeSDK to get latest features/bugfixes"); + break; + } + } + else + { + // No valid handle + LOG("Failure: %s", NVGSDK_RetCodeToString(rc)); + switch (rc) + { + case NVGSDK_ERR_SDK_VERSION: + LOG("This version of the SDK is too old to communicate with the user's SDK. We're never planning on this happening."); + LOG("PC is running GFE version %s", outParams.gfeVersionStr); + LOG("PC is running GfeSDK version %d.%d", outParams.versionMajor, outParams.versionMinor); + break; + case NVGSDK_SUCCESS_VERSION_OLD_SDK: + LOG("The installed version of GFE is too old to continue. User must upgrade."); + LOG("PC is running GFE version %s", outParams.gfeVersionStr); + LOG("PC is running GfeSDK version %d.%d", outParams.versionMajor, outParams.versionMinor); + break; + } + return; + } + //! [Creation C] + + handlePermissionChanged(outParams.scopePermissionTable, outParams.scopePermissionTableSize); + + //! [Permissions C] + // Request Permissions if user hasn't decided yet + NVGSDK_RequestPermissionsParams requestPermissionsParams = { 0 }; + NVGSDK_Scope requestScopes[COUNT_OF(scopes)]; + memset(requestScopes, NVGSDK_SCOPE_MAX, COUNT_OF(scopes)); + requestPermissionsParams.scopeTable = &requestScopes[0]; + + // 'response' came from create call. It tells us which permissions we requested during Create, + // but the user hasn't yet made a decision on + for (size_t i = 0, j = 0; i < outParams.scopePermissionTableSize; ++i) + { + if (outParams.scopePermissionTable[i].permission == NVGSDK_PERMISSION_MUST_ASK) + { + requestPermissionsParams.scopeTable[j++] = outParams.scopePermissionTable[i].scope; + requestPermissionsParams.scopeTableSize++; + } + } + + if (requestPermissionsParams.scopeTableSize > 0) + { + TConfigHolder* configHolder = malloc(sizeof(TConfigHolder)); + configHolder->defaultLocale = defaultLocale; + configHolder->highlights = highlights; + configHolder->numHighlights = numHighlights; + + // If the user hasn't given permission for recording yet, ask them to do so now via overlay + NVGSDK_RequestPermissionsAsync(g_sdk, &requestPermissionsParams, &handlePermissionRequested, configHolder); + } + else + { + // Otherwise, go ahead and set up now + ConfigureHighlights(defaultLocale, highlights, numHighlights); + } + //! [Permissions C] +} + +void DeInit() +{ + VALIDATE_HANDLE(); + + //! [Release C] + NVGSDK_Release(g_sdk); + //! [Release C] +} + +void OnTick() +{ + VALIDATE_HANDLE(); + + NVGSDK_Poll(g_sdk); +} + +void OnOpenGroup(char const* groupId) +{ + VALIDATE_HANDLE(); + + //! [OpenGroup C] + NVGSDK_HighlightOpenGroupParams params = { 0 }; + params.groupId = groupId; + NVGSDK_Highlights_OpenGroupAsync(g_sdk, ¶ms, &handleGenericResponse, NULL); + //! [OpenGroup C] +} + +void OnCloseGroup(char const* groupId, bool destroy) +{ + VALIDATE_HANDLE(); + + //! [CloseGroup C] + NVGSDK_HighlightCloseGroupParams params = { 0 }; + params.groupId = groupId; + params.destroyHighlights = destroy; + NVGSDK_Highlights_CloseGroupAsync(g_sdk, ¶ms, &handleGenericResponse, NULL); + //! [CloseGroup C] +} + +void OnSaveScreenshot(char const* highlightId, char const* groupId) +{ + VALIDATE_HANDLE(); + + NVGSDK_ScreenshotHighlightParams params; + params.groupId = groupId; + params.highlightId = highlightId; + NVGSDK_Highlights_SetScreenshotHighlightAsync(g_sdk, ¶ms, &handleGenericResponse, NULL); +} + +void OnSaveVideo(char const* highlightId, char const* groupId, int startDelta, int endDelta) +{ + VALIDATE_HANDLE(); + + //! [SaveVideo C] + NVGSDK_VideoHighlightParams params; + params.groupId = groupId; + params.highlightId = highlightId; + params.startDelta = startDelta; + params.endDelta = endDelta; + NVGSDK_Highlights_SetVideoHighlightAsync(g_sdk, ¶ms, &handleGenericResponse, NULL); + //! [SaveVideo C] +} + +void __stdcall handleSummaryOpened(NVGSDK_RetCode rc, void* context) +{ + updateResultString(rc); + NVGSDK_SummaryParams* params = context; + free(params); +} + +void OnOpenSummary(char const* groupIds[], size_t numGroups, int sigFilter, int tagFilter) +{ + VALIDATE_HANDLE(); + + //! [OpenSummary C] + NVGSDK_SummaryParams* params = calloc(1, sizeof(NVGSDK_SummaryParams)); + params->groupSummaryTable = calloc(numGroups, sizeof(NVGSDK_GroupView)); + params->groupSummaryTableSize = numGroups; + + for (size_t i = 0; i < numGroups; ++i) + { + params->groupSummaryTable[i].groupId = groupIds[i]; + params->groupSummaryTable[i].significanceFilter = sigFilter; + params->groupSummaryTable[i].tagsFilter = tagFilter; + } + + NVGSDK_Highlights_OpenSummaryAsync(g_sdk, params, &handleSummaryOpened, params); + //! [OpenSummary C] +} + +void __stdcall handleGotNumHighlights(NVGSDK_RetCode rc, NVGSDK_Highlights_NumberOfHighlights const* response, void* context) +{ + updateResultString(rc); + if (NVGSDK_SUCCEEDED(rc)) + { + swprintf(g_lastQueryResult, MAX_QUERY_STRING, L"#: %d", response->numberOfHighlights); + } +} + +void OnGetNumHighlights(char const* groupId, int sigFilter, int tagFilter) +{ + VALIDATE_HANDLE(); + + NVGSDK_GroupView groupView; + groupView.groupId = groupId; + groupView.significanceFilter = sigFilter; + groupView.tagsFilter = tagFilter; + + NVGSDK_Highlights_GetNumberOfHighlightsAsync(g_sdk, &groupView, handleGotNumHighlights, NULL); +} + +void __stdcall handleGotLanguage(NVGSDK_RetCode rc, NVGSDK_Language const* response, void* context) +{ + updateResultString(rc); + if (NVGSDK_SUCCEEDED(rc)) + { + swprintf(g_lastQueryResult, MAX_QUERY_STRING, L"%hs", response->cultureCode); + } +} + +void OnRequestLanguage() +{ + VALIDATE_HANDLE(); + + NVGSDK_GetUILanguageAsync(g_sdk, handleGotLanguage, NULL); +} + +void __stdcall handleGotUserSettings(NVGSDK_RetCode rc, NVGSDK_Highlights_UserSettings const* response, void* context) +{ + updateResultString(rc); + if (NVGSDK_SUCCEEDED(rc)) + { + size_t endOfStr = 0; + for (size_t i = 0; i < response->highlightSettingTableSize; ++i) + { + endOfStr += swprintf(g_lastQueryResult + endOfStr, MAX_QUERY_STRING - endOfStr, L"\n%hs: %hs", response->highlightSettingTable[i].id, response->highlightSettingTable[i].enabled ? "ON" : "OFF"); + } + } +} + +void OnRequestUserSettings() +{ + VALIDATE_HANDLE(); + + NVGSDK_Highlights_GetUserSettingsAsync(g_sdk, &handleGotUserSettings, NULL); +} + +wchar_t const* GetCurrentPermissionStr() +{ + return g_permissionStr; +} + +wchar_t const* GetLastOverlayEvent() +{ + return g_overlayStateStr; +} + +wchar_t const* GetLastResult() +{ + return g_lastResult; +} + +wchar_t const* GetLastQueryResult() +{ + return g_lastQueryResult; +} + +void InitGfeSdkWrapper(GfeSdkWrapper* hl) +{ + hl->Init = &Init; + hl->DeInit = &DeInit; + hl->OnTick = &OnTick; + hl->OnOpenGroup = &OnOpenGroup; + hl->OnCloseGroup = &OnCloseGroup; + hl->OnSaveScreenshot = &OnSaveScreenshot; + hl->OnSaveVideo = &OnSaveVideo; + hl->OnGetNumHighlights = &OnGetNumHighlights; + hl->OnOpenSummary = &OnOpenSummary; + hl->OnRequestLanguage = &OnRequestLanguage; + hl->OnRequestUserSettings = &OnRequestUserSettings; + hl->GetCurrentPermissionStr = &GetCurrentPermissionStr; + hl->GetLastOverlayEvent = &GetLastOverlayEvent; + hl->GetLastQueryResult = &GetLastQueryResult; + hl->GetLastResult = &GetLastResult; +} + +void __stdcall handleConfigured(NVGSDK_RetCode rc, void* context) +{ + updateResultString(rc); + + if (NVGSDK_FAILED(rc)) + { + return; + } + + NVGSDK_HighlightConfigParams* params = context; + + for (size_t i = 0; i < params->highlightTableSize; ++i) + { + for (size_t name = 0; name < params->highlightDefinitionTable[i].nameTableSize; ++name) + { + free((void*)params->highlightDefinitionTable[i].nameTable[name].localeCode); + free((void*)params->highlightDefinitionTable[i].nameTable[name].localizedString); + } + free(params->highlightDefinitionTable[i].nameTable); + } + + free(params->highlightDefinitionTable); + free(params); +} + +void ConfigureHighlights(char const* defaultLocale, NVGSDK_Highlight* hl, size_t numHighlights) +{ + // Re-creating the highlights table to show the sample code + + //! [ConfigureHighlights C] + NVGSDK_Highlight* highlights = calloc(numHighlights, sizeof(NVGSDK_Highlight)); + highlights[0].userInterest = false; + + NVGSDK_HighlightConfigParams* params = calloc(1, sizeof(NVGSDK_HighlightConfigParams)); + params->defaultLocale = defaultLocale; + params->highlightDefinitionTable = highlights; + params->highlightTableSize = numHighlights; + + for (size_t i = 0; i < numHighlights; ++i) + { + highlights[i].id = hl[i].id; + highlights[i].highlightTags = hl[i].highlightTags; + highlights[i].significance = hl[i].significance; + highlights[i].userInterest = hl[i].userInterest; + + highlights[i].nameTableSize = hl[i].nameTableSize; + highlights[i].nameTable = hl[i].nameTableSize > 0 ? calloc(hl[i].nameTableSize, sizeof(NVGSDK_LocalizedPair)) : NULL; + for (size_t name = 0; name < hl[i].nameTableSize; ++name) + { + highlights[i].nameTable[name].localeCode = calloc(NVGSDK_MAX_LENGTH, sizeof(char)); + strncpy_s((char*)highlights[i].nameTable[name].localeCode, NVGSDK_MAX_LENGTH, hl[i].nameTable[name].localeCode, NVGSDK_MAX_LENGTH); + highlights[i].nameTable[name].localizedString = calloc(NVGSDK_MAX_LENGTH, sizeof(char)); + strncpy_s((char*)highlights[i].nameTable[name].localizedString, NVGSDK_MAX_LENGTH, hl[i].nameTable[name].localizedString, NVGSDK_MAX_LENGTH); + } + } + + NVGSDK_Highlights_ConfigureAsync(g_sdk, params, &handleConfigured, params); + //! [ConfigureHighlights C] +} + +void __stdcall handleNotification(NVGSDK_NotificationType type, NVGSDK_Notification const* response, void* context) +{ + switch (type) + { + case NVGSDK_NOTIFICATION_PERMISSIONS_CHANGED: + handlePermissionChanged(response->permissionsChanged.scopePermissionTable, response->permissionsChanged.scopePermissionTableSize); + break; + case NVGSDK_NOTIFICATION_OVERLAY_STATE_CHANGED: + { + size_t endOfStr = 0; + switch (response->overlayStateChanged.state) + { + case NVGSDK_OVERLAY_STATE_MAIN: endOfStr += swprintf(g_overlayStateStr, NVGSDK_MAX_LENGTH, L"%hs", "Main Overlay Window"); break; + case NVGSDK_OVERLAY_STATE_PERMISSION: endOfStr += swprintf(g_overlayStateStr, NVGSDK_MAX_LENGTH, L"%hs", "Permission Overlay Window"); break; + case NVGSDK_OVERLAY_STATE_HIGHLIGHTS_SUMMARY: endOfStr += swprintf(g_overlayStateStr, NVGSDK_MAX_LENGTH, L"%hs", "Highlights Summary Overlay Window"); break; + default: endOfStr += swprintf(g_overlayStateStr, NVGSDK_MAX_LENGTH, L"%hs", "Unknown Window"); break; + } + + swprintf(g_overlayStateStr + endOfStr, NVGSDK_MAX_LENGTH - endOfStr, L" %hs", response->overlayStateChanged.open ? "OPEN" : "CLOSED"); + break; + } + default: + LOG("Unknown notification type"); + break; + } +} + +void __stdcall handlePermissionChanged(NVGSDK_ScopePermission* scopePermissionTable, size_t size) +{ + NVGSDK_Permission permission = NVGSDK_PERMISSION_MUST_ASK; + for (size_t i = 0; i < size; ++i) + { + if (scopePermissionTable[i].scope == NVGSDK_SCOPE_HIGHLIGHTS_VIDEO) + { + permission = scopePermissionTable[i].permission; + } + } + + switch (permission) + { + case NVGSDK_PERMISSION_MUST_ASK: swprintf(g_permissionStr, NVGSDK_MAX_LENGTH, L"%hs", "Must Ask"); break; + case NVGSDK_PERMISSION_GRANTED: swprintf(g_permissionStr, NVGSDK_MAX_LENGTH, L"%hs", "Granted"); break; + case NVGSDK_PERMISSION_DENIED: swprintf(g_permissionStr, NVGSDK_MAX_LENGTH, L"%hs", "Denied"); break; + default: swprintf(g_permissionStr, NVGSDK_MAX_LENGTH, L"%hs", "Unknown"); break; + } +} + +void __stdcall handleGenericResponse(NVGSDK_RetCode rc, void* context) +{ + updateResultString(rc); +} + +void updateResultString(NVGSDK_RetCode rc) +{ + swprintf(g_lastResult, NVGSDK_MAX_LENGTH, L"%hs", NVGSDK_RetCodeToString(rc)); +} diff --git a/samples/DX_APIUsage/GfeSDKWrapper.cpp b/samples/DX_APIUsage/GfeSDKWrapper.cpp new file mode 100644 index 0000000..33a4a63 --- /dev/null +++ b/samples/DX_APIUsage/GfeSDKWrapper.cpp @@ -0,0 +1,383 @@ +/* Copyright (c) 2018, 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. +*/ +/*! +* \file +* Shows example usage of the GfeSDK C++ API by a directX application. +*/ + +#include + +#include "GfeSDKWrapper.hpp" + +#include + +char g_logBuffer[512]; +void dbgprint(const char *fmt, ...) { + va_list args; + va_start(args, fmt); + vsprintf_s(g_logBuffer, sizeof(g_logBuffer) / sizeof(g_logBuffer[0]), fmt, args); + printf(g_logBuffer); + printf("\n"); + OutputDebugStringA(g_logBuffer); + OutputDebugStringA("\n"); + va_end(args); +} +#define LOG(fmt, ...) dbgprint(fmt, __VA_ARGS__) + +static std::wstring permissionToStringW(GfeSDK::NVGSDK_Permission p) +{ + switch (p) + { + case GfeSDK::NVGSDK_PERMISSION_MUST_ASK: return L"Must Ask"; + case GfeSDK::NVGSDK_PERMISSION_GRANTED: return L"Granted"; + case GfeSDK::NVGSDK_PERMISSION_DENIED: return L"Denied"; + default: + return L"UNKNOWN"; + } +} + +GfeSdkWrapper::GfeSdkWrapper() : + m_currentPermission(permissionToStringW(GfeSDK::NVGSDK_PERMISSION_MUST_ASK)) +{ +} + +void GfeSdkWrapper::Init(char const* gameName, char const* defaultLocale, GfeSDK::NVGSDK_Highlight* highlights, size_t numHighlights) +{ + using namespace std::placeholders; + + //! [Creation CPP] + GfeSDK::CreateInputParams createParams; + createParams.appName = "gfesdk_dx_sample"; // appName will only be used/visible if GFE cannot identify your game + createParams.pollForCallbacks = true; // We will poll for callbacks in order to execute callbacks from game loop + createParams.requiredScopes = { + GfeSDK::NVGSDK_SCOPE_HIGHLIGHTS, + GfeSDK::NVGSDK_SCOPE_HIGHLIGHTS_VIDEO, + GfeSDK::NVGSDK_SCOPE_HIGHLIGHTS_SCREENSHOT + }; + createParams.notificationCallback = std::bind(&GfeSdkWrapper::OnNotification, this, _1, _2); + + GfeSDK::CreateResponse response; + GfeSDK::Core* gfesdkCore = GfeSDK::Core::Create(createParams, response); + if (GfeSDK::NVGSDK_SUCCEEDED(response.returnCode)) + { + // Valid handle has been returned + LOG("Success: %s", GfeSDK::NVGSDK_RetCodeToString(response.returnCode)); + LOG("PC is running GFE version %s", response.nvidiaGfeVersion.c_str()); + LOG("PC is running GfeSDK version %d.%d", response.versionMajor, response.versionMinor); + switch (response.returnCode) + { + case GfeSDK::NVGSDK_SUCCESS_VERSION_OLD_GFE: + LOG("Compatible, but the user should update to the latest version of GFE."); + break; + case GfeSDK::NVGSDK_SUCCESS_VERSION_OLD_SDK: + LOG("Compatible, but this application should update to a more recent GfeSDK to get latest features/bugfixes"); + break; + } + } + else + { + // No valid handle + LOG("Failure: %s", GfeSDK::NVGSDK_RetCodeToString(response.returnCode)); + switch (response.returnCode) + { + case GfeSDK::NVGSDK_ERR_SDK_VERSION: + LOG("This version of the SDK is too old to communicate with the user's SDK. We're never planning on this happening."); + LOG("PC is running GFE version %s", response.nvidiaGfeVersion.c_str()); + LOG("PC is running GfeSDK version %d.%d", response.versionMajor, response.versionMinor); + break; + case GfeSDK::NVGSDK_SUCCESS_VERSION_OLD_SDK: + LOG("The installed version of GFE is too old to continue. User must upgrade."); + LOG("PC is running GFE version %s", response.nvidiaGfeVersion.c_str()); + LOG("PC is running GfeSDK version %d.%d", response.versionMajor, response.versionMinor); + break; + } + return; + } + //! [Creation CPP] + + m_gfesdk.reset(gfesdkCore); + UpdateLastResultString(response.returnCode); + + if (response.scopePermissions.find(GfeSDK::NVGSDK_SCOPE_HIGHLIGHTS_VIDEO) != response.scopePermissions.end()) + { + m_currentPermission = permissionToStringW(response.scopePermissions[GfeSDK::NVGSDK_SCOPE_HIGHLIGHTS_VIDEO]); + } + + //! [Permissions CPP] + // Request Permissions if user hasn't decided yet + GfeSDK::RequestPermissionsParams requestPermissionsParams; + + // 'response' came from create call. It tells us which permissions we requested during Create, + // but the user hasn't yet made a decision on + for (auto&& entry : response.scopePermissions) + { + if (entry.second == GfeSDK::NVGSDK_PERMISSION_MUST_ASK) + { + requestPermissionsParams.scopes.push_back(entry.first); + } + } + + if (!requestPermissionsParams.scopes.empty()) + { + // If the user hasn't given permission for recording yet, ask them to do so now via overlay + m_gfesdk->RequestPermissionsAsync(requestPermissionsParams, [this, defaultLocale, highlights, numHighlights](GfeSDK::NVGSDK_RetCode rc, void* cbContext) { + UpdateLastResultString(rc); + if (GfeSDK::NVGSDK_SUCCEEDED(rc)) + { + ConfigureHighlights(defaultLocale, highlights, numHighlights); + } + }); + } + else + { + // Otherwise, go ahead and set up now + ConfigureHighlights(defaultLocale, highlights, numHighlights); + } + //! [Permissions CPP] +} + +void GfeSdkWrapper::DeInit() +{ + // Releasing from smart pointer just to document how to delete handle + GfeSDK::Core* gfesdkCore = m_gfesdk.release(); + + //! [Release CPP] + delete gfesdkCore; + //! [Release CPP] +} + +void GfeSdkWrapper::OnTick(void) +{ + if (!m_gfesdk) return; + + // Poll for callbacks in order to execute these callbacks from the game update thread, + // not a third party thead owned by GfeSDK. This lets us update game state from the callbacks + // without causing a threading problem + m_gfesdk->Poll(); +} + +void GfeSdkWrapper::OnNotification(GfeSDK::NVGSDK_NotificationType type, GfeSDK::NotificationBase const& notification) +{ + switch (type) + { + case GfeSDK::NVGSDK_NOTIFICATION_PERMISSIONS_CHANGED: + { + GfeSDK::PermissionsChangedNotification const& n = static_cast(notification); + + auto hlPermission = n.scopePermissions.find(GfeSDK::NVGSDK_SCOPE_HIGHLIGHTS_VIDEO); + if (hlPermission != n.scopePermissions.end()) + { + m_currentPermission = permissionToStringW(hlPermission->second); + } + break; + } + case GfeSDK::NVGSDK_NOTIFICATION_OVERLAY_STATE_CHANGED: + { + GfeSDK::OverlayStateChangedNotification const& n = static_cast(notification); + + m_lastOverlayEvent.clear(); + switch (n.state) + { + case GfeSDK::NVGSDK_OVERLAY_STATE_MAIN: m_lastOverlayEvent += L"Main Overlay Window"; break; + case GfeSDK::NVGSDK_OVERLAY_STATE_PERMISSION: m_lastOverlayEvent += L"Permission Overlay Window"; break; + case GfeSDK::NVGSDK_OVERLAY_STATE_HIGHLIGHTS_SUMMARY: m_lastOverlayEvent += L"Highlights Summary Overlay Window"; break; + default: + m_lastOverlayEvent += L"UNKNOWNWindow"; + } + m_lastOverlayEvent += (n.open ? L" OPEN" : L" CLOSE"); + break; + } + } +} + +void GfeSdkWrapper::OnOpenGroup(std::string const& id) +{ + if (!m_highlights) return; + + //! [OpenGroup CPP] + GfeSDK::HighlightOpenGroupParams params; + params.groupId = id; + params.groupDescriptionLocaleTable["en-US"] = id; + m_highlights->OpenGroupAsync(params, [this](GfeSDK::NVGSDK_RetCode rc, void*) { + UpdateLastResultString(rc); + }); + //! [OpenGroup CPP] +} + +void GfeSdkWrapper::OnCloseGroup(std::string const& id, bool destroy) +{ + if (!m_highlights) return; + + //! [CloseGroup CPP] + GfeSDK::HighlightCloseGroupParams params; + params.groupId = id; + params.destroyHighlights = destroy; + m_highlights->CloseGroupAsync(params, [this](GfeSDK::NVGSDK_RetCode rc, void*) { + UpdateLastResultString(rc); + }); + //! [CloseGroup CPP] + +#ifdef DOXYGEN + //! [Async Call No Callback] + // If the caller doesn't care about the return value, no need to pass callbacks + GfeSDK::HighlightCloseGroupParams params = { "GROUP_1" }; + m_highlights->CloseGroupAsync(params); + //! [Async Call No Callback] +#endif +} + +void GfeSdkWrapper::OnSaveScreenshot(std::string const& highlightId, std::string const& groupId) +{ + GfeSDK::ScreenshotHighlightParams params; + params.groupId = groupId; + params.highlightId = highlightId; + m_highlights->SetScreenshotHighlightAsync(params, [this](GfeSDK::NVGSDK_RetCode rc, void*) { + UpdateLastResultString(rc); + }); +} + +void GfeSdkWrapper::OnSaveVideo(std::string const& highlightId, std::string const& groupId, int startDelta, int endDelta) +{ + //! [SaveVideo CPP] + GfeSDK::VideoHighlightParams params; + params.startDelta = startDelta; + params.endDelta = endDelta; + params.groupId = groupId; + params.highlightId = highlightId; + m_highlights->SetVideoHighlightAsync(params, [this](GfeSDK::NVGSDK_RetCode rc, void*) { + UpdateLastResultString(rc); + }); + //! [SaveVideo CPP] +} + +void GfeSdkWrapper::OnGetNumHighlights(std::string const& groupId, GfeSDK::NVGSDK_HighlightSignificance sigFilter, GfeSDK::NVGSDK_HighlightType tagFilter) +{ + GfeSDK::GroupView v; + v.groupId = groupId; + v.significanceFilter = sigFilter; + v.tagsFilter = tagFilter; + + m_highlights->GetNumberOfHighlightsAsync(v, [this](GfeSDK::NVGSDK_RetCode rc, GfeSDK::GetNumberOfHighlightsResponse const* response, void*) { + UpdateLastResultString(rc); + if (GfeSDK::NVGSDK_SUCCEEDED(rc)) + { + m_lastQueryResult = std::to_wstring(response->numHighlights); + } + }); +} + +void GfeSdkWrapper::OnOpenSummary(char const* groupIds[], size_t numGroups, GfeSDK::NVGSDK_HighlightSignificance sigFilter, GfeSDK::NVGSDK_HighlightType tagFilter) +{ + //! [OpenSummary CPP] + GfeSDK::SummaryParams params; + + // Can show more than one group at a time, each with their own filters if desired + for (size_t i = 0; i < numGroups; ++i) + { + GfeSDK::GroupView v; + v.groupId = groupIds[i]; + v.significanceFilter = sigFilter; + v.tagsFilter = tagFilter; + params.groupViews.push_back(v); + } + + m_highlights->OpenSummaryAsync(params, [this](GfeSDK::NVGSDK_RetCode rc, void*) { + UpdateLastResultString(rc); + }); + //! [OpenSummary CPP] +} + +void GfeSdkWrapper::OnRequestLanguage(void) +{ + //! [Asynchonous Call] + // We are passing two arguments to this function, the function lambda, and a user context. In this case, we're passing + // the 'this' pointer as the user context. This gets passed through unmodified for use in the callback function. + m_gfesdk->GetUILanguageAsync([this](GfeSDK::NVGSDK_RetCode rc, GfeSDK::GetUILanguageResponse const* response, void* context) { + // Passed this pointer through as context + GfeSdkWrapper* thiz = reinterpret_cast(context); + + UpdateLastResultString(rc); + if (GfeSDK::NVGSDK_SUCCEEDED(rc)) + { + m_lastQueryResult = m_converter.from_bytes(response->cultureCode); + } + }, this); + //! [Asynchonous Call] +} + +void GfeSdkWrapper::OnRequestUserSettings(void) +{ + m_highlights->GetUserSettingsAsync([this](GfeSDK::NVGSDK_RetCode rc, GfeSDK::GetUserSettingsResponse const* response, void*) { + UpdateLastResultString(rc); + m_lastQueryResult = L""; + if (GfeSDK::NVGSDK_SUCCEEDED(rc)) + { + for (auto it = response->highlightSettings.begin(); it != response->highlightSettings.end(); ++it) + { + m_lastQueryResult += L"\n" + m_converter.from_bytes(it->highlightId) + (it->enabled ? L": ON" : L": OFF"); + } + } + }); +} + +wchar_t const* GfeSdkWrapper::GetCurrentPermissionStr(void) +{ + return m_currentPermission.c_str(); +} + +wchar_t const* GfeSdkWrapper::GetLastOverlayEvent(void) +{ + return m_lastOverlayEvent.c_str(); +} + +wchar_t const* GfeSdkWrapper::GetLastResult(void) +{ + return m_lastResult.c_str(); +} + +wchar_t const* GfeSdkWrapper::GetLastQueryResult(void) +{ + return m_lastQueryResult.c_str(); +} + +void GfeSdkWrapper::ConfigureHighlights(char const* defaultLocale, GfeSDK::NVGSDK_Highlight* highlights, size_t numHighlights) +{ + //! [ConfigureHighlights CPP] + // Create handle to highlights module + m_highlights.reset(GfeSDK::Highlights::Create(m_gfesdk.get())); + + GfeSDK::HighlightConfigParams configParams; + configParams.defaultLocale = defaultLocale; + + // Set up highlight definition table + for (size_t i = 0; i < numHighlights; ++i) + { + GfeSDK::HighlightDefinition highlightDef; + highlightDef.id = highlights[i].id; + highlightDef.userDefaultInterest = highlights[i].userInterest; + highlightDef.significance = highlights[i].significance; + highlightDef.highlightTags = highlights[i].highlightTags; + for (size_t j = 0; j < highlights[i].nameTableSize; ++j) + { + highlightDef.nameLocaleTable[highlights[i].nameTable[j].localeCode] = highlights[i].nameTable[j].localizedString; + } + + configParams.highlightDefinitions.push_back(highlightDef); + } + + m_highlights->ConfigureAsync(configParams, [this](GfeSDK::NVGSDK_RetCode rc, void*) { + UpdateLastResultString(rc); + }); + //! [ConfigureHighlights CPP] +} + +void GfeSdkWrapper::UpdateLastResultString(GfeSDK::NVGSDK_RetCode rc) +{ + m_lastResult = m_converter.from_bytes(GfeSDK::RetCodeToString(rc)); +} diff --git a/samples/DX_APIUsage/GfeSDKWrapper.h b/samples/DX_APIUsage/GfeSDKWrapper.h new file mode 100644 index 0000000..b6f5dfd --- /dev/null +++ b/samples/DX_APIUsage/GfeSDKWrapper.h @@ -0,0 +1,44 @@ +/* Copyright (c) 2018, 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. +*/ + +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include + + +typedef struct _GfeSdkWrapper +{ + void(*Init)(char const* gameName, char const* defaultLocale, NVGSDK_Highlight* highlights, size_t numHighlights); + void(*DeInit)(); + void(*OnTick)(); + void(*OnOpenGroup)(char const* groupId); + void(*OnCloseGroup)(char const* groupId, bool destroy); + void(*OnSaveScreenshot)(char const* highlightId, char const* groupId); + void(*OnSaveVideo)(char const* highlightId, char const* groupId, int startDelta, int endDelta); + void(*OnGetNumHighlights)(char const* groupId, int sigFilter, int tagFilter); + void(*OnOpenSummary)(char const* groupIds[], size_t numGroups, int sigFilter, int tagFiler); + void(*OnRequestLanguage)(); + void(*OnRequestUserSettings)(); + + wchar_t const* (*GetCurrentPermissionStr)(); + wchar_t const* (*GetLastOverlayEvent)(); + wchar_t const* (*GetLastResult)(); + wchar_t const* (*GetLastQueryResult)(); +} GfeSdkWrapper; + +void InitGfeSdkWrapper(GfeSdkWrapper* hl); + +#ifdef __cplusplus +} +#endif diff --git a/samples/DX_APIUsage/GfeSDKWrapper.hpp b/samples/DX_APIUsage/GfeSDKWrapper.hpp new file mode 100644 index 0000000..c9c50f2 --- /dev/null +++ b/samples/DX_APIUsage/GfeSDKWrapper.hpp @@ -0,0 +1,61 @@ +/* Copyright (c) 2018, 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. +*/ + +#pragma once + +#include +#include +#include + +#include +#include + +namespace Json +{ +class Value; +} + +class GfeSdkWrapper +{ +public: + GfeSdkWrapper(); + + void Init(char const* gameName, char const* defaultLocale, GfeSDK::NVGSDK_Highlight* highlights, size_t numHighlights); + void DeInit(); + void OnTick(void); + void OnNotification(GfeSDK::NVGSDK_NotificationType type, GfeSDK::NotificationBase const&); + void OnOpenGroup(std::string const& id); + void OnCloseGroup(std::string const& id, bool destroy = false); + void OnSaveScreenshot(std::string const& highlightId, std::string const& groupId); + void OnSaveVideo(std::string const& highlightId, std::string const& groupId, int startDelta, int endDelta); + void OnGetNumHighlights(std::string const& groupId, GfeSDK::NVGSDK_HighlightSignificance sigFilter, GfeSDK::NVGSDK_HighlightType tagFilter); + void OnOpenSummary(char const* groupIds[], size_t numGroups, GfeSDK::NVGSDK_HighlightSignificance sigFilter, GfeSDK::NVGSDK_HighlightType tagFilter); + void OnRequestLanguage(void); + void OnRequestUserSettings(void); + + wchar_t const* GetCurrentPermissionStr(void); + wchar_t const* GetLastOverlayEvent(void); + wchar_t const* GetLastResult(void); + wchar_t const* GetLastQueryResult(void); + +private: + void ConfigureHighlights(char const* defaultLocale, GfeSDK::NVGSDK_Highlight* highlights, size_t numHighlights); + void UpdateLastResultString(GfeSDK::NVGSDK_RetCode rc); + + std::unique_ptr m_gfesdk; + std::unique_ptr m_highlights; + + std::wstring_convert> m_converter; + std::wstring m_currentPermission; + std::wstring m_lastOverlayEvent; + std::wstring m_lastResult; + std::wstring m_lastQueryResult; +}; + +inline void InitGfeSdkWrapper(GfeSdkWrapper* hl) {} diff --git a/samples/DX_APIUsage/Main.cpp b/samples/DX_APIUsage/Main.cpp index 386b4db..803d799 100644 --- a/samples/DX_APIUsage/Main.cpp +++ b/samples/DX_APIUsage/Main.cpp @@ -18,14 +18,15 @@ #include #include #include +#include #include #include #ifdef GFESDKDEMO_BUILD_C -#include "GfeSDKHighlights.h" +#include "GfeSDKWrapper.h" #else -#include "GfeSDKHighlights.hpp" +#include "GfeSDKWrapper.hpp" using namespace GfeSDK; #endif @@ -119,7 +120,7 @@ struct HighlightsData std::vector highlights; }; -HighlightsWrapper g_highlights; +GfeSdkWrapper g_highlights; NVGSDK_HighlightSignificance g_sigFilter = NVGSDK_HIGHLIGHT_SIGNIFICANCE_NONE; NVGSDK_HighlightType g_tagFilter = NVGSDK_HIGHLIGHT_TYPE_NONE; std::wstring_convert> g_converter; @@ -127,6 +128,127 @@ HighlightsData g_highlightsConfig; char const* GROUP1_ID = "GROUP1"; char const* GROUP2_ID = "GROUP2"; + +class SettingsManager +{ +public: + + enum class BackgroundColor + { + Default, + Red, + Blue, + }; + + SettingsManager(const std::wstring& configPath) + : m_color(BackgroundColor::Default), + m_configPath(configPath) + { + LoadConfig(); + } + + std::array GetBackgroundColorArray() const + { + switch(m_color) + { + case BackgroundColor::Red: + return { 0.25f, 0.10f, 0.10f, 0.55f }; + case BackgroundColor::Blue: + return { 0.10f, 0.10f, 0.25f, 0.55f }; + case BackgroundColor::Default: + default: + return { 0.0f, 0.25f, 0.25f, 0.55f }; + } + } + + std::string GetBackgroundColorString() const + { + switch(m_color) + { + case BackgroundColor::Red: + return "Red"; + case BackgroundColor::Blue: + return "Blue"; + case BackgroundColor::Default: + default: + return "Default"; + } + } + + void ToggleBackgroundColor() + { + switch(m_color) + { + case BackgroundColor::Default: + m_color = BackgroundColor::Red; + break; + case BackgroundColor::Red: + m_color = BackgroundColor::Blue; + break; + case BackgroundColor::Blue: + m_color = BackgroundColor::Default; + break; + default: + m_color = BackgroundColor::Default; + } + + SaveConfig(); + } + + void SaveConfig() + { + Json::Value root; + root["Background"] = GetBackgroundColorString(); + + std::ofstream f(m_configPath); + if(!f.good()) + { + TRACE("Cannot open config file for saving!"); + return; + } + + f << root; + } + + void LoadConfig() + { + std::ifstream f(m_configPath); + if(!f.good()) + { + return; + } + + Json::Value root; + + std::string errs; + Json::CharReaderBuilder builder; + if(!Json::parseFromStream(builder, f, &root, &errs)) + { + TRACE("FAILED to read json file\n"); + return; + } + + m_color = BackgroundColorFromString(root["Background"].asString()); + } + +private: + + static BackgroundColor BackgroundColorFromString(const std::string& c) + { + if(c == "Red") return BackgroundColor::Red; + if(c == "Blue") return BackgroundColor::Blue; + if(c == "Default") return BackgroundColor::Default; + + return BackgroundColor::Default; + } + + const std::wstring m_configPath; + BackgroundColor m_color; +}; + +std::unique_ptr g_settingsManager; + + AppState g_state = AppState::Init; //-------------------------------------------------------------------------------------- @@ -202,6 +324,11 @@ void ToggleTagBit(NVGSDK_HighlightType bit) g_tagFilter = static_cast(g_tagFilter ^ bit); } +void HandleOpsNotification() +{ + g_settingsManager->LoadConfig(); +} + //-------------------------------------------------------------------------------------- // Initialize the app //-------------------------------------------------------------------------------------- @@ -220,23 +347,26 @@ void InitApp() g_HUD.SetCallback(OnGUIEvent); - InitHighlightsWrapper(&g_highlights); + InitGfeSdkWrapper(&g_highlights); // Find the path to the executable - char path[MAX_PATH]; - GetModuleFileNameA(NULL, path, MAX_PATH); - PathRemoveFileSpecA(path); - std::string pathStr(path); + wchar_t path[MAX_PATH] = { 0 }; + GetModuleFileNameW(NULL, path, MAX_PATH); + PathRemoveFileSpecW(path); + const std::wstring pathStr(path); + g_settingsManager.reset(new SettingsManager(pathStr + L"/settings.json")); + + // Load highlights config Json::Value jsonHighlightsConfig; { - std::ifstream inFile(pathStr + "/highlights_config.json"); + std::ifstream inFile(pathStr + L"/highlights_config.json"); if (!inFile.good()) { - inFile = std::ifstream(pathStr + "/../highlights_config.json"); + inFile = std::ifstream(pathStr + L"/../highlights_config.json"); if (!inFile.good()) { - inFile = std::ifstream(pathStr + "/../../highlights_config.json"); + inFile = std::ifstream(pathStr + L"/../../highlights_config.json"); } } @@ -281,6 +411,7 @@ void InitApp() int iY = 10; int const PAD = 26; g_HUD.AddButtonCallback([]() {DXUTToggleFullScreen(); }, L"Toggle full screen", 0, iY, 170, 23); + g_HUD.AddButtonCallback([]() { g_settingsManager->ToggleBackgroundColor(); }, L"Toggle background color", 0, iY += PAD, 170, 23); g_HUD.AddButtonCallback([]() {g_highlights.OnRequestLanguage(); }, L"Get Overlay Language", 0, iY += PAD, 170, 23); g_HUD.AddButtonCallback([]() {g_highlights.OnRequestUserSettings(); }, L"Get User Settings", 0, iY += PAD, 170, 23); @@ -407,6 +538,9 @@ void RenderText() g_pTxtHelper->DrawTextLine( DXUTGetFrameStats( DXUTIsVsyncEnabled() ) ); g_pTxtHelper->DrawTextLine( DXUTGetDeviceStats() ); + // Settings + g_pTxtHelper->DrawFormattedTextLine(L"Background color: %S", g_settingsManager->GetBackgroundColorString().c_str()); + // Draw help if( g_bShowHelp ) { @@ -724,9 +858,8 @@ void CALLBACK OnD3D11FrameRender( ID3D11Device* pd3dDevice, ID3D11DeviceContext* case AppState::Main: { // Clear the render target and depth stencil - float ClearColor[4] = { 0.0f, 0.25f, 0.25f, 0.55f }; ID3D11RenderTargetView* pRTV = DXUTGetD3D11RenderTargetView(); - pd3dImmediateContext->ClearRenderTargetView(pRTV, ClearColor); + pd3dImmediateContext->ClearRenderTargetView(pRTV, g_settingsManager->GetBackgroundColorArray().data()); ID3D11DepthStencilView* pDSV = DXUTGetD3D11DepthStencilView(); pd3dImmediateContext->ClearDepthStencilView(pDSV, D3D11_CLEAR_DEPTH, 1.0, 0); -- cgit v1.2.3