Files
FunnyGirl/Plugins/VRM4U/Source/VRM4UCapture/Public/VrmMocopiReceiver.h
T
2026-05-19 13:42:41 +07:00

158 lines
3.8 KiB
C++

// VRM4U Copyright (c) 2021-2024 Haruyoshi Yamamoto. This software is released under the MIT License.
#pragma once
#include "CoreMinimal.h"
#include "Misc/CoreDelegates.h"
#include "UObject/NoExportTypes.h"
#include "Interfaces/IPv4/IPv4Address.h"
#include "Interfaces/IPv4/IPv4Endpoint.h"
#include "Common/UdpSocketReceiver.h"
#include "Sockets.h"
#include "Common/UdpSocketBuilder.h"
#include "Misc/EngineVersionComparison.h"
#include "Tickable.h"
#if UE_VERSION_OLDER_THAN(4,26,0)
#else
#include "Containers/RingBuffer.h"
#endif
#include "VrmMocopiReceiver.generated.h"
/**
*
*/
enum MocopiData{
BoneNum = 27,
};
USTRUCT(BlueprintType)
struct FStructMocopiData{
GENERATED_BODY()
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "VRM4U")
int FrameNo = 0;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "VRM4U")
int Time = 0;
UPROPERTY(EditAnywhere, BlueprintReadWrite, EditFixedSize, Category = "VRM4U")
TArray<FTransform> MocopiTransformWorld;
UPROPERTY(EditAnywhere, BlueprintReadWrite, EditFixedSize, Category = "VRM4U")
TArray<FTransform> MocopiTransformLocal;
UPROPERTY(EditAnywhere, BlueprintReadWrite, EditFixedSize, Category = "VRM4U")
TArray<FTransform> VrmTransformLocal;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "VRM4U")
TMap<FString, FTransform> VrmTransformBoneList;
FStructMocopiData() {
MocopiTransformWorld.SetNum(MocopiData::BoneNum);
MocopiTransformLocal.SetNum(MocopiData::BoneNum);
VrmTransformLocal.SetNum(MocopiData::BoneNum);
}
};
class VRM4UCAPTURE_API FMocopiReceiverProxy : public FTickableGameObject
{
UVrmMocopiReceiver* Receiver;
FSocket* Socket = nullptr;
FUdpSocketReceiver* SocketReceiver = nullptr;
FIPv4Address ReceiveIPAddress;
int32 Port = 8888;
TArray<uint8> RecvDataSet;
public:
FMocopiReceiverProxy(UVrmMocopiReceiver *InReceiver);
//FMocopiReceiverProxy(UVrmMocopiReceiver& InServer);
virtual ~FMocopiReceiverProxy();
#if WITH_EDITOR
virtual bool IsTickableInEditor() const override {
return true;
}
#endif // WITH_EDITOR
void Listen();
void Stop();
bool SetAddress(const FString& ReceiveIPAddress, int32 Port);
virtual void Tick(float InDeltaTime) override;
virtual TStatId GetStatId() const override;
void OnPacketReceived(const FArrayReaderPtr& InData, const FIPv4Endpoint& InEndpoint);
};
UCLASS(BlueprintType)
class VRM4UCAPTURE_API UVrmMocopiReceiver : public UObject
{
GENERATED_UCLASS_BODY()
int BufferNum = 10;
int currentFrameNo = 0;
int currentTime = 0;
mutable FCriticalSection BufferCS;
TUniquePtr<FMocopiReceiverProxy> ReceiverProxy;
#if UE_VERSION_OLDER_THAN(4,26,0)
TArray<FStructMocopiData> MocopiReceiveBuffer;
#else
TRingBuffer<FStructMocopiData> MocopiReceiveBuffer;
#endif
public:
UFUNCTION(BlueprintCallable, Category = "VRM4U")
void Listen();
UFUNCTION(BlueprintCallable, Category = "VRM4U")
void Stop();
void OnPacketReceived(const FArrayReaderPtr& InData, const FIPv4Endpoint& InEndpoint);
UFUNCTION(BlueprintCallable, Category = "VRM4U")
bool SetAddress(const FString& ReceiveIPAddress, int32 Port);
UFUNCTION(BlueprintCallable, Category = "VRM4U")
void SetBufferNum(int32 Num = 10);
void OnPacketReceived(FStructMocopiData data);
void PacketBroadcast();
DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FVrmMocopiReceiverDelegate, FStructMocopiData, data);
UPROPERTY(BlueprintAssignable, Category = "VRM4U")
FVrmMocopiReceiverDelegate OnReceived;
UFUNCTION(BlueprintCallable, Category = "VRM4U")
void GetNextFrameData(FStructMocopiData &data, bool &bEnable, bool &bUpdate);
UFUNCTION(BlueprintCallable, Category = "VRM4U")
void GetLatestFrameData(FStructMocopiData &data, bool &bEnable, bool &bUpdate);
UFUNCTION(BlueprintCallable, Category = "VRM4U")
void GetCurrentTime(int& FrameNo, int& Time) {
FrameNo = currentFrameNo;
Time = currentTime;
}
protected:
virtual void BeginDestroy() override;
};