Implement LockedWrapper.GetAnimationQueues

This commit is contained in:
2023-09-08 01:52:30 -04:00
parent ee0b37725e
commit d845eab6f5
4 changed files with 57 additions and 8 deletions

View File

@@ -1,9 +1,12 @@
#pragma once
namespace LuprexCommonTypes {
namespace CommonTypes {
// Array of tangible IDs.
using IdArray = TArray<int64>;
// View of Array of tangible IDs.
using IdView = TArrayView<const int64>;
}
// Array of std::string_view
using StringViewVec = TArray<std::string_view>;
}

View File

@@ -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;
}

View File

@@ -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<uint32> AQLenBuffer;
TArray<const char*> 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);
};

View File

@@ -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;