From d845eab6f5ddb0f5e607626ebb3b55af73b43588 Mon Sep 17 00:00:00 2001 From: jyelon Date: Fri, 8 Sep 2023 01:52:30 -0400 Subject: [PATCH] Implement LockedWrapper.GetAnimationQueues --- Source/Integration/CommonTypes.h | 7 ++++-- Source/Integration/LockedWrapper.cpp | 32 +++++++++++++++++++++++++++- Source/Integration/LockedWrapper.h | 22 ++++++++++++++++--- Source/Integration/TangibleManager.h | 4 ++-- 4 files changed, 57 insertions(+), 8 deletions(-) diff --git a/Source/Integration/CommonTypes.h b/Source/Integration/CommonTypes.h index 2c7243a5..9db13b00 100644 --- a/Source/Integration/CommonTypes.h +++ b/Source/Integration/CommonTypes.h @@ -1,9 +1,12 @@ #pragma once -namespace LuprexCommonTypes { +namespace CommonTypes { // Array of tangible IDs. using IdArray = TArray; // View of Array of tangible IDs. using IdView = TArrayView; -} \ No newline at end of file + + // Array of std::string_view + using StringViewVec = TArray; +} diff --git a/Source/Integration/LockedWrapper.cpp b/Source/Integration/LockedWrapper.cpp index 793562d9..518e7fad 100644 --- a/Source/Integration/LockedWrapper.cpp +++ b/Source/Integration/LockedWrapper.cpp @@ -3,6 +3,8 @@ #include "DebugPrint.h" #include "lpx-drvutil.hpp" +using namespace CommonTypes; + void FLockedWrapper::InitWrapper() { if (Lockable.Wrapper.play_initialize != nullptr) { // Already initialized. @@ -38,9 +40,37 @@ int64 FLockedWrapper::GetActor() { return Lockable.Wrapper.get_actor_id(Get()); } -FLockedWrapper::IdView FLockedWrapper::GetNear(int64 id, double rx, double ry, double rz) { +IdView FLockedWrapper::GetNear(int64 id, double rx, double ry, double rz) { uint32 size; int64* data; Lockable.Wrapper.get_tangibles_near(Get(), id, rx, ry, rz, &size, &data); return IdView(data, size); } + +StringViewVec FLockedWrapper::GetAnimationQueues(IdView ids) { + // How many animation queues are we fetching? + int num = ids.Num(); + + // Enlarge the static buffers if necessary. + // Add a little extra space so we don't have to enlarge + // the buffers every time we get a new tangible. + if (num > Lockable.AQLenBuffer.Num()) { + Lockable.AQLenBuffer.SetNum(num + 1000); + Lockable.AQStrBuffer.SetNum(num + 1000); + } + + // Get pointers to the static buffers. + uint32* LenBuf = Lockable.AQLenBuffer.GetData(); + const char** StrBuf = Lockable.AQStrBuffer.GetData(); + + // Get the animation queues into the static buffers. + Lockable.Wrapper.get_animation_queues(Get(), num, ids.GetData(), LenBuf, StrBuf); + + // Transfer data from static buffers into an array of string_view + StringViewVec result; + result.SetNum(num); + for (int i = 0; i < num; i++) { + result[i] = std::string_view(StrBuf[i], LenBuf[i]); + } + return result; +} \ No newline at end of file diff --git a/Source/Integration/LockedWrapper.h b/Source/Integration/LockedWrapper.h index e3762234..3b1a7856 100644 --- a/Source/Integration/LockedWrapper.h +++ b/Source/Integration/LockedWrapper.h @@ -15,6 +15,14 @@ class FLockableWrapper { private: FCriticalSection Mutex; EngineWrapper Wrapper; + + // Temporary buffers. These are only used + // inside wrapper methods. There's nothing + // persistent in these. + // + TArray AQLenBuffer; + TArray AQStrBuffer; + public: friend class FLockedWrapper; }; @@ -24,9 +32,10 @@ private: FLockableWrapper& Lockable; public: - // Import these types into our Namespace. - using IdArray = LuprexCommonTypes::IdArray; - using IdView = LuprexCommonTypes::IdView; + // Import these types into our Namespace. + using IdArray = CommonTypes::IdArray; + using IdView = CommonTypes::IdView; + using StringViewVec = CommonTypes::StringViewVec; public: // The constructor of the FLockedWrapper claims the mutex. @@ -74,4 +83,11 @@ public: // in the TangibleManager, for example). // IdView GetNear(int64 id, double rx, double ry, double rz); + + // Get animation queues. + // + // The array returned by this is valid until the + // next time you call this. + // + StringViewVec GetAnimationQueues(IdView ids); }; diff --git a/Source/Integration/TangibleManager.h b/Source/Integration/TangibleManager.h index 430db3d9..876204c0 100644 --- a/Source/Integration/TangibleManager.h +++ b/Source/Integration/TangibleManager.h @@ -16,8 +16,8 @@ struct INTEGRATION_API FTangibleManager GENERATED_BODY() public: // Import these types into our Namespace. - using IdArray = LuprexCommonTypes::IdArray; - using IdView = LuprexCommonTypes::IdView; + using IdArray = CommonTypes::IdArray; + using IdView = CommonTypes::IdView; // A pointer to the UWorld. UWorld* World;