From 18b156ad44c2b3e776fed03ca9e5533738697685 Mon Sep 17 00:00:00 2001 From: Wojciech Figat Date: Wed, 26 Jan 2022 16:55:22 +0100 Subject: [PATCH] Fixes and tweaks --- Flax.sln.DotSettings | 1 + Source/Engine/Engine/Base/GameBase.cpp | 7 +- .../DirectX/DX12/GPUDeviceDX12.cpp | 8 +- .../DirectX/DX12/GPUDeviceDX12.h | 4 +- .../Engine/Platform/Base/StringUtilsBase.cpp | 6 ++ Source/Engine/Platform/GDK/GDKPlatform.cpp | 82 ++++++++++++++----- Source/Engine/Platform/GDK/GDKPlatform.h | 7 +- .../Engine/Platform/GDK/GDKPlatformSettings.h | 15 ++-- Source/Engine/Platform/StringUtils.h | 1 + 9 files changed, 94 insertions(+), 37 deletions(-) diff --git a/Flax.sln.DotSettings b/Flax.sln.DotSettings index 7ce410aa7..4c0ea9564 100644 --- a/Flax.sln.DotSettings +++ b/Flax.sln.DotSettings @@ -294,6 +294,7 @@ True True True + True True True True diff --git a/Source/Engine/Engine/Base/GameBase.cpp b/Source/Engine/Engine/Base/GameBase.cpp index 42bc866c5..ed87c19aa 100644 --- a/Source/Engine/Engine/Base/GameBase.cpp +++ b/Source/Engine/Engine/Base/GameBase.cpp @@ -52,17 +52,15 @@ int32 GameBase::LoadProduct() // Load build game header file { - int32 tmp; - Array data; - FileReadStream* stream = nullptr; - #if 1 // Open file + FileReadStream* stream = nullptr; stream = FileReadStream::Open(Globals::ProjectFolder / TEXT("Content/head")); if (stream == nullptr) goto LOAD_GAME_HEAD_FAILED; // Check header + int32 tmp; stream->ReadInt32(&tmp); if (tmp != ('x' + 'D') * 131) goto LOAD_GAME_HEAD_FAILED; @@ -73,6 +71,7 @@ int32 GameBase::LoadProduct() goto LOAD_GAME_HEAD_FAILED; // Load game primary data + Array data; stream->ReadArray(&data); if (data.Count() != 808 + sizeof(Guid)) goto LOAD_GAME_HEAD_FAILED; diff --git a/Source/Engine/GraphicsDevice/DirectX/DX12/GPUDeviceDX12.cpp b/Source/Engine/GraphicsDevice/DirectX/DX12/GPUDeviceDX12.cpp index af5fa5550..5aae0febf 100644 --- a/Source/Engine/GraphicsDevice/DirectX/DX12/GPUDeviceDX12.cpp +++ b/Source/Engine/GraphicsDevice/DirectX/DX12/GPUDeviceDX12.cpp @@ -251,8 +251,8 @@ bool GPUDeviceDX12::Init() updateFrameEvents(); #if PLATFORM_GDK - GDKPlatform::OnSuspend.Bind(this); - GDKPlatform::OnResume.Bind(this); + GDKPlatform::Suspended.Bind(this); + GDKPlatform::Resumed.Bind(this); #endif #else // Get DXGI adapter @@ -838,12 +838,12 @@ void GPUDeviceDX12::updateRes2Dispose() #if PLATFORM_XBOX_SCARLETT || PLATFORM_XBOX_ONE -void GPUDeviceDX12::OnSuspend() +void GPUDeviceDX12::OnSuspended() { _commandQueue->GetCommandQueue()->SuspendX(0); } -void GPUDeviceDX12::OnResume() +void GPUDeviceDX12::OnResumed() { _commandQueue->GetCommandQueue()->ResumeX(); diff --git a/Source/Engine/GraphicsDevice/DirectX/DX12/GPUDeviceDX12.h b/Source/Engine/GraphicsDevice/DirectX/DX12/GPUDeviceDX12.h index fdc86912d..f60f11c56 100644 --- a/Source/Engine/GraphicsDevice/DirectX/DX12/GPUDeviceDX12.h +++ b/Source/Engine/GraphicsDevice/DirectX/DX12/GPUDeviceDX12.h @@ -158,8 +158,8 @@ public: } #if PLATFORM_XBOX_SCARLETT ||PLATFORM_XBOX_ONE - void OnSuspend(); - void OnResume(); + void OnSuspended(); + void OnResumed(); #endif private: diff --git a/Source/Engine/Platform/Base/StringUtilsBase.cpp b/Source/Engine/Platform/Base/StringUtilsBase.cpp index 4cb340838..bf4f10149 100644 --- a/Source/Engine/Platform/Base/StringUtilsBase.cpp +++ b/Source/Engine/Platform/Base/StringUtilsBase.cpp @@ -406,6 +406,12 @@ bool StringUtils::Parse(const Char* str, float* result) return false; } +bool StringUtils::Parse(const char* str, float* result) +{ + *result = (float)atof(str); + return false; +} + String StringUtils::ToString(int32 value) { char buf[STRING_UTILS_ITOSTR_BUFFER_SIZE]; diff --git a/Source/Engine/Platform/GDK/GDKPlatform.cpp b/Source/Engine/Platform/GDK/GDKPlatform.cpp index 1a2cfe969..c259acd37 100644 --- a/Source/Engine/Platform/GDK/GDKPlatform.cpp +++ b/Source/Engine/Platform/GDK/GDKPlatform.cpp @@ -21,6 +21,10 @@ #include #include +#define GDK_LOG(result, method) \ + if (FAILED(result)) \ + LOG(Error, "GDK method {0} failed with result 0x{1:x}", TEXT(method), (uint32)result) + inline bool operator==(const APP_LOCAL_DEVICE_ID& l, const APP_LOCAL_DEVICE_ID& r) { return Platform::MemoryCompare(&l, &r, sizeof(APP_LOCAL_DEVICE_ID)) == 0; @@ -28,8 +32,8 @@ inline bool operator==(const APP_LOCAL_DEVICE_ID& l, const APP_LOCAL_DEVICE_ID& const Char* GDKPlatform::ApplicationWindowClass = TEXT("FlaxWindow"); void* GDKPlatform::Instance = nullptr; -Delegate<> GDKPlatform::OnSuspend; -Delegate<> GDKPlatform::OnResume; +Delegate<> GDKPlatform::Suspended; +Delegate<> GDKPlatform::Resumed; namespace { @@ -51,7 +55,7 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { LOG(Info, "Suspending application"); IsSuspended = true; - GDKPlatform::OnSuspend(); + GDKPlatform::Suspended(); // Complete deferral SetEvent(PlmSuspendComplete); @@ -60,7 +64,7 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) IsSuspended = false; LOG(Info, "Resuming application"); - GDKPlatform::OnResume(); + GDKPlatform::Resumed(); return DefWindowProc(hWnd, msg, wParam, lParam); } } @@ -93,6 +97,7 @@ void CALLBACK UserChangeEventCallback(_In_opt_ void* context, _In_ XUserLocalId if (user) { // Logout + LOG(Info, "GDK user '{0}' logged out", user->GetName()); OnPlatformUserRemove(user); } break; @@ -161,8 +166,9 @@ void OnMainWindowCreated(HWND hWnd) void CALLBACK AddUserComplete(_In_ XAsyncBlock* ab) { XUserHandle userHandle; - HRESULT hr = XUserAddResult(ab, &userHandle); - if (SUCCEEDED(hr)) + HRESULT result = XUserAddResult(ab, &userHandle); + delete ab; + if (SUCCEEDED(result)) { XUserLocalId userLocalId; XUserGetLocalId(userHandle, &userLocalId); @@ -173,12 +179,24 @@ void CALLBACK AddUserComplete(_In_ XAsyncBlock* ab) if (Platform::FindUser(localId) == nullptr) { // Login - auto user = New(userHandle, userLocalId, String::Empty); + char gamerTag[XUserGamertagComponentModernMaxBytes]; + size_t gamerTagSize; + XUserGetGamertag(userHandle, XUserGamertagComponent::Modern, ARRAY_COUNT(gamerTag), gamerTag, &gamerTagSize); + String name; + name.SetUTF8(gamerTag, StringUtils::Length(gamerTag)); + LOG(Info, "GDK user '{0}' logged in", name); + auto user = New(userHandle, userLocalId, name); OnPlatformUserAdd(user); } } - - delete ab; + else if (result == E_GAMEUSER_NO_DEFAULT_USER || result == E_GAMEUSER_RESOLVE_USER_ISSUE_REQUIRED || result == 0x8015DC12) + { + Platform::SignInWithUI(); + } + else + { + GDK_LOG(result, "XUserAddResult"); + } } DialogResult MessageBox::Show(Window* parent, const StringView& text, const StringView& caption, MessageBoxButtons buttons, MessageBoxIcon icon) @@ -312,6 +330,32 @@ bool GDKPlatform::IsRunningOnDevKit() return deviceType == XSystemDeviceType::XboxOneXDevkit || deviceType == XSystemDeviceType::XboxScarlettDevkit; } +void GDKPlatform::SignInSilently() +{ + auto asyncBlock = new XAsyncBlock(); + asyncBlock->queue = TaskQueue; + asyncBlock->callback = AddUserComplete; + HRESULT result = XUserAddAsync(XUserAddOptions::AddDefaultUserSilently, asyncBlock); + if (FAILED(result)) + { + GDK_LOG(result, "XUserAddAsync"); + delete asyncBlock; + } +} + +void GDKPlatform::SignInWithUI() +{ + auto ab = new XAsyncBlock(); + ab->queue = TaskQueue; + ab->callback = AddUserComplete; + HRESULT result = XUserAddAsync(XUserAddOptions::AllowGuests, ab); + if (FAILED(result)) + { + GDK_LOG(result, "XUserAddAsync"); + delete ab; + } +} + User* GDKPlatform::FindUser(const XUserLocalId& id) { User* result = nullptr; @@ -366,29 +410,27 @@ bool GDKPlatform::Init() &UserDeviceAssociationChangedCallbackToken ); - // Login the default user - { - auto asyncBlock = new XAsyncBlock(); - asyncBlock->queue = TaskQueue; - asyncBlock->callback = AddUserComplete; - HRESULT hr = XUserAddAsync(XUserAddOptions::AddDefaultUserAllowingUI, asyncBlock); - if (FAILED(hr)) - delete asyncBlock; - } - GDKInput::Init(); return false; } -void GDKPlatform::BeforeRun() +void GDKPlatform::LogInfo() { + Win32Platform::LogInfo(); + // Log system info const XSystemAnalyticsInfo analyticsInfo = XSystemGetAnalyticsInfo(); LOG(Info, "{0}, {1}", StringAsUTF16<64>(analyticsInfo.family).Get(), StringAsUTF16<64>(analyticsInfo.form).Get()); LOG(Info, "OS Version {0}.{1}.{2}.{3}", analyticsInfo.osVersion.major, analyticsInfo.osVersion.minor, analyticsInfo.osVersion.build, analyticsInfo.osVersion.revision); } +void GDKPlatform::BeforeRun() +{ + // Login the default user + SignInSilently(); +} + void GDKPlatform::Tick() { PROFILE_CPU_NAMED("Application.Tick"); diff --git a/Source/Engine/Platform/GDK/GDKPlatform.h b/Source/Engine/Platform/GDK/GDKPlatform.h index 818b1874a..97298fc55 100644 --- a/Source/Engine/Platform/GDK/GDKPlatform.h +++ b/Source/Engine/Platform/GDK/GDKPlatform.h @@ -23,8 +23,8 @@ public: /// static void* Instance; - static Delegate<> OnSuspend; - static Delegate<> OnResume; + static Delegate<> Suspended; + static Delegate<> Resumed; public: @@ -44,12 +44,15 @@ public: static bool IsRunningOnDevKit(); + static void SignInSilently(); + static void SignInWithUI(); static User* FindUser(const struct XUserLocalId& id); public: // [Win32Platform] static bool Init(); + static void LogInfo(); static void BeforeRun(); static void Tick(); static void BeforeExit(); diff --git a/Source/Engine/Platform/GDK/GDKPlatformSettings.h b/Source/Engine/Platform/GDK/GDKPlatformSettings.h index f59c5b2c4..dd0429a5c 100644 --- a/Source/Engine/Platform/GDK/GDKPlatformSettings.h +++ b/Source/Engine/Platform/GDK/GDKPlatformSettings.h @@ -15,9 +15,8 @@ class Texture; /// API_CLASS(Namespace="FlaxEditor.Content.Settings") class FLAXENGINE_API GDKPlatformSettings : public SettingsBase { -DECLARE_SCRIPTING_TYPE_MINIMAL(GDKPlatformSettings); + DECLARE_SCRIPTING_TYPE_MINIMAL(GDKPlatformSettings); public: - /// /// Game identity name stored in game package manifest (for store). If empty the product name will be used from Game Settings. /// @@ -96,6 +95,12 @@ public: API_FIELD(Attributes="EditorOrder(320), EditorDisplay(\"Xbox Live\")") bool RequiresXboxLive = false; + /// + /// Service Configuration ID (see Xbox Live docs). + /// + API_FIELD(Attributes="EditorOrder(330), EditorDisplay(\"Xbox Live\")") + StringAnsi SCID; + /// /// Specifies if the Game DVR system component is enabled or not. /// @@ -106,16 +111,15 @@ public: /// Specifies if broadcasting the title should be blocked or allowed. /// API_FIELD(Attributes="EditorOrder(410), EditorDisplay(\"Media Capture\")") - bool BlockBroadcast = false; + bool BlockBroadcast = false; /// /// Specifies if Game DVR of the title should be blocked or allowed. /// API_FIELD(Attributes="EditorOrder(420), EditorDisplay(\"Media Capture\")") - bool BlockGameDVR = false; + bool BlockGameDVR = false; public: - // [SettingsBase] void Deserialize(DeserializeStream& stream, ISerializeModifier* modifier) override { @@ -131,6 +135,7 @@ public: DESERIALIZE(TitleId); DESERIALIZE(StoreId); DESERIALIZE(RequiresXboxLive); + DESERIALIZE(SCID); DESERIALIZE(GameDVRSystemComponent); DESERIALIZE(BlockBroadcast); DESERIALIZE(BlockGameDVR); diff --git a/Source/Engine/Platform/StringUtils.h b/Source/Engine/Platform/StringUtils.h index 7dfffc4e9..f2efa9a5d 100644 --- a/Source/Engine/Platform/StringUtils.h +++ b/Source/Engine/Platform/StringUtils.h @@ -428,6 +428,7 @@ public: // @return Result value // @returns True if cannot convert data, otherwise false static bool Parse(const Char* str, float* result); + static bool Parse(const char* str, float* result); public: