2026-02-14 02:14:19 -05:00
|
|
|
////////////////////////////////////////////////////////////
|
|
|
|
|
//
|
|
|
|
|
// LockedWrapper.h
|
|
|
|
|
//
|
|
|
|
|
// Mutex-guarded access to the EngineWrapper.
|
|
|
|
|
//
|
|
|
|
|
////////////////////////////////////////////////////////////
|
|
|
|
|
|
2023-09-03 02:01:32 -04:00
|
|
|
#pragma once
|
|
|
|
|
|
|
|
|
|
#include "CoreMinimal.h"
|
2023-09-07 03:57:29 -04:00
|
|
|
#include "lpx-enginewrapper.hpp"
|
2026-02-09 13:54:00 -05:00
|
|
|
#include "Common.h"
|
2023-09-03 02:01:32 -04:00
|
|
|
|
2026-02-14 02:14:19 -05:00
|
|
|
////////////////////////////////////////////////////////////
|
|
|
|
|
//
|
|
|
|
|
// FlxLockableWrapper
|
|
|
|
|
//
|
2023-09-03 02:01:32 -04:00
|
|
|
// Contains the EngineWrapper and a Mutex to lock it.
|
2026-02-14 02:14:19 -05:00
|
|
|
// This class has no methods. To access the
|
|
|
|
|
// EngineWrapper, construct a FlxLockedWrapper.
|
2023-09-03 02:01:32 -04:00
|
|
|
//
|
2026-02-14 02:14:19 -05:00
|
|
|
////////////////////////////////////////////////////////////
|
|
|
|
|
|
2023-09-15 13:28:18 -04:00
|
|
|
class FlxLockableWrapper {
|
2023-09-03 02:01:32 -04:00
|
|
|
private:
|
|
|
|
|
FCriticalSection Mutex;
|
|
|
|
|
EngineWrapper Wrapper;
|
2023-09-08 01:52:30 -04:00
|
|
|
|
2026-02-14 02:14:19 -05:00
|
|
|
// Temporary buffers used only inside wrapper
|
|
|
|
|
// methods. Nothing persistent in these.
|
2023-09-08 01:52:30 -04:00
|
|
|
//
|
|
|
|
|
TArray<uint32> AQLenBuffer;
|
|
|
|
|
TArray<const char*> AQStrBuffer;
|
2026-02-14 02:14:19 -05:00
|
|
|
|
2023-09-03 02:01:32 -04:00
|
|
|
public:
|
2023-09-15 13:28:18 -04:00
|
|
|
friend class FlxLockedWrapper;
|
2023-09-03 02:01:32 -04:00
|
|
|
};
|
|
|
|
|
|
2026-02-14 02:14:19 -05:00
|
|
|
////////////////////////////////////////////////////////////
|
|
|
|
|
//
|
|
|
|
|
// FlxLockedWrapper
|
|
|
|
|
//
|
|
|
|
|
// RAII lock guard. The constructor claims the mutex,
|
|
|
|
|
// the destructor releases it. Use operator-> to
|
|
|
|
|
// access the EngineWrapper.
|
|
|
|
|
//
|
|
|
|
|
////////////////////////////////////////////////////////////
|
|
|
|
|
|
2023-09-15 13:28:18 -04:00
|
|
|
class FlxLockedWrapper {
|
2023-09-03 02:01:32 -04:00
|
|
|
private:
|
2023-09-15 13:28:18 -04:00
|
|
|
FlxLockableWrapper& Lockable;
|
2023-09-03 02:01:32 -04:00
|
|
|
|
2026-02-14 02:14:19 -05:00
|
|
|
// Called by luprex to output debugging messages.
|
|
|
|
|
// A thin wrapper around UE_LOG.
|
2025-03-28 23:31:44 -04:00
|
|
|
//
|
|
|
|
|
static void DPrintHook(const char *Msg, size_t Size);
|
|
|
|
|
|
2023-09-07 23:50:49 -04:00
|
|
|
public:
|
2026-02-14 02:14:19 -05:00
|
|
|
// Import these types into our namespace.
|
|
|
|
|
//
|
2026-02-09 13:54:00 -05:00
|
|
|
using IdArray = LpxCommonTypes::IdArray;
|
|
|
|
|
using IdView = LpxCommonTypes::IdView;
|
|
|
|
|
using StringViewVec = LpxCommonTypes::StringViewVec;
|
2025-03-28 23:31:44 -04:00
|
|
|
|
2023-09-03 02:01:32 -04:00
|
|
|
public:
|
2026-02-14 02:14:19 -05:00
|
|
|
// The constructor claims the mutex.
|
|
|
|
|
//
|
2023-09-15 13:28:18 -04:00
|
|
|
FlxLockedWrapper(FlxLockableWrapper& w) : Lockable(w) {
|
2023-09-03 02:01:32 -04:00
|
|
|
Lockable.Mutex.Lock();
|
|
|
|
|
}
|
|
|
|
|
|
2026-02-14 02:14:19 -05:00
|
|
|
// The destructor releases the mutex.
|
|
|
|
|
//
|
2023-09-15 13:28:18 -04:00
|
|
|
~FlxLockedWrapper() {
|
2023-09-03 02:01:32 -04:00
|
|
|
Lockable.Mutex.Unlock();
|
|
|
|
|
}
|
|
|
|
|
|
2026-02-14 02:14:19 -05:00
|
|
|
// Operator-> accesses the EngineWrapper.
|
|
|
|
|
//
|
2023-09-03 02:01:32 -04:00
|
|
|
EngineWrapper* operator ->() {
|
|
|
|
|
return &Lockable.Wrapper;
|
|
|
|
|
}
|
|
|
|
|
|
2026-02-14 02:14:19 -05:00
|
|
|
// Get a pointer to the EngineWrapper. Not very
|
|
|
|
|
// safe because you could keep the pointer after
|
|
|
|
|
// the LockedWrapper is destroyed. Don't do that.
|
|
|
|
|
//
|
2023-09-03 02:01:32 -04:00
|
|
|
EngineWrapper* Get() {
|
|
|
|
|
return &Lockable.Wrapper;
|
|
|
|
|
}
|
2023-09-05 03:20:11 -04:00
|
|
|
|
2026-02-14 02:14:19 -05:00
|
|
|
// Initialize the engine wrapper if it's not
|
|
|
|
|
// already. All this does is open the DLL and
|
|
|
|
|
// hook up all the function pointers in the
|
|
|
|
|
// wrapper to point into the DLL.
|
2023-09-05 03:20:11 -04:00
|
|
|
//
|
|
|
|
|
void InitWrapper();
|
|
|
|
|
|
|
|
|
|
// Fetch Stdout as a string.
|
|
|
|
|
//
|
|
|
|
|
FString FetchStdout();
|
2023-09-06 23:25:37 -04:00
|
|
|
|
|
|
|
|
// Get the current Actor ID.
|
|
|
|
|
//
|
|
|
|
|
int64 GetActor();
|
|
|
|
|
|
|
|
|
|
// Get the list of tangibles near the actor.
|
|
|
|
|
//
|
2026-02-14 02:14:19 -05:00
|
|
|
// This function is fast but not free. You should
|
|
|
|
|
// fetch this once per frame and then store the
|
|
|
|
|
// IdView somewhere (like in the TangibleManager).
|
2023-09-06 23:25:37 -04:00
|
|
|
//
|
2023-09-07 23:50:49 -04:00
|
|
|
IdView GetNear(int64 id, double rx, double ry, double rz);
|
2023-09-08 01:52:30 -04:00
|
|
|
|
|
|
|
|
// Get animation queues.
|
|
|
|
|
//
|
|
|
|
|
// The array returned by this is valid until the
|
|
|
|
|
// next time you call this.
|
|
|
|
|
//
|
|
|
|
|
StringViewVec GetAnimationQueues(IdView ids);
|
2023-09-03 02:01:32 -04:00
|
|
|
};
|