diff --git a/Unreal/Content/Project/BP/Avatars/Avatar_Ben_BREX.uasset b/Unreal/Content/Project/BP/Avatars/Avatar_Ben_BREX.uasset index 171fa97..a35607a 100644 --- a/Unreal/Content/Project/BP/Avatars/Avatar_Ben_BREX.uasset +++ b/Unreal/Content/Project/BP/Avatars/Avatar_Ben_BREX.uasset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:d404edef0dec2e92022e33a7c7938391f50cc6cb17c488f85a54a7fdfce237c7 -size 56484 +oid sha256:ee68fbb30bf9157ccec24c63695494762422a8ccb0dd879352af36a5b7c1911e +size 59353 diff --git a/Unreal/Content/Project/BP/Avatars/Avatar_Jasmin.uasset b/Unreal/Content/Project/BP/Avatars/Avatar_Jasmin.uasset index 6d0278a..75cc4ba 100644 --- a/Unreal/Content/Project/BP/Avatars/Avatar_Jasmin.uasset +++ b/Unreal/Content/Project/BP/Avatars/Avatar_Jasmin.uasset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:3917fe4c9c6ae4face27975209fd00635774693fe0591ae7568e58e3d32ca393 -size 51055 +oid sha256:923c84920d6a8dc1676d301d02fc0db14f5bda75670ace5bd0fcce36df494265 +size 50753 diff --git a/Unreal/Content/Project/BP/BP_Environment_Manager.uasset b/Unreal/Content/Project/BP/BP_Environment_Manager.uasset index 004aae9..b6714fb 100644 --- a/Unreal/Content/Project/BP/BP_Environment_Manager.uasset +++ b/Unreal/Content/Project/BP/BP_Environment_Manager.uasset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:2fec7a764ee8636217009274f549f21e6112cf9c6294be883d6c00359ce1586a -size 158802 +oid sha256:5dc6c08162e52dc2f1fdd54286241c15eed6963f8b708b80b50f6b6ea9b8589a +size 160252 diff --git a/Unreal/Content/Project/BP/BP_Media_Manager.uasset b/Unreal/Content/Project/BP/BP_Media_Manager.uasset index 98dec13..9e36767 100644 --- a/Unreal/Content/Project/BP/BP_Media_Manager.uasset +++ b/Unreal/Content/Project/BP/BP_Media_Manager.uasset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:8f35e46022b0c3640059bdf47acfca84c6d6cd6dbbcf48b98fb676e98d69fa22 -size 114005 +oid sha256:07669cc3a5cb99088ee5c50477e0176f5412393f48406f0ca5fa0ae2a848ac8c +size 114341 diff --git a/Unreal/Content/Project/BP/BP_Project_Manager.uasset b/Unreal/Content/Project/BP/BP_Project_Manager.uasset index f081939..35eb916 100644 --- a/Unreal/Content/Project/BP/BP_Project_Manager.uasset +++ b/Unreal/Content/Project/BP/BP_Project_Manager.uasset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:917e7d889994ac9bcba0f4a522cecbd1208aded8ff193fa228164d96a8fadd05 -size 2576558 +oid sha256:420f2ff92df1241b88540d7b55b25767e382e9a5097a38c13afa5f587ccacc1b +size 2574131 diff --git a/Unreal/Content/Project/BP/EnumsAndStructs/E_ProjectActions.uasset b/Unreal/Content/Project/BP/EnumsAndStructs/E_ProjectActions.uasset index 3be639a..f5198a1 100644 --- a/Unreal/Content/Project/BP/EnumsAndStructs/E_ProjectActions.uasset +++ b/Unreal/Content/Project/BP/EnumsAndStructs/E_ProjectActions.uasset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:05f3667162d9a284ca3a0eca4a29782430e4dc110b5758acb7fcfca7d5b22ee1 -size 3983 +oid sha256:dd2cd6338f0f1d00f4c0979b479e5582877fb8777da274d9b52f74057e436dc4 +size 6514 diff --git a/Unreal/Content/Project/BP/Environments/BP_Environment_FogWithRing.uasset b/Unreal/Content/Project/BP/Environments/BP_Environment_FogWithRing.uasset index aa72778..5705c29 100644 --- a/Unreal/Content/Project/BP/Environments/BP_Environment_FogWithRing.uasset +++ b/Unreal/Content/Project/BP/Environments/BP_Environment_FogWithRing.uasset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:abaf484137bfbc63f6ee9216f87e2b6a806a24bf333a2b6d9b216ac140ae1b90 -size 848614 +oid sha256:d86cf44eed64f22fddd70caa97f54000f10c3227e1b06b1af4f9fa98fa05a30d +size 848917 diff --git a/Unreal/Content/Project/BP/Modes/States/DT_ProjectStates.uasset b/Unreal/Content/Project/BP/Modes/States/DT_ProjectStates.uasset index 1c3f98a..8cf76a0 100644 --- a/Unreal/Content/Project/BP/Modes/States/DT_ProjectStates.uasset +++ b/Unreal/Content/Project/BP/Modes/States/DT_ProjectStates.uasset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:a79add94ea2628dbe19a744fcda1d369dad87029d216dd4b5dac6bc6f39c791b -size 7760 +oid sha256:994ded1043d5cba7cbba6de51651592d862bed3de6f8512c61e312bd1e76a9b2 +size 7717 diff --git a/Unreal/Content/Project/Maps/M_Startup.umap b/Unreal/Content/Project/Maps/M_Startup.umap index 540133f..1cddfed 100644 --- a/Unreal/Content/Project/Maps/M_Startup.umap +++ b/Unreal/Content/Project/Maps/M_Startup.umap @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:ce7d71cd7034a210725c34697daeddca50fe907a64e34e38df83c3f15bfd28b0 -size 162395 +oid sha256:1f5594b028366780e8ab5d013a25ff9471c00fc4caa3e787359902d6a654fd96 +size 162454 diff --git a/Unreal/Plugins/AvatarCore_AI/Source/AvatarCore_AI/Private/AIBaseManager.cpp b/Unreal/Plugins/AvatarCore_AI/Source/AvatarCore_AI/Private/AIBaseManager.cpp index 77157b3..1b87f95 100644 --- a/Unreal/Plugins/AvatarCore_AI/Source/AvatarCore_AI/Private/AIBaseManager.cpp +++ b/Unreal/Plugins/AvatarCore_AI/Source/AvatarCore_AI/Private/AIBaseManager.cpp @@ -18,7 +18,7 @@ void UAIBaseManager::InitAIManager(UAIBaseConfig* AIConfig, bool DebugMode, AAct CurrentConfig->AddToRoot(); UAIBaseManager::AddRepeatSystemInstruction(); - + // Store the reference actor for world context WorldReferenceActor = InWorldReferenceActor; @@ -179,7 +179,7 @@ void UAIBaseManager::ClearAI() return; UAIBaseManager::SetNewState(EAvatarCoreAIState::Ready, true); UAIBaseManager::ClearDelayedAnswerTimer(); - UAIBaseManager::ClearMCPCommand(); + //UAIBaseManager::ClearMCPCommand(); AnswerCache.Empty(); //Extend in Child } @@ -275,6 +275,8 @@ TArray UAIBaseManager::GetAvailableCommands() void UAIBaseManager::RunMCPCommand(FString CommandName, FString Payload) { + ClearRequestTimeout(); + if (!CurrentConfig) { BroadcastAIError(TEXT("No config loaded for RunCommand"), EAvatarCoreAIError::InvalidConfig); return; @@ -330,7 +332,6 @@ void UAIBaseManager::ClearMCPCommand() void UAIBaseManager::CommandFinished(const FString& Command, const FString& Payload) { - UE_LOG(LogTemp, Warning, TEXT("Processing")); SetNewState(EAvatarCoreAIState::Ready); functionCallRunning = false; if (bDebugMode) @@ -527,7 +528,7 @@ void UAIBaseManager::ClearRequestTimeout() void UAIBaseManager::OnRequestTimeout() { - BroadcastAIError(TEXT("Request timeout"), EAvatarCoreAIError::TimeoutError); + BroadcastAIError(TEXT("AI Manager request timeout"), EAvatarCoreAIError::TimeoutError); SetNewState(EAvatarCoreAIState::Error); } diff --git a/Unreal/Plugins/AvatarCore_AI/Source/AvatarCore_AI/Private/MCP/MCPUnrealCommand.cpp b/Unreal/Plugins/AvatarCore_AI/Source/AvatarCore_AI/Private/MCP/MCPUnrealCommand.cpp index 718d22c..9e13b27 100644 --- a/Unreal/Plugins/AvatarCore_AI/Source/AvatarCore_AI/Private/MCP/MCPUnrealCommand.cpp +++ b/Unreal/Plugins/AvatarCore_AI/Source/AvatarCore_AI/Private/MCP/MCPUnrealCommand.cpp @@ -64,7 +64,7 @@ void UMCPUnrealCommand::FailCommand(const FString& Payload) void UMCPUnrealCommand::OnTimeout() { - FailCommand(TEXT("{ \"error\": \"timeout\" }")); + FailCommand(TEXT("{ \"error\": \"mcp command timeout\" }")); } AActor* UMCPUnrealCommand::GetActorOfClass(UWorld* World, TSubclassOf ActorClass) const diff --git a/Unreal/Plugins/AvatarCore_AI/Source/AvatarCore_AI/Private/RealtimeAPI/AvatarCoreAIRealtime.cpp b/Unreal/Plugins/AvatarCore_AI/Source/AvatarCore_AI/Private/RealtimeAPI/AvatarCoreAIRealtime.cpp index d42fa3b..0ea4695 100644 --- a/Unreal/Plugins/AvatarCore_AI/Source/AvatarCore_AI/Private/RealtimeAPI/AvatarCoreAIRealtime.cpp +++ b/Unreal/Plugins/AvatarCore_AI/Source/AvatarCore_AI/Private/RealtimeAPI/AvatarCoreAIRealtime.cpp @@ -552,7 +552,7 @@ void UAvatarCoreAIRealtime::OnWebSocketConnectionStringReceived(const FString& M } //Check if there is a valid function call else if (RequestItem == EOpenAIRequestItem::function_call) { - ResetRequestTimeout(); + ClearRequestTimeout(); FString CommandName; TSharedPtr MessageJson; TSharedRef> FunctionReader = TJsonReaderFactory<>::Create(Message); @@ -577,11 +577,11 @@ void UAvatarCoreAIRealtime::OnWebSocketConnectionStringReceived(const FString& M } if (RequestItem == EOpenAIRequestItem::audio_transcript || RequestItem == EOpenAIRequestItem::text) { //Transcription Chunk - ResetRequestTimeout(); + ClearRequestTimeout(); UAIBaseManager::OnAIResponse(DeltaResponse.delta, false); } else if (RequestItem == EOpenAIRequestItem::audio) { //Audio Chunk - ResetRequestTimeout(); + ClearRequestTimeout(); // Ensure DeltaResponse.delta is treated as raw binary PCM data TArray PCMData; uint32 Size = DeltaResponse.delta.Len(); diff --git a/Unreal/Plugins/AvatarCore_AI/Source/AvatarCore_AI/Private/n8n/n8n_connector.cpp b/Unreal/Plugins/AvatarCore_AI/Source/AvatarCore_AI/Private/n8n/n8n_connector.cpp new file mode 100644 index 0000000..4aa8974 --- /dev/null +++ b/Unreal/Plugins/AvatarCore_AI/Source/AvatarCore_AI/Private/n8n/n8n_connector.cpp @@ -0,0 +1,216 @@ +// Fill out your copyright notice in the Description page of Project Settings. + + +#include "n8n/n8n_connector.h" + +#include "Async/Async.h" +#include "Dom/JsonValue.h" +#include "HttpModule.h" +#include "Interfaces/IHttpResponse.h" +#include "Serialization/JsonSerializer.h" + +namespace +{ + static FString HttpRequestStatusToString(EHttpRequestStatus::Type Status) + { + switch (Status) + { + case EHttpRequestStatus::NotStarted: return TEXT("NotStarted"); + case EHttpRequestStatus::Processing: return TEXT("Processing"); + case EHttpRequestStatus::Failed: return TEXT("Failed"); + //case EHttpRequestStatus::Failed_ConnectionError: return TEXT("Failed_ConnectionError"); + case EHttpRequestStatus::Succeeded: return TEXT("Succeeded"); + default: return TEXT("Unknown"); + } + } +} + +Un8n_connector::Un8n_connector() +{ +} + +void Un8n_connector::PostInitProperties() +{ + Super::PostInitProperties(); + EnsureRooted(); +} + +void Un8n_connector::BeginDestroy() +{ + DeinitN8NConnector(); + + if (!HasAnyFlags(RF_ClassDefaultObject) && IsRooted()) + { + RemoveFromRoot(); + } + + Super::BeginDestroy(); +} + +void Un8n_connector::EnsureRooted() +{ + if (!HasAnyFlags(RF_ClassDefaultObject) && !IsRooted()) + { + AddToRoot(); + } +} + +int32 Un8n_connector::StartWorkflow(const FString& payload) +{ + EnsureRooted(); + + if (N8NURL.IsEmpty()) + { + BroadcastError(INDEX_NONE, TEXT("StartWorkflow: url is empty")); + return INDEX_NONE; + } + + int32 RequestId; + { + FScopeLock Lock(&ActiveRequestsCriticalSection); + RequestId = NextRequestId++; + } + + TSharedRef HttpRequest = FHttpModule::Get().CreateRequest(); + HttpRequest->SetURL(N8NURL); + HttpRequest->SetVerb(TEXT("POST")); + HttpRequest->SetHeader(TEXT("Content-Type"), TEXT("application/json; charset=utf-8")); + + // Validate payload as JSON (allow object or array) + { + TSharedPtr RootValue; + TSharedRef> Reader = TJsonReaderFactory<>::Create(payload); + if (!FJsonSerializer::Deserialize(Reader, RootValue) || !RootValue.IsValid()) + { + BroadcastError(INDEX_NONE, TEXT("StartWorkflow: payload is not valid JSON")); + } + if (RootValue->Type != EJson::Object && RootValue->Type != EJson::Array) + { + BroadcastError(INDEX_NONE, TEXT("StartWorkflow: payload i JSON object or array")); + } + else + { + HttpRequest->SetHeader(TEXT("Accept"), TEXT("application/json")); + HttpRequest->SetContentAsString(payload); + } + } + + HttpRequest->SetTimeout(N8NTimeout); + + HttpRequest->OnProcessRequestComplete().BindLambda( + [this, RequestId](FHttpRequestPtr Request, FHttpResponsePtr Response, bool bWasSuccessful) + { + HandleRequestComplete(RequestId, Request, Response, bWasSuccessful); + }); + + { + FScopeLock Lock(&ActiveRequestsCriticalSection); + ActiveRequestsById.Add(RequestId, HttpRequest); + } + + if (!HttpRequest->ProcessRequest()) + { + { + FScopeLock Lock(&ActiveRequestsCriticalSection); + ActiveRequestsById.Remove(RequestId); + } + BroadcastError(RequestId, TEXT("StartWorkflow: failed to start HTTP request")); + return RequestId; + } + + return RequestId; +} + +void Un8n_connector::InitN8NConnector(const FString& url, float timeout) +{ + N8NURL = url; + N8NTimeout = timeout; +} + +void Un8n_connector::DeinitN8NConnector() +{ + ClearN8NConnector(); + + if (IsRooted()) + { + RemoveFromRoot(); + } +} + +void Un8n_connector::ClearN8NConnector() +{ + TArray> RequestsToCancel; + { + FScopeLock Lock(&ActiveRequestsCriticalSection); + RequestGenerationId++; + ActiveRequestsById.GenerateValueArray(RequestsToCancel); + ActiveRequestsById.Empty(); + } + + for (const TSharedPtr& Req : RequestsToCancel) + { + if (Req.IsValid()) + { + Req->CancelRequest(); + } + } +} + +void Un8n_connector::HandleRequestComplete(int32 RequestId, FHttpRequestPtr Request, FHttpResponsePtr Response, bool bWasSuccessful) +{ + { + FScopeLock Lock(&ActiveRequestsCriticalSection); + ActiveRequestsById.Remove(RequestId); + } + + if (!bWasSuccessful || !Response.IsValid()) + { + const FString Url = Request.IsValid() ? Request->GetURL() : FString(TEXT("")); + const FString Status = Request.IsValid() ? HttpRequestStatusToString(Request->GetStatus()) : FString(TEXT("")); + BroadcastError(RequestId, FString::Printf(TEXT("n8n webhook request failed (no HTTP response). url=%s status=%s"), *Url, *Status)); + return; + } + + const int32 Code = Response->GetResponseCode(); + const FString Body = Response->GetContentAsString(); + + if (Code >= 200 && Code < 300) + { + BroadcastResult(RequestId, Body); + } + else + { + BroadcastError(RequestId, FString::Printf(TEXT("HTTP %d: %s"), Code, *Body)); + } +} + +void Un8n_connector::BroadcastError(int32 RequestId, const FString& ErrorMessage) +{ + if (IsInGameThread()) + { + OnN8NError.Broadcast(RequestId, ErrorMessage); + return; + } + + const FString Copy = ErrorMessage; + AsyncTask(ENamedThreads::GameThread, [this, RequestId, Copy]() + { + OnN8NError.Broadcast(RequestId, Copy); + }); +} + +void Un8n_connector::BroadcastResult(int32 RequestId, const FString& Payload) +{ + if (IsInGameThread()) + { + OnN8NResult.Broadcast(RequestId, Payload); + return; + } + + const FString Copy = Payload; + AsyncTask(ENamedThreads::GameThread, [this, RequestId, Copy]() + { + OnN8NResult.Broadcast(RequestId, Copy); + }); +} + diff --git a/Unreal/Plugins/AvatarCore_AI/Source/AvatarCore_AI/Public/n8n/n8n_connector.h b/Unreal/Plugins/AvatarCore_AI/Source/AvatarCore_AI/Public/n8n/n8n_connector.h new file mode 100644 index 0000000..17e7e5f --- /dev/null +++ b/Unreal/Plugins/AvatarCore_AI/Source/AvatarCore_AI/Public/n8n/n8n_connector.h @@ -0,0 +1,62 @@ +// Fill out your copyright notice in the Description page of Project Settings. + +#pragma once + +#include "CoreMinimal.h" +#include "UObject/NoExportTypes.h" +#include "Http.h" +#include "n8n_connector.generated.h" + +DECLARE_DYNAMIC_MULTICAST_DELEGATE_TwoParams(FOnN8NError, int32, RequestId, const FString&, ErrorMessage); +DECLARE_DYNAMIC_MULTICAST_DELEGATE_TwoParams(FOnN8NResult, int32, RequestId, const FString&, Payload); + +/** + * + */ +UCLASS(Blueprintable, BlueprintType) +class AVATARCORE_AI_API Un8n_connector : public UObject +{ + GENERATED_BODY() + +public: + Un8n_connector(); + + UPROPERTY(BlueprintAssignable, Category = "AvatarCoreAI|n8n|Events") + FOnN8NError OnN8NError; + + UPROPERTY(BlueprintAssignable, Category = "AvatarCoreAI|n8n|Events") + FOnN8NResult OnN8NResult; + + // Blueprint Functions - Lifecycle + UFUNCTION(BlueprintCallable, Category = "AvatarCoreAI|n8n") + int32 StartWorkflow(const FString& payload); + + UFUNCTION(BlueprintCallable, Category = "AvatarCoreAI|n8n") + void InitN8NConnector(const FString& url, float timeout = 60); + + UFUNCTION(BlueprintCallable, Category = "AvatarCoreAI|n8n") + void DeinitN8NConnector(); + + UFUNCTION(BlueprintCallable, Category = "AvatarCoreAI|n8n") + void ClearN8NConnector(); + +protected: + virtual void PostInitProperties() override; + virtual void BeginDestroy() override; + +private: + void HandleRequestComplete(int32 RequestId, FHttpRequestPtr Request, FHttpResponsePtr Response, bool bWasSuccessful); + void BroadcastError(int32 RequestId, const FString& ErrorMessage); + void BroadcastResult(int32 RequestId, const FString& Payload); + void EnsureRooted(); + + FString N8NURL; + float N8NTimeout = 60; + +private: + FCriticalSection ActiveRequestsCriticalSection; + TMap> ActiveRequestsById; + + int32 NextRequestId = 1; + uint32 RequestGenerationId = 0; +}; diff --git a/Unreal/Plugins/AvatarCore_FaceDetector/AvatarCore_FaceDetector.uplugin b/Unreal/Plugins/AvatarCore_FaceDetector/AvatarCore_FaceDetector.uplugin deleted file mode 100644 index bccdcff..0000000 --- a/Unreal/Plugins/AvatarCore_FaceDetector/AvatarCore_FaceDetector.uplugin +++ /dev/null @@ -1,24 +0,0 @@ -{ - "FileVersion": 3, - "Version": 1, - "VersionName": "1.0", - "FriendlyName": "AvatarCore_FaceDetector", - "Description": "Tracking faces in webcame streams", - "Category": "Other", - "CreatedBy": "b.ReX", - "CreatedByURL": "", - "DocsURL": "", - "MarketplaceURL": "", - "SupportURL": "", - "CanContainContent": true, - "IsBetaVersion": false, - "IsExperimentalVersion": false, - "Installed": false, - "Modules": [ - { - "Name": "AvatarCore_FaceDetector", - "Type": "Runtime", - "LoadingPhase": "Default" - } - ] -} \ No newline at end of file diff --git a/Unreal/Plugins/AvatarCore_FaceDetector/Content/BP_FaceDetector.uasset b/Unreal/Plugins/AvatarCore_FaceDetector/Content/BP_FaceDetector.uasset deleted file mode 100644 index 1e0843f..0000000 --- a/Unreal/Plugins/AvatarCore_FaceDetector/Content/BP_FaceDetector.uasset +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8e2c75901f0365cc99789da9d57035891f2a36fb4daba590703e78d3dbaae933 -size 439459 diff --git a/Unreal/Plugins/AvatarCore_FaceDetector/Content/Material/M_Face.uasset b/Unreal/Plugins/AvatarCore_FaceDetector/Content/Material/M_Face.uasset deleted file mode 100644 index 8d0e6a5..0000000 --- a/Unreal/Plugins/AvatarCore_FaceDetector/Content/Material/M_Face.uasset +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:125c72bb49428c32e298d989f66a7b28416a7311cc2d8282fa943228a6cd2af5 -size 13934 diff --git a/Unreal/Plugins/AvatarCore_FaceDetector/Content/Material/M_FaceArea.uasset b/Unreal/Plugins/AvatarCore_FaceDetector/Content/Material/M_FaceArea.uasset deleted file mode 100644 index 55f9369..0000000 --- a/Unreal/Plugins/AvatarCore_FaceDetector/Content/Material/M_FaceArea.uasset +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:618d3bf2b9e96fbf6c5502c9e952189a390b53f600045dad015a7f1058c5daf8 -size 11705 diff --git a/Unreal/Plugins/AvatarCore_FaceDetector/Content/Misc/BP_TargetActor.uasset b/Unreal/Plugins/AvatarCore_FaceDetector/Content/Misc/BP_TargetActor.uasset deleted file mode 100644 index 3735d8c..0000000 --- a/Unreal/Plugins/AvatarCore_FaceDetector/Content/Misc/BP_TargetActor.uasset +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3382025c8c64eb4048bf7f8661e34969542da1187472f69c7ddcc35b967ae19f -size 102360 diff --git a/Unreal/Plugins/AvatarCore_FaceDetector/Content/Misc/Target.uasset b/Unreal/Plugins/AvatarCore_FaceDetector/Content/Misc/Target.uasset deleted file mode 100644 index 13dc7c1..0000000 --- a/Unreal/Plugins/AvatarCore_FaceDetector/Content/Misc/Target.uasset +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7957059cacf581b1bb22a643c0060c6e9bdd76300e457dc49af58f8cf57d3c81 -size 72077 diff --git a/Unreal/Plugins/AvatarCore_FaceDetector/Resources/Icon128.png b/Unreal/Plugins/AvatarCore_FaceDetector/Resources/Icon128.png deleted file mode 100644 index 9cbf628..0000000 --- a/Unreal/Plugins/AvatarCore_FaceDetector/Resources/Icon128.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f41cab739893bde1040beb34ba2e9f666cc4a502c0f350cf1c6bfa8bee783d1f -size 6957 diff --git a/Unreal/Plugins/AvatarCore_FaceDetector/Source/AvatarCore_FaceDetector/AvatarCore_FaceDetector.Build.cs b/Unreal/Plugins/AvatarCore_FaceDetector/Source/AvatarCore_FaceDetector/AvatarCore_FaceDetector.Build.cs deleted file mode 100644 index 60e0bcc..0000000 --- a/Unreal/Plugins/AvatarCore_FaceDetector/Source/AvatarCore_FaceDetector/AvatarCore_FaceDetector.Build.cs +++ /dev/null @@ -1,60 +0,0 @@ -// Copyright Epic Games, Inc. All Rights Reserved. - -using System.IO; -using UnrealBuildTool; - -public class AvatarCore_FaceDetector : ModuleRules -{ - public AvatarCore_FaceDetector(ReadOnlyTargetRules Target) : base(Target) - { - PCHUsage = ModuleRules.PCHUsageMode.UseExplicitOrSharedPCHs; - - PublicIncludePaths.AddRange( - new string[] { - // ... add public include paths required here ... - } - ); - - - PrivateIncludePaths.AddRange( - new string[] { - // ... add other private include paths required here ... - } - ); - - - PublicDependencyModuleNames.AddRange( - new string[] - { - "Core", - // ... add other public dependencies that you statically link with here ... - } - ); - - - PrivateDependencyModuleNames.AddRange( - new string[] - { - "CoreUObject", - "Engine", - "Projects", - "Json", - "JsonUtilities", - "Slate", - "SlateCore", - // ... add private dependencies that you statically link with here ... - } - ); - - - DynamicallyLoadedModuleNames.AddRange( - new string[] - { - // ... add any modules that your module loads dynamically here ... - } - ); - - RuntimeDependencies.Add(Path.Combine(ModuleDirectory, "..", "ThirdParty", "FaceDetector.exe")); - RuntimeDependencies.Add(Path.Combine(ModuleDirectory, "..", "ThirdParty", "face_landmarker.task")); - } -} diff --git a/Unreal/Plugins/AvatarCore_FaceDetector/Source/AvatarCore_FaceDetector/Private/AvatarCore_FaceDetector.cpp b/Unreal/Plugins/AvatarCore_FaceDetector/Source/AvatarCore_FaceDetector/Private/AvatarCore_FaceDetector.cpp deleted file mode 100644 index 11f5a50..0000000 --- a/Unreal/Plugins/AvatarCore_FaceDetector/Source/AvatarCore_FaceDetector/Private/AvatarCore_FaceDetector.cpp +++ /dev/null @@ -1,20 +0,0 @@ -// Copyright Epic Games, Inc. All Rights Reserved. - -#include "AvatarCore_FaceDetector.h" - -#define LOCTEXT_NAMESPACE "FAvatarCore_FaceDetectorModule" - -void FAvatarCore_FaceDetectorModule::StartupModule() -{ - // This code will execute after your module is loaded into memory; the exact timing is specified in the .uplugin file per-module -} - -void FAvatarCore_FaceDetectorModule::ShutdownModule() -{ - // This function may be called during shutdown to clean up your module. For modules that support dynamic reloading, - // we call this function before unloading the module. -} - -#undef LOCTEXT_NAMESPACE - -IMPLEMENT_MODULE(FAvatarCore_FaceDetectorModule, AvatarCore_FaceDetector) \ No newline at end of file diff --git a/Unreal/Plugins/AvatarCore_FaceDetector/Source/AvatarCore_FaceDetector/Private/AvatarFaceDetectorSubsystem.cpp b/Unreal/Plugins/AvatarCore_FaceDetector/Source/AvatarCore_FaceDetector/Private/AvatarFaceDetectorSubsystem.cpp deleted file mode 100644 index c321fb8..0000000 --- a/Unreal/Plugins/AvatarCore_FaceDetector/Source/AvatarCore_FaceDetector/Private/AvatarFaceDetectorSubsystem.cpp +++ /dev/null @@ -1,307 +0,0 @@ -#include "AvatarFaceDetectorSubsystem.h" - -#include "Async/Async.h" -#include "Interfaces/IPluginManager.h" -#include "Misc/Paths.h" -#include "Serialization/JsonReader.h" -#include "Serialization/JsonSerializer.h" - -bool UAvatarFaceDetectorSubsystem::InitializeFaceDetector(const FFaceDetectorSettings& Settings) -{ - ShutdownFaceDetector(); - return StartProcess(Settings); -} - -void UAvatarFaceDetectorSubsystem::ShutdownFaceDetector() -{ - StopProcess(); -} - -bool UAvatarFaceDetectorSubsystem::IsFaceDetectorRunning() const -{ - FProcHandle HandleCopy = ProcHandle; - return HandleCopy.IsValid() && FPlatformProcess::IsProcRunning(HandleCopy); -} - -void UAvatarFaceDetectorSubsystem::Deinitialize() -{ - ShutdownFaceDetector(); - Super::Deinitialize(); -} - -FString UAvatarFaceDetectorSubsystem::ResolveThirdPartyFilePath(const FString& FileName) const -{ - const TSharedPtr Plugin = IPluginManager::Get().FindPlugin(TEXT("AvatarCore_FaceDetector")); - if (!Plugin.IsValid()) - { - return FString(); - } - - const FString ThirdPartyDir = FPaths::Combine(Plugin->GetBaseDir(), TEXT("Source"), TEXT("ThirdParty")); - return FPaths::Combine(ThirdPartyDir, FileName); -} - -bool UAvatarFaceDetectorSubsystem::StartProcess(const FFaceDetectorSettings& Settings) -{ - FScopeLock Lock(&StateCriticalSection); - - const FString ExePath = ResolveThirdPartyFilePath(TEXT("FaceDetector.exe")); - if (ExePath.IsEmpty() || !FPaths::FileExists(ExePath)) - { - AsyncTask(ENamedThreads::GameThread, [this]() - { - OnFaceDetectorError.Broadcast(TEXT("FaceDetector.exe not found (expected under Plugin/Source/ThirdParty).")); - }); - return false; - } - - FString Args; - if (!Settings.WebcamName.IsEmpty()) - { - Args += FString::Printf(TEXT(" --device \"%s\""), *Settings.WebcamName); - } - if (!Settings.ModelName.IsEmpty()) - { - const FString ModelPath = ResolveThirdPartyFilePath(Settings.ModelName); - Args += FString::Printf(TEXT(" --model \"%s\""), *ModelPath); - } - Args += FString::Printf(TEXT(" --num_faces %d"), Settings.NumFaces); - if (Settings.bDebugMode) - { - Args += TEXT(" --debugMode"); - } - - Args += FString::Printf(TEXT(" --fps_limit %d"), Settings.FrameRateLimit); - - FPlatformProcess::CreatePipe(ReadPipe, WritePipe); - - bStopRequested = false; - StdoutRemainder.Reset(); - - ProcHandle = FPlatformProcess::CreateProc( - *ExePath, - *Args, - false, - true, - true, - nullptr, - 0, - nullptr, - WritePipe, - ReadPipe); - - if (!ProcHandle.IsValid()) - { - FPlatformProcess::ClosePipe(ReadPipe, WritePipe); - ReadPipe = nullptr; - WritePipe = nullptr; - - AsyncTask(ENamedThreads::GameThread, [this]() - { - OnFaceDetectorError.Broadcast(TEXT("Failed to launch FaceDetector.exe")); - }); - return false; - } - - ReaderFuture = Async(EAsyncExecution::Thread, [this]() - { - ReaderThreadMain(); - }); - - return true; -} - -void UAvatarFaceDetectorSubsystem::StopProcess() -{ - TFuture LocalFuture; - FProcHandle LocalProc; - void* LocalReadPipe = nullptr; - void* LocalWritePipe = nullptr; - - { - FScopeLock Lock(&StateCriticalSection); - - bStopRequested = true; - LocalFuture = MoveTemp(ReaderFuture); - LocalProc = ProcHandle; - LocalReadPipe = ReadPipe; - LocalWritePipe = WritePipe; - - ProcHandle.Reset(); - ReadPipe = nullptr; - WritePipe = nullptr; - StdoutRemainder.Reset(); - } - - if (LocalProc.IsValid()) - { - FPlatformProcess::TerminateProc(LocalProc, true); - FPlatformProcess::CloseProc(LocalProc); - } - - if (LocalFuture.IsValid()) - { - LocalFuture.Wait(); - } - - if (LocalReadPipe != nullptr || LocalWritePipe != nullptr) - { - FPlatformProcess::ClosePipe(LocalReadPipe, LocalWritePipe); - } -} - -void UAvatarFaceDetectorSubsystem::ReaderThreadMain() -{ - while (!bStopRequested) - { - FString NewOutput; - { - FScopeLock Lock(&StateCriticalSection); - if (ReadPipe == nullptr) - { - break; - } - NewOutput = FPlatformProcess::ReadPipe(ReadPipe); - } - - if (NewOutput.IsEmpty()) - { - if (!IsFaceDetectorRunning()) - { - break; - } - FPlatformProcess::Sleep(0.01f); - continue; - } - - FString Combined; - { - FScopeLock Lock(&StateCriticalSection); - Combined = StdoutRemainder + NewOutput; - StdoutRemainder.Reset(); - } - - TArray Lines; - Combined.ParseIntoArrayLines(Lines, false); - - const bool bEndsWithNewline = Combined.EndsWith(TEXT("\n")) || Combined.EndsWith(TEXT("\r\n")); - if (!bEndsWithNewline && Lines.Num() > 0) - { - FScopeLock Lock(&StateCriticalSection); - StdoutRemainder = Lines.Pop(); - } - - for (const FString& Line : Lines) - { - const FString Trimmed = Line.TrimStartAndEnd(); - if (!Trimmed.IsEmpty()) - { - HandleLineOnWorkerThread(Trimmed); - } - } - } - - if (!bStopRequested) - { - AsyncTask(ENamedThreads::GameThread, [this]() - { - OnFaceDetectorError.Broadcast(TEXT("FaceDetector process stopped.")); - }); - } -} - -void UAvatarFaceDetectorSubsystem::HandleLineOnWorkerThread(const FString& Line) -{ - TSharedPtr Root; - TSharedRef> Reader = TJsonReaderFactory<>::Create(Line); - if (!FJsonSerializer::Deserialize(Reader, Root) || !Root.IsValid()) - { - AsyncTask(ENamedThreads::GameThread, [this, Line]() - { - OnFaceDetectorLog.Broadcast(Line); - }); - return; - } - - FString Type; - if (!Root->TryGetStringField(TEXT("type"), Type)) - { - AsyncTask(ENamedThreads::GameThread, [this, Line]() - { - OnFaceDetectorLog.Broadcast(Line); - }); - return; - } - - if (Type.Equals(TEXT("error"), ESearchCase::IgnoreCase)) - { - FString Message; - Root->TryGetStringField(TEXT("message"), Message); - AsyncTask(ENamedThreads::GameThread, [this, Message]() - { - OnFaceDetectorError.Broadcast(Message); - }); - return; - } - - if (Type.Equals(TEXT("log"), ESearchCase::IgnoreCase)) - { - FString Message; - Root->TryGetStringField(TEXT("message"), Message); - AsyncTask(ENamedThreads::GameThread, [this, Message]() - { - OnFaceDetectorLog.Broadcast(Message); - }); - return; - } - - if (Type.Equals(TEXT("faces"), ESearchCase::IgnoreCase)) - { - TArray Faces; - - const TArray>* FacesJson = nullptr; - if (Root->TryGetArrayField(TEXT("faces"), FacesJson) && FacesJson != nullptr) - { - Faces.Reserve(FacesJson->Num()); - for (const TSharedPtr& FaceVal : *FacesJson) - { - if (!FaceVal.IsValid() || FaceVal->Type != EJson::Object) - { - continue; - } - const TSharedPtr FaceObj = FaceVal->AsObject(); - if (!FaceObj.IsValid()) - { - continue; - } - - double X = 0.0; - double Y = 0.0; - double IdNum = (double)INDEX_NONE; - bool bActive = false; - - FaceObj->TryGetNumberField(TEXT("x"), X); - FaceObj->TryGetNumberField(TEXT("y"), Y); - FaceObj->TryGetNumberField(TEXT("id"), IdNum); - FaceObj->TryGetBoolField(TEXT("active"), bActive); - - FDetectedFace Face; - Face.Position = FVector2D((float)X, (float)Y); - Face.Id = (int32)IdNum; - Face.TrackingLost = !bActive; - Faces.Add(Face); - } - } - - AsyncTask(ENamedThreads::GameThread, [this, Faces = MoveTemp(Faces)]() mutable - { - OnFaceDetectorUpdate.Broadcast(Faces); - }); - return; - } - - AsyncTask(ENamedThreads::GameThread, [this, Line]() - { - OnFaceDetectorLog.Broadcast(Line); - }); -} diff --git a/Unreal/Plugins/AvatarCore_FaceDetector/Source/AvatarCore_FaceDetector/Public/AvatarCore_FaceDetector.h b/Unreal/Plugins/AvatarCore_FaceDetector/Source/AvatarCore_FaceDetector/Public/AvatarCore_FaceDetector.h deleted file mode 100644 index 5c81379..0000000 --- a/Unreal/Plugins/AvatarCore_FaceDetector/Source/AvatarCore_FaceDetector/Public/AvatarCore_FaceDetector.h +++ /dev/null @@ -1,14 +0,0 @@ -// Copyright Epic Games, Inc. All Rights Reserved. - -#pragma once - -#include "Modules/ModuleManager.h" - -class FAvatarCore_FaceDetectorModule : public IModuleInterface -{ -public: - - /** IModuleInterface implementation */ - virtual void StartupModule() override; - virtual void ShutdownModule() override; -}; diff --git a/Unreal/Plugins/AvatarCore_FaceDetector/Source/AvatarCore_FaceDetector/Public/AvatarFaceDetectorSubsystem.h b/Unreal/Plugins/AvatarCore_FaceDetector/Source/AvatarCore_FaceDetector/Public/AvatarFaceDetectorSubsystem.h deleted file mode 100644 index bd54fd8..0000000 --- a/Unreal/Plugins/AvatarCore_FaceDetector/Source/AvatarCore_FaceDetector/Public/AvatarFaceDetectorSubsystem.h +++ /dev/null @@ -1,56 +0,0 @@ -#pragma once - -#include "CoreMinimal.h" -#include "HAL/PlatformProcess.h" -#include "Async/Future.h" -#include "Subsystems/GameInstanceSubsystem.h" -#include "FaceDetectorTypes.h" -#include "AvatarFaceDetectorSubsystem.generated.h" - -DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FFaceDetectorErrorSig, const FString&, ErrorMessage); -DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FFaceDetectorLogSig, const FString&, LogMessage); -DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FFaceDetectorUpdateSig, const TArray&, Faces); - -UCLASS() -class AVATARCORE_FACEDETECTOR_API UAvatarFaceDetectorSubsystem : public UGameInstanceSubsystem -{ - GENERATED_BODY() - -public: - UFUNCTION(BlueprintCallable, Category="FaceDetector") - bool InitializeFaceDetector(const FFaceDetectorSettings& Settings); - - UFUNCTION(BlueprintCallable, Category="FaceDetector") - void ShutdownFaceDetector(); - - UFUNCTION(BlueprintCallable, Category="FaceDetector") - bool IsFaceDetectorRunning() const; - - UPROPERTY(BlueprintAssignable, Category="FaceDetector") - FFaceDetectorErrorSig OnFaceDetectorError; - - UPROPERTY(BlueprintAssignable, Category="FaceDetector") - FFaceDetectorLogSig OnFaceDetectorLog; - - UPROPERTY(BlueprintAssignable, Category="FaceDetector") - FFaceDetectorUpdateSig OnFaceDetectorUpdate; - - virtual void Deinitialize() override; - -private: - bool StartProcess(const FFaceDetectorSettings& Settings); - void StopProcess(); - void ReaderThreadMain(); - void HandleLineOnWorkerThread(const FString& Line); - - FString ResolveThirdPartyFilePath(const FString& FileName) const; - -private: - FProcHandle ProcHandle; - void* ReadPipe = nullptr; - void* WritePipe = nullptr; - TAtomic bStopRequested = false; - TFuture ReaderFuture; - FCriticalSection StateCriticalSection; - FString StdoutRemainder; -}; diff --git a/Unreal/Plugins/AvatarCore_FaceDetector/Source/AvatarCore_FaceDetector/Public/FaceDetectorTypes.h b/Unreal/Plugins/AvatarCore_FaceDetector/Source/AvatarCore_FaceDetector/Public/FaceDetectorTypes.h deleted file mode 100644 index 265acc8..0000000 --- a/Unreal/Plugins/AvatarCore_FaceDetector/Source/AvatarCore_FaceDetector/Public/FaceDetectorTypes.h +++ /dev/null @@ -1,45 +0,0 @@ -#pragma once - -#include "CoreMinimal.h" -#include "FaceDetectorTypes.generated.h" - -USTRUCT(BlueprintType) -struct FDetectedFace -{ - GENERATED_BODY() - - UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="FaceDetector") - FVector2D Position = FVector2D::ZeroVector; - - UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="FaceDetector") - int32 Id = INDEX_NONE; - - UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="FaceDetector") - bool TrackingLost = false; -}; - -USTRUCT(BlueprintType) -struct FFaceDetectorSettings -{ - GENERATED_BODY() - - //Name of the webcam (pick first if ambigious) - UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="FaceDetector") - FString WebcamName; - - //Create a DebugWindow to see detected faces - UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="FaceDetector") - bool bDebugMode = false; - - //Override Model (full path to modelfile) - UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="FaceDetector") - FString ModelName; - - //Limit Framerate of Videostream (0 to disable) - UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="FaceDetector") - int32 FrameRateLimit = 24; - - //Max faces to track - UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="FaceDetector") - int32 NumFaces = 5; -}; diff --git a/Unreal/Plugins/AvatarCore_FaceDetector/Source/ThirdParty/FaceDetector.exe b/Unreal/Plugins/AvatarCore_FaceDetector/Source/ThirdParty/FaceDetector.exe deleted file mode 100644 index 64fe9e3..0000000 Binary files a/Unreal/Plugins/AvatarCore_FaceDetector/Source/ThirdParty/FaceDetector.exe and /dev/null differ diff --git a/Unreal/Plugins/AvatarCore_FaceDetector/Source/ThirdParty/blaze_face_short_range.tflite b/Unreal/Plugins/AvatarCore_FaceDetector/Source/ThirdParty/blaze_face_short_range.tflite deleted file mode 100644 index 1b2b522..0000000 Binary files a/Unreal/Plugins/AvatarCore_FaceDetector/Source/ThirdParty/blaze_face_short_range.tflite and /dev/null differ diff --git a/Unreal/Plugins/AvatarCore_FaceDetector/Source/ThirdParty/face_landmarker.task b/Unreal/Plugins/AvatarCore_FaceDetector/Source/ThirdParty/face_landmarker.task deleted file mode 100644 index c50c845..0000000 Binary files a/Unreal/Plugins/AvatarCore_FaceDetector/Source/ThirdParty/face_landmarker.task and /dev/null differ diff --git a/Unreal/Plugins/AvatarCore_FaceDetector/Source/ThirdParty/ffmpeg.exe b/Unreal/Plugins/AvatarCore_FaceDetector/Source/ThirdParty/ffmpeg.exe deleted file mode 100644 index bb2dbeb..0000000 Binary files a/Unreal/Plugins/AvatarCore_FaceDetector/Source/ThirdParty/ffmpeg.exe and /dev/null differ diff --git a/Unreal/Plugins/AvatarCore_FaceDetector/Source/ThirdParty/ffplay.exe b/Unreal/Plugins/AvatarCore_FaceDetector/Source/ThirdParty/ffplay.exe deleted file mode 100644 index a36cb9e..0000000 Binary files a/Unreal/Plugins/AvatarCore_FaceDetector/Source/ThirdParty/ffplay.exe and /dev/null differ diff --git a/Unreal/Plugins/AvatarCore_FaceDetector/Source/ThirdParty/ffprobe.exe b/Unreal/Plugins/AvatarCore_FaceDetector/Source/ThirdParty/ffprobe.exe deleted file mode 100644 index f06e311..0000000 Binary files a/Unreal/Plugins/AvatarCore_FaceDetector/Source/ThirdParty/ffprobe.exe and /dev/null differ diff --git a/Unreal/Plugins/AvatarCore_Manager/Content/AvatarCoreManager.uasset b/Unreal/Plugins/AvatarCore_Manager/Content/AvatarCoreManager.uasset index 736c529..e0b6040 100644 --- a/Unreal/Plugins/AvatarCore_Manager/Content/AvatarCoreManager.uasset +++ b/Unreal/Plugins/AvatarCore_Manager/Content/AvatarCoreManager.uasset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:ae3bedee154dca303956f65f074b402c1642c5b0cce0b1d0114b303d7d056adc -size 1720828 +oid sha256:c8395e1e60135aa4a7ab0cc0e0d9c65979692eca809cf9738f885d8a9ce3cb51 +size 1739559 diff --git a/Unreal/Plugins/AvatarCore_Manager/Content/StateManagement/BFL_ProjectHelper.uasset b/Unreal/Plugins/AvatarCore_Manager/Content/StateManagement/BFL_ProjectHelper.uasset index 323eb67..4141154 100644 --- a/Unreal/Plugins/AvatarCore_Manager/Content/StateManagement/BFL_ProjectHelper.uasset +++ b/Unreal/Plugins/AvatarCore_Manager/Content/StateManagement/BFL_ProjectHelper.uasset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:c86b0e06d695bf2a42554520c540712493ae2f4bcb20bd99825b46ac38e9787a -size 24641 +oid sha256:28ca6f971697adb60abc9218bcd65a24f0ed403d2fb0b40dabc0740c3226f9a9 +size 79194 diff --git a/Unreal/Plugins/AvatarCore_Manager/Content/StateManagement/BP_StateManager.uasset b/Unreal/Plugins/AvatarCore_Manager/Content/StateManagement/BP_StateManager.uasset index 6f09e83..9c3ca26 100644 --- a/Unreal/Plugins/AvatarCore_Manager/Content/StateManagement/BP_StateManager.uasset +++ b/Unreal/Plugins/AvatarCore_Manager/Content/StateManagement/BP_StateManager.uasset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:e7bd165631726013e2969e2f10230a4f7dc7c3af1ca4ccca8e62f628934e8236 -size 634459 +oid sha256:2d86a9c65d318f83d29a84e8dd966f00c6a3da4eddb21bd64e022c628ca9b85f +size 686648 diff --git a/Unreal/Plugins/AvatarCore_Manager/Content/StateManagement/Widgets/BP_LookAtTest.uasset b/Unreal/Plugins/AvatarCore_Manager/Content/StateManagement/Widgets/BP_LookAtTest.uasset new file mode 100644 index 0000000..dda5424 --- /dev/null +++ b/Unreal/Plugins/AvatarCore_Manager/Content/StateManagement/Widgets/BP_LookAtTest.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:68a68d411ec89f21c3d9d1543ca24962e6c60970c0ea442b30044a199a7886da +size 30555 diff --git a/Unreal/Plugins/AvatarCore_Manager/Content/StateManagement/Widgets/W_Base_DynamicAvatarReaction.uasset b/Unreal/Plugins/AvatarCore_Manager/Content/StateManagement/Widgets/W_Base_DynamicAvatarReaction.uasset new file mode 100644 index 0000000..ff561cf --- /dev/null +++ b/Unreal/Plugins/AvatarCore_Manager/Content/StateManagement/Widgets/W_Base_DynamicAvatarReaction.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e90260cb087f825af1fcc79ad096593cc6b8b21e63fa104c3b9379703967f54d +size 81979 diff --git a/Unreal/Plugins/AvatarCore_Manager/Content/StateManagement/Widgets/W_TestAvatarLookAtWidgetCollection.uasset b/Unreal/Plugins/AvatarCore_Manager/Content/StateManagement/Widgets/W_TestAvatarLookAtWidgetCollection.uasset new file mode 100644 index 0000000..826f720 --- /dev/null +++ b/Unreal/Plugins/AvatarCore_Manager/Content/StateManagement/Widgets/W_TestAvatarLookAtWidgetCollection.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:568c4dfd36758b8f7eb9de9e55eb4cd80c4e1ec8950ba5cf656b64dcf9d04e7a +size 215755 diff --git a/Unreal/Plugins/AvatarCore_Manager/Content/Widgets/Debug/Pages/W_DebugAvatarCoreManager.uasset b/Unreal/Plugins/AvatarCore_Manager/Content/Widgets/Debug/Pages/W_DebugAvatarCoreManager.uasset index 7cdfd14..bbafc22 100644 --- a/Unreal/Plugins/AvatarCore_Manager/Content/Widgets/Debug/Pages/W_DebugAvatarCoreManager.uasset +++ b/Unreal/Plugins/AvatarCore_Manager/Content/Widgets/Debug/Pages/W_DebugAvatarCoreManager.uasset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:30a58d9b12843f58c00e4e665185db2d059d7f1011ba11e97d7eb9d8412a7b8b -size 115455 +oid sha256:a8e9e2e0a0338227ecb7f7cfce331989e06906459ce73a111218fc7472261413 +size 151904 diff --git a/Unreal/Plugins/AvatarCore_Manager/Content/n8n/BP_N8N_Connector.uasset b/Unreal/Plugins/AvatarCore_Manager/Content/n8n/BP_N8N_Connector.uasset new file mode 100644 index 0000000..7635bd6 --- /dev/null +++ b/Unreal/Plugins/AvatarCore_Manager/Content/n8n/BP_N8N_Connector.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:798aeec1d80776e179033c5db0bb19743a181d0eb95b343ac9c03012766f8f30 +size 246170 diff --git a/Unreal/Plugins/AvatarCore_Manager/Content/n8n/N8N_DebugPingCommand.uasset b/Unreal/Plugins/AvatarCore_Manager/Content/n8n/N8N_DebugPingCommand.uasset new file mode 100644 index 0000000..7d280cd --- /dev/null +++ b/Unreal/Plugins/AvatarCore_Manager/Content/n8n/N8N_DebugPingCommand.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8a4fedba6c298c3faebab560eb2552b22ef2b2f2a9f2e2ebb3696077b6714ee9 +size 102972 diff --git a/Unreal/Plugins/AvatarCore_Manager/Content/n8n/N8N_WebResearchCommand.uasset b/Unreal/Plugins/AvatarCore_Manager/Content/n8n/N8N_WebResearchCommand.uasset new file mode 100644 index 0000000..501f093 --- /dev/null +++ b/Unreal/Plugins/AvatarCore_Manager/Content/n8n/N8N_WebResearchCommand.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b767b8cdb58ba9511878ca5a64ca6f02ae0b10987193b1b3f5ec7befe6d8ec25 +size 104596 diff --git a/Unreal/Plugins/AvatarCore_Manager/Source/AvatarCore_Manager/Public/AvatarCore_ManagerEnums.h b/Unreal/Plugins/AvatarCore_Manager/Source/AvatarCore_Manager/Public/AvatarCore_ManagerEnums.h index 9813863..8a9a377 100644 --- a/Unreal/Plugins/AvatarCore_Manager/Source/AvatarCore_Manager/Public/AvatarCore_ManagerEnums.h +++ b/Unreal/Plugins/AvatarCore_Manager/Source/AvatarCore_Manager/Public/AvatarCore_ManagerEnums.h @@ -26,10 +26,10 @@ enum class EAvatarCoreModuleState : uint8 UENUM(BlueprintType) enum class EAvatarState : uint8 { - None UMETA(DisplayName = "None"), - Idle UMETA(DisplayName = "Avatar ready"), - Listening UMETA(DisplayName = "Avatar listening"), - Thinking UMETA(DisplayName = "Avatar thinking"), - Talking UMETA(DisplayName = "Avatar talking"), - Error UMETA(DisplayName = "Avatar is confused") + None UMETA(DisplayName = "None"), + Listening UMETA(DisplayName = "Avatar listening"), + Thinking UMETA(DisplayName = "Avatar thinking"), + Talking UMETA(DisplayName = "Avatar talking"), + IdleActive UMETA(DisplayName = "Avatar idle active"), + IdlePassive UMETA(DisplayName = "Avatar idle passive") }; \ No newline at end of file diff --git a/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/AnimBPs/AvatarCore_AnimInst_BodyRetarget.uasset b/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/AnimBPs/AvatarCore_AnimInst_BodyRetarget.uasset index 8ea7524..30da548 100644 --- a/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/AnimBPs/AvatarCore_AnimInst_BodyRetarget.uasset +++ b/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/AnimBPs/AvatarCore_AnimInst_BodyRetarget.uasset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:ac187717a3d75e6a3c0fea88d640da6307318296a831a5f097cee632d1c875e2 -size 345093 +oid sha256:35e0851e79bd53c8270025584190e250ae853190e13d1375542d83132c037d19 +size 524209 diff --git a/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/AnimBPs/AvatarCore_AnimInst_Face.uasset b/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/AnimBPs/AvatarCore_AnimInst_Face.uasset index 1858d91..dbf33e4 100644 --- a/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/AnimBPs/AvatarCore_AnimInst_Face.uasset +++ b/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/AnimBPs/AvatarCore_AnimInst_Face.uasset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:ccdab2c38023a1a5d8986bdcd212fadffcc01dd0f724769e774fd27feae00c5b -size 1852342 +oid sha256:9b4f1d0d75152f07b99049a2dd9e9babd13439ae3f08cc021701ad08c68acaac +size 1908385 diff --git a/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/AnimBPs/Curves/Nodding/CF_AvatarCore_Animation_Nodding_01.uasset b/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/AnimBPs/Curves/Nodding/CF_AvatarCore_Animation_Nodding_01.uasset new file mode 100644 index 0000000..a3c8df8 --- /dev/null +++ b/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/AnimBPs/Curves/Nodding/CF_AvatarCore_Animation_Nodding_01.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:00d793bec07938b00b2dac3084583a39ce9694e677c01b183982d8e753958cb3 +size 5586 diff --git a/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/AnimBPs/Curves/Nodding/CF_AvatarCore_Animation_Nodding_02.uasset b/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/AnimBPs/Curves/Nodding/CF_AvatarCore_Animation_Nodding_02.uasset new file mode 100644 index 0000000..d0efba0 --- /dev/null +++ b/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/AnimBPs/Curves/Nodding/CF_AvatarCore_Animation_Nodding_02.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:faaa146bbaad4bd415697cd7fe27b527d8b4ba2f378457078659004cf0031f2a +size 4436 diff --git a/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/AnimBPs/Curves/Nodding/CF_AvatarCore_Animation_Nodding_03.uasset b/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/AnimBPs/Curves/Nodding/CF_AvatarCore_Animation_Nodding_03.uasset new file mode 100644 index 0000000..b3ea579 --- /dev/null +++ b/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/AnimBPs/Curves/Nodding/CF_AvatarCore_Animation_Nodding_03.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f3e5f98b1464e23bbfd366a03a3429219b5be44abab4ef2210ee0c9437a59c2c +size 4329 diff --git a/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/AnimBPs/Curves/Nodding/CF_AvatarCore_Animation_Nodding_04.uasset b/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/AnimBPs/Curves/Nodding/CF_AvatarCore_Animation_Nodding_04.uasset new file mode 100644 index 0000000..5ffc15d --- /dev/null +++ b/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/AnimBPs/Curves/Nodding/CF_AvatarCore_Animation_Nodding_04.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f78725c4240ed611704cae262638e6b97896711dc68f47cf5528b7f5f32c435b +size 4357 diff --git a/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/AnimBPs/Curves/Nodding/CF_AvatarCore_Animation_Nodding_05.uasset b/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/AnimBPs/Curves/Nodding/CF_AvatarCore_Animation_Nodding_05.uasset new file mode 100644 index 0000000..5ab5566 --- /dev/null +++ b/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/AnimBPs/Curves/Nodding/CF_AvatarCore_Animation_Nodding_05.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3398d18ee47d963f9d4632e9cf5bc911b38abaf13c9abce69ab36f9821083dde +size 4195 diff --git a/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/AnimBPs/Curves/Nodding/CF_AvatarCore_Animation_Nodding_06.uasset b/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/AnimBPs/Curves/Nodding/CF_AvatarCore_Animation_Nodding_06.uasset new file mode 100644 index 0000000..ab82c2d --- /dev/null +++ b/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/AnimBPs/Curves/Nodding/CF_AvatarCore_Animation_Nodding_06.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7917e2fd5b18410f69a6ae3455936e1b46e2312409d6a257d7f939bc970e40b3 +size 4344 diff --git a/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/AnimBPs/Curves/Nodding/CF_AvatarCore_Animation_Nodding_07.uasset b/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/AnimBPs/Curves/Nodding/CF_AvatarCore_Animation_Nodding_07.uasset new file mode 100644 index 0000000..93fe9fd --- /dev/null +++ b/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/AnimBPs/Curves/Nodding/CF_AvatarCore_Animation_Nodding_07.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:81be01f1b4b3efe6e49e3aa68eac2e9c01e1c89f56158880ce37f08dff10a275 +size 4283 diff --git a/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/AnimBPs/Curves/Nodding/CF_AvatarCore_Animation_Nodding_08.uasset b/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/AnimBPs/Curves/Nodding/CF_AvatarCore_Animation_Nodding_08.uasset new file mode 100644 index 0000000..d2e55e4 --- /dev/null +++ b/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/AnimBPs/Curves/Nodding/CF_AvatarCore_Animation_Nodding_08.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ca6fa810a1a09c12587502990b311550326923efd16a2bddef8f2059db96386b +size 4226 diff --git a/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/AnimBPs/Curves/Nodding/CF_AvatarCore_Animation_Nodding_09.uasset b/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/AnimBPs/Curves/Nodding/CF_AvatarCore_Animation_Nodding_09.uasset new file mode 100644 index 0000000..cbe3fa8 --- /dev/null +++ b/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/AnimBPs/Curves/Nodding/CF_AvatarCore_Animation_Nodding_09.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6855b50c57a26ff34aed05ca7e08560bbfa6eacce2c1c22c16c9d237c0559dbd +size 4284 diff --git a/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/AnimBPs/Interface/BI_AvatarAnimBP.uasset b/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/AnimBPs/Interface/BI_AvatarAnimBP.uasset index 52eff72..3df2039 100644 --- a/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/AnimBPs/Interface/BI_AvatarAnimBP.uasset +++ b/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/AnimBPs/Interface/BI_AvatarAnimBP.uasset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:f8534574dba4734f8077e635267dc893ceef46db98d0eb385ffb9b34143a55f6 -size 56762 +oid sha256:f93e61f75d51cc493885586df1ce74bb378e34093259c705be70ce36b589f574 +size 62307 diff --git a/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/AnimationConfigs/AnimationConfig.uasset b/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/AnimationConfigs/AnimationConfig.uasset index 16088b0..39415c4 100644 --- a/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/AnimationConfigs/AnimationConfig.uasset +++ b/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/AnimationConfigs/AnimationConfig.uasset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:775fb9f07b16139012eaf7bc82d10b73045ffdcaaa8ccfd4fe126cd61b365ce5 -size 27015 +oid sha256:c84ec7141745b11dbffe5f5d321e356eba245e5687a390697d81dbb805d257ae +size 25937 diff --git a/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/AnimationConfigs/AnimationConfig_Base.uasset b/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/AnimationConfigs/AnimationConfig_Base.uasset index 1521686..ab04f50 100644 --- a/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/AnimationConfigs/AnimationConfig_Base.uasset +++ b/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/AnimationConfigs/AnimationConfig_Base.uasset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:56871740e738ef5a8ed803c9de8ba2fb8594c66f705a80d4f07ffe5d5924da3a -size 22300 +oid sha256:a3ecf0febf137ad1f89abaeb62fc2289b4458498342835d4d3b3c4758e0ef0ed +size 24697 diff --git a/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/Idle/AS_LL_JG_01_Idle_02_adjusted.uasset b/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/Idle/AS_LL_JG_01_Idle_02_adjusted.uasset deleted file mode 100644 index 415c674..0000000 --- a/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/Idle/AS_LL_JG_01_Idle_02_adjusted.uasset +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6b3323d450e4356206dfc7ca052406cf0e30306364b3b64013e420d27cec8b8f -size 48237449 diff --git a/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/Idle/AS_LL_JG_01_Idle_03_adjusted.uasset b/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/Idle/AS_LL_JG_01_Idle_03_adjusted.uasset deleted file mode 100644 index c4f01e0..0000000 --- a/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/Idle/AS_LL_JG_01_Idle_03_adjusted.uasset +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b5dd31e4bb1c060a363b36cb38417e720d0771c92971caa4dae3caa5a3defb2d -size 40872699 diff --git a/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/Idle/AS_LL_JG_01_Idle_04_adjusted.uasset b/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/Idle/AS_LL_JG_01_Idle_04_adjusted.uasset deleted file mode 100644 index 09e6571..0000000 --- a/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/Idle/AS_LL_JG_01_Idle_04_adjusted.uasset +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:50b5d09cd33808fbc317d5fd8b5479ad46ead71bf12ef45dcd160be97ba7791a -size 28351753 diff --git a/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/Idle/AS_LL_JG_01_Idle_06_adjusted.uasset b/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/Idle/AS_LL_JG_01_Idle_06_adjusted.uasset deleted file mode 100644 index 32f8b01..0000000 --- a/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/Idle/AS_LL_JG_01_Idle_06_adjusted.uasset +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:aa57d8c3a1b731998359ba4530eb216a91ca21a04bbfadf5b0be8c0079c5b6d2 -size 41138893 diff --git a/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/Idle/AS_LL_JG_01_Idle_09_adjusted.uasset b/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/Idle/AS_LL_JG_01_Idle_09_adjusted.uasset deleted file mode 100644 index 765f67a..0000000 --- a/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/Idle/AS_LL_JG_01_Idle_09_adjusted.uasset +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ebd862d8754699fc858fb2ef7d24591985b3e30c728342efe20fbab0739b2e99 -size 23172030 diff --git a/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/Idle/AS_LL_JG_01_Idle_16.uasset b/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/Idle/AS_LL_JG_01_Idle_16.uasset deleted file mode 100644 index a6be0db..0000000 --- a/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/Idle/AS_LL_JG_01_Idle_16.uasset +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e33b9d4fd4407c6925f049e524cd6a5da63c9c8a4c135b4d84f790144ede4971 -size 1697034 diff --git a/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/Idle/AS_LL_JG_01_Idle_23_adjusted.uasset b/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/Idle/AS_LL_JG_01_Idle_23_adjusted.uasset deleted file mode 100644 index 24b1a4e..0000000 --- a/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/Idle/AS_LL_JG_01_Idle_23_adjusted.uasset +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:795aa34469e7ee341d7fc83cdf098c5bb0fe95699dbb091570d7caa8f4e79866 -size 19991660 diff --git a/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/Idle/AS_LL_JG_01_Idle_25_adjusted.uasset b/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/Idle/AS_LL_JG_01_Idle_25_adjusted.uasset deleted file mode 100644 index 8588996..0000000 --- a/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/Idle/AS_LL_JG_01_Idle_25_adjusted.uasset +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b3927b42979503bc5641306db2d346adccde3a8d52a7b6e2c77f45be064d8185 -size 38115377 diff --git a/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/Idle/AS_MC_Tim_02_Take08_Anim01_Idle_Cascadeur.uasset b/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/Idle/AS_MC_Tim_02_Take08_Anim01_Idle_Cascadeur.uasset deleted file mode 100644 index 9ef828c..0000000 --- a/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/Idle/AS_MC_Tim_02_Take08_Anim01_Idle_Cascadeur.uasset +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:72ed4883d618a029366c7bea668e85dc13735165522423955dc66b19b38b6ab2 -size 3325058 diff --git a/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/Idle/AS_MC_Tim_02_Take08_Anim02_Idle_Cascadeur.uasset b/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/Idle/AS_MC_Tim_02_Take08_Anim02_Idle_Cascadeur.uasset deleted file mode 100644 index 2339bdd..0000000 --- a/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/Idle/AS_MC_Tim_02_Take08_Anim02_Idle_Cascadeur.uasset +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9cf577111d93682e5cadd2ec5ecf210139aef271eb400f6a608e024a4fc3f438 -size 3180579 diff --git a/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/Idle/AS_MC_Tim_02_Take08_Anim02_LongIdle_Cut_Cascadeur.uasset b/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/Idle/AS_MC_Tim_02_Take08_Anim02_LongIdle_Cut_Cascadeur.uasset deleted file mode 100644 index 2b0c2a5..0000000 --- a/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/Idle/AS_MC_Tim_02_Take08_Anim02_LongIdle_Cut_Cascadeur.uasset +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e57792f1b719152a7a9d2d60eee8fd5fc7a41b983be44b8ea16db5abcf64ecdc -size 4129992 diff --git a/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/Idle/AS_MC_Tim_02_Take12_Anim02_Idle_Cascadeur.uasset b/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/Idle/AS_MC_Tim_02_Take12_Anim02_Idle_Cascadeur.uasset deleted file mode 100644 index 0e05f81..0000000 --- a/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/Idle/AS_MC_Tim_02_Take12_Anim02_Idle_Cascadeur.uasset +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f98ba15e2dfa2d00161a081aa06f7e2bc98ebfb3bde5609c7cbe1ae98adfc6cd -size 2457523 diff --git a/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/IdleActive/AS_LL_JG_01_Idle_02_adjusted.uasset b/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/IdleActive/AS_LL_JG_01_Idle_02_adjusted.uasset new file mode 100644 index 0000000..de24a34 --- /dev/null +++ b/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/IdleActive/AS_LL_JG_01_Idle_02_adjusted.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:35a487503644d7e2d4c246bc9db5c8179d3bd73fb54b4203bb5eb6de4c568e08 +size 49188648 diff --git a/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/IdleActive/AS_LL_JG_01_Idle_03_adjusted.uasset b/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/IdleActive/AS_LL_JG_01_Idle_03_adjusted.uasset new file mode 100644 index 0000000..4f3ac1f --- /dev/null +++ b/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/IdleActive/AS_LL_JG_01_Idle_03_adjusted.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ec1bc4d4629ee121a1dac86a7c8d6dfb86d7bb93156319c79a83878b8c493f71 +size 41641234 diff --git a/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/IdleActive/AS_LL_JG_01_Idle_04_adjusted.uasset b/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/IdleActive/AS_LL_JG_01_Idle_04_adjusted.uasset new file mode 100644 index 0000000..1a062c0 --- /dev/null +++ b/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/IdleActive/AS_LL_JG_01_Idle_04_adjusted.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f4b4b760166956fdc31389d29b39812fe349bcb49a154c6d986a2258b9610ba0 +size 29008652 diff --git a/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/IdleActive/AS_LL_JG_01_Idle_06_adjusted.uasset b/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/IdleActive/AS_LL_JG_01_Idle_06_adjusted.uasset new file mode 100644 index 0000000..91519c2 --- /dev/null +++ b/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/IdleActive/AS_LL_JG_01_Idle_06_adjusted.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:485f7ff28f0d38c65dfc719491db01047094d27b0e3ce4c8ffe0dfa01a0ff92f +size 41952554 diff --git a/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/IdleActive/AS_LL_JG_01_Idle_09_adjusted.uasset b/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/IdleActive/AS_LL_JG_01_Idle_09_adjusted.uasset new file mode 100644 index 0000000..f375b89 --- /dev/null +++ b/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/IdleActive/AS_LL_JG_01_Idle_09_adjusted.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:81db0be0fca42491e3ba2ad132e21ca13b100492c47b08d36b3f26caa7c2234c +size 23666542 diff --git a/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/IdleActive/AS_LL_JG_01_Idle_16.uasset b/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/IdleActive/AS_LL_JG_01_Idle_16.uasset new file mode 100644 index 0000000..ade62d5 --- /dev/null +++ b/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/IdleActive/AS_LL_JG_01_Idle_16.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4bf2478f6ecfb0c56f5d2470d3e281772788897aa9bbf72058be93564d18ec0f +size 2020702 diff --git a/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/IdleActive/AS_LL_JG_01_Idle_23_adjusted.uasset b/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/IdleActive/AS_LL_JG_01_Idle_23_adjusted.uasset new file mode 100644 index 0000000..670b25b --- /dev/null +++ b/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/IdleActive/AS_LL_JG_01_Idle_23_adjusted.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:803f9c502c6cd1d6e08bddb74d85b466dfa3aeb53a357207da92f806783db801 +size 20488845 diff --git a/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/IdleActive/AS_LL_JG_01_Idle_25_adjusted.uasset b/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/IdleActive/AS_LL_JG_01_Idle_25_adjusted.uasset new file mode 100644 index 0000000..27ce329 --- /dev/null +++ b/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/IdleActive/AS_LL_JG_01_Idle_25_adjusted.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f88cb4c4200543f780c0087e8f80197a820f3f7b805e8e2f0c1bc65e5d263fe9 +size 38857272 diff --git a/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/IdleActive/AS_MC_Tim_02_Take08_Anim01_Idle_Cascadeur.uasset b/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/IdleActive/AS_MC_Tim_02_Take08_Anim01_Idle_Cascadeur.uasset new file mode 100644 index 0000000..8e8c10b --- /dev/null +++ b/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/IdleActive/AS_MC_Tim_02_Take08_Anim01_Idle_Cascadeur.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:824a1ebb00e304abee8f415e9c230ce2e14b823503356d144d293568c1c43ec9 +size 3325070 diff --git a/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/IdleActive/AS_MC_Tim_02_Take08_Anim02_Idle_Cascadeur.uasset b/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/IdleActive/AS_MC_Tim_02_Take08_Anim02_Idle_Cascadeur.uasset new file mode 100644 index 0000000..b3dab06 --- /dev/null +++ b/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/IdleActive/AS_MC_Tim_02_Take08_Anim02_Idle_Cascadeur.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:84a13ba6505ce4a8ae113879d77abf6f82abaa0f2d08683b9fd3b9414cafe1b8 +size 3180591 diff --git a/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/IdleActive/AS_MC_Tim_02_Take08_Anim02_LongIdle_Cut_Cascadeur.uasset b/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/IdleActive/AS_MC_Tim_02_Take08_Anim02_LongIdle_Cut_Cascadeur.uasset new file mode 100644 index 0000000..72d6cbe --- /dev/null +++ b/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/IdleActive/AS_MC_Tim_02_Take08_Anim02_LongIdle_Cut_Cascadeur.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:759c40211f11c451617a1c53e62fb550f17da8dae412d8b598cc4cfd4c3512ca +size 4130004 diff --git a/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/IdleActive/AS_MC_Tim_02_Take12_Anim02_Idle_Cascadeur.uasset b/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/IdleActive/AS_MC_Tim_02_Take12_Anim02_Idle_Cascadeur.uasset new file mode 100644 index 0000000..e17bfe8 --- /dev/null +++ b/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/IdleActive/AS_MC_Tim_02_Take12_Anim02_Idle_Cascadeur.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7c857b3b8c2450e221f04a92f620e91b1742aa5b1a3bbe10dec53846f1a65e5f +size 2457535 diff --git a/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/IdlePassive/AS_LL_JG_01_Idle_01_Wink.uasset b/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/IdlePassive/AS_LL_JG_01_Idle_01_Wink.uasset new file mode 100644 index 0000000..72756d3 --- /dev/null +++ b/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/IdlePassive/AS_LL_JG_01_Idle_01_Wink.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:164559d4cc825f698a46ab913fc66b17292a900f0a3d59c9a0e5a7ef74b92ef1 +size 1860885 diff --git a/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/IdlePassive/AS_LL_JG_01_Idle_02_adjusted.uasset b/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/IdlePassive/AS_LL_JG_01_Idle_02_adjusted.uasset new file mode 100644 index 0000000..d391327 --- /dev/null +++ b/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/IdlePassive/AS_LL_JG_01_Idle_02_adjusted.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2eda112fb3c0fbaa3b800fe7599848e315bcc13c959c0254a8971435bcc19d43 +size 49188650 diff --git a/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/IdlePassive/AS_LL_JG_01_Idle_03_adjusted.uasset b/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/IdlePassive/AS_LL_JG_01_Idle_03_adjusted.uasset new file mode 100644 index 0000000..93a89fe --- /dev/null +++ b/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/IdlePassive/AS_LL_JG_01_Idle_03_adjusted.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:866e0f952f3fe22279cd64948888a856b4652948cd22d93a6a6bb1729383fc68 +size 41641235 diff --git a/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/IdlePassive/AS_LL_JG_01_Idle_04_adjusted.uasset b/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/IdlePassive/AS_LL_JG_01_Idle_04_adjusted.uasset new file mode 100644 index 0000000..430e11d --- /dev/null +++ b/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/IdlePassive/AS_LL_JG_01_Idle_04_adjusted.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5e962612df3894cf2010b9f83fee8fc32a8cbaeb83c8eba0068f51b1163a155c +size 29008658 diff --git a/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/IdlePassive/AS_LL_JG_01_Idle_06_adjusted.uasset b/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/IdlePassive/AS_LL_JG_01_Idle_06_adjusted.uasset new file mode 100644 index 0000000..c2ecd55 --- /dev/null +++ b/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/IdlePassive/AS_LL_JG_01_Idle_06_adjusted.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:872674e3bf9183e5e9ea92e38dc07a4ade9b0e90b6dfb5b568305a3330327172 +size 41952557 diff --git a/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/IdlePassive/AS_LL_JG_01_Idle_07_Eyebrows.uasset b/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/IdlePassive/AS_LL_JG_01_Idle_07_Eyebrows.uasset new file mode 100644 index 0000000..5df31c2 --- /dev/null +++ b/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/IdlePassive/AS_LL_JG_01_Idle_07_Eyebrows.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a1172a2a48f3971c3dd3448b450aec3d1d99f09a941479eaa3fb8c92847e8733 +size 2183117 diff --git a/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/IdlePassive/AS_LL_JG_01_Idle_08.uasset b/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/IdlePassive/AS_LL_JG_01_Idle_08.uasset new file mode 100644 index 0000000..ef444a9 --- /dev/null +++ b/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/IdlePassive/AS_LL_JG_01_Idle_08.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:37e4bc3e8e9eb0343cddbcc581aac56b76f82e7be0707a81a6c57038053a4aa7 +size 3073020 diff --git a/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/IdlePassive/AS_LL_JG_01_Idle_09_adjusted.uasset b/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/IdlePassive/AS_LL_JG_01_Idle_09_adjusted.uasset new file mode 100644 index 0000000..0acf86d --- /dev/null +++ b/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/IdlePassive/AS_LL_JG_01_Idle_09_adjusted.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f5291daca278e3b9710aa314b07fd781347e04ad57fa4d31d89451757600e5eb +size 23666547 diff --git a/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/IdlePassive/AS_LL_JG_01_Idle_10.uasset b/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/IdlePassive/AS_LL_JG_01_Idle_10.uasset new file mode 100644 index 0000000..3d98908 --- /dev/null +++ b/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/IdlePassive/AS_LL_JG_01_Idle_10.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9a304b12a333268b6a125f364171a478044929c12c7ed14f6f70c6c2dffde2b1 +size 2259370 diff --git a/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/IdlePassive/AS_LL_JG_01_Idle_11.uasset b/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/IdlePassive/AS_LL_JG_01_Idle_11.uasset new file mode 100644 index 0000000..4157ef1 --- /dev/null +++ b/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/IdlePassive/AS_LL_JG_01_Idle_11.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:80299ab9269aac3232e7567588d62ddee825f10d6aab1727cbbbc68f83d144fd +size 2229429 diff --git a/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/IdlePassive/AS_LL_JG_01_Idle_13.uasset b/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/IdlePassive/AS_LL_JG_01_Idle_13.uasset new file mode 100644 index 0000000..b794a44 --- /dev/null +++ b/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/IdlePassive/AS_LL_JG_01_Idle_13.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fb7b38a7f8d259cb88939ea758d217846eb45eaaccbaa05d2b3e9fcf24770557 +size 3650197 diff --git a/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/IdlePassive/AS_LL_JG_01_Idle_14.uasset b/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/IdlePassive/AS_LL_JG_01_Idle_14.uasset new file mode 100644 index 0000000..8b4b608 --- /dev/null +++ b/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/IdlePassive/AS_LL_JG_01_Idle_14.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ef2e45de7980ab0d63a17f8ace40889dc203c75b752abad8e2ad38e1233c79a7 +size 2021526 diff --git a/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/IdlePassive/AS_LL_JG_01_Idle_15.uasset b/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/IdlePassive/AS_LL_JG_01_Idle_15.uasset new file mode 100644 index 0000000..47dfd1e --- /dev/null +++ b/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/IdlePassive/AS_LL_JG_01_Idle_15.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5a94afc3391c1b0f6e126f8749c3826fee9b1e56aa42cbf2589373ee9b14295b +size 2301734 diff --git a/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/IdlePassive/AS_LL_JG_01_Idle_17.uasset b/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/IdlePassive/AS_LL_JG_01_Idle_17.uasset new file mode 100644 index 0000000..dd667aa --- /dev/null +++ b/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/IdlePassive/AS_LL_JG_01_Idle_17.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fab7992df4dce6597b8a93f6739ede3b445b9bdbb14b3c1e8cd5102cbd70432a +size 3078228 diff --git a/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/IdlePassive/AS_LL_JG_01_Idle_18_adjusted.uasset b/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/IdlePassive/AS_LL_JG_01_Idle_18_adjusted.uasset new file mode 100644 index 0000000..657e21d --- /dev/null +++ b/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/IdlePassive/AS_LL_JG_01_Idle_18_adjusted.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:da8fef90ddf4b3cafa6aad7c3c38118e94a7f7835893017c3c75b0008cd1eb01 +size 26241901 diff --git a/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/IdlePassive/AS_LL_JG_01_Idle_20.uasset b/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/IdlePassive/AS_LL_JG_01_Idle_20.uasset new file mode 100644 index 0000000..edbbfc0 --- /dev/null +++ b/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/IdlePassive/AS_LL_JG_01_Idle_20.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:18bcfef7257741f520180ebc279c1734162148f81b42b1baeac26f3cc6b54100 +size 2455911 diff --git a/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/IdlePassive/AS_LL_JG_01_Idle_23.uasset b/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/IdlePassive/AS_LL_JG_01_Idle_23.uasset new file mode 100644 index 0000000..10ec17a --- /dev/null +++ b/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/IdlePassive/AS_LL_JG_01_Idle_23.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:81786ff46c33daf26599cd4f16044b7b35e3f828b2bfedd231a04ed1baefaa91 +size 2296167 diff --git a/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/IdlePassive/AS_LL_JG_01_Idle_23_adjusted.uasset b/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/IdlePassive/AS_LL_JG_01_Idle_23_adjusted.uasset new file mode 100644 index 0000000..38613b8 --- /dev/null +++ b/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/IdlePassive/AS_LL_JG_01_Idle_23_adjusted.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d4ff5be481fea9b8e65e5808b4b913402697caaca370eaed61f3ff3cf0006469 +size 20488847 diff --git a/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/IdlePassive/AS_LL_JG_01_Idle_25.uasset b/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/IdlePassive/AS_LL_JG_01_Idle_25.uasset new file mode 100644 index 0000000..5904ef3 --- /dev/null +++ b/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/IdlePassive/AS_LL_JG_01_Idle_25.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2535c0d46463c12578bd3868a3a14184410ffdb8849ad7db5ec45d441a4920e1 +size 4133407 diff --git a/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/IdlePassive/AS_LL_JG_01_Idle_25_adjusted.uasset b/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/IdlePassive/AS_LL_JG_01_Idle_25_adjusted.uasset new file mode 100644 index 0000000..357a897 --- /dev/null +++ b/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/IdlePassive/AS_LL_JG_01_Idle_25_adjusted.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e7582b3f1e4e2f5a943bd48d5dcb0f411a15d97426d73b40da53dcde3c415d54 +size 38857274 diff --git a/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/IdlePassive/AS_LL_JG_01_Idle_26.uasset b/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/IdlePassive/AS_LL_JG_01_Idle_26.uasset new file mode 100644 index 0000000..99658e8 --- /dev/null +++ b/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/IdlePassive/AS_LL_JG_01_Idle_26.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c25f9af70b8e3643b25dd5a675819e74720ed7a6647c44bdd86d62f3c7f616eb +size 4165683 diff --git a/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/IdlePassive/AS_LL_JG_01_Idle_28_01.uasset b/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/IdlePassive/AS_LL_JG_01_Idle_28_01.uasset new file mode 100644 index 0000000..d429e4f --- /dev/null +++ b/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/IdlePassive/AS_LL_JG_01_Idle_28_01.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:261bb3a2b7bd84152dbe597a1031cc9909d595b09b9f8b1e4a79f34ebf03152e +size 6533351 diff --git a/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/IdlePassive/AS_LL_JG_01_Idle_28_02.uasset b/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/IdlePassive/AS_LL_JG_01_Idle_28_02.uasset new file mode 100644 index 0000000..f9550a8 --- /dev/null +++ b/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/IdlePassive/AS_LL_JG_01_Idle_28_02.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:065dfb1677f9c7bc9b147c2ebc78ca02647a631b61d4273899681550cf616469 +size 19296558 diff --git a/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/IdlePassive/AS_LL_JG_01_Listening_02_adjusted.uasset b/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/IdlePassive/AS_LL_JG_01_Listening_02_adjusted.uasset new file mode 100644 index 0000000..6f2bc26 --- /dev/null +++ b/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/IdlePassive/AS_LL_JG_01_Listening_02_adjusted.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:be13290d4c2cc1a23c8da27e9d3ac27b7794584395dd6cc0f2f693a52400963c +size 26662604 diff --git a/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/IdlePassive/AS_LL_JG_01_Listening_16_adjusted.uasset b/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/IdlePassive/AS_LL_JG_01_Listening_16_adjusted.uasset new file mode 100644 index 0000000..0959fca --- /dev/null +++ b/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/IdlePassive/AS_LL_JG_01_Listening_16_adjusted.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:105ebfd45adff6dad8002e760047bb48cccaa8077d09827e9d8e22a1596fa246 +size 23697924 diff --git a/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/IdlePassive/AS_LL_JG_01_Listening_17_adjusted.uasset b/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/IdlePassive/AS_LL_JG_01_Listening_17_adjusted.uasset new file mode 100644 index 0000000..60609db --- /dev/null +++ b/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/IdlePassive/AS_LL_JG_01_Listening_17_adjusted.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:485d55c42f4a62abdd313e602d703c33a73dec7bdce512fb7874bb02ccdd4001 +size 23367541 diff --git a/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/Listening/AS_LL_JG_01_Idle_04_adjusted.uasset b/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/Listening/AS_LL_JG_01_Idle_04_adjusted.uasset new file mode 100644 index 0000000..c11a6f6 --- /dev/null +++ b/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/Listening/AS_LL_JG_01_Idle_04_adjusted.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:28d257dfc97a207e5151e811c3e820af4c48489543c59dc0a2f4acad0a6e9238 +size 28351766 diff --git a/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/Listening/AS_LL_JG_01_Idle_06_adjusted.uasset b/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/Listening/AS_LL_JG_01_Idle_06_adjusted.uasset new file mode 100644 index 0000000..3ff73cb --- /dev/null +++ b/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/Listening/AS_LL_JG_01_Idle_06_adjusted.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3b7baf1b63ef0038cb1dffa151f30911acd5dfb84720560a7f115aef0895c637 +size 41138907 diff --git a/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/Listening/AS_MC_Tim_02_Take08_Anim01_Idle_Cascadeur.uasset b/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/Listening/AS_MC_Tim_02_Take08_Anim01_Idle_Cascadeur.uasset new file mode 100644 index 0000000..7fac6f3 --- /dev/null +++ b/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/Listening/AS_MC_Tim_02_Take08_Anim01_Idle_Cascadeur.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ffd669c0143f6c7d0c9d26194de16708ad44817153c1b2d4e8209319faa77bdf +size 3324984 diff --git a/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/Listening/AS_MC_Tim_02_Take08_Anim02_Idle_Cascadeur.uasset b/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/Listening/AS_MC_Tim_02_Take08_Anim02_Idle_Cascadeur.uasset new file mode 100644 index 0000000..f130e68 --- /dev/null +++ b/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/Listening/AS_MC_Tim_02_Take08_Anim02_Idle_Cascadeur.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d7b92453004caaf7cbbd178b81cf50431b30fb52ab5a38a1c3d2e0892e881fe7 +size 3180542 diff --git a/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/Listening/AS_MC_Tim_02_Take08_Anim02_LongIdle_Cut_Cascadeur.uasset b/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/Listening/AS_MC_Tim_02_Take08_Anim02_LongIdle_Cut_Cascadeur.uasset new file mode 100644 index 0000000..932fa0b --- /dev/null +++ b/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/Listening/AS_MC_Tim_02_Take08_Anim02_LongIdle_Cut_Cascadeur.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cdebeab1dac5995ae5f4b27d1864ef054be1ba081937592e377aa8a51c7ddc39 +size 4129956 diff --git a/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/Listening/AS_MC_Tim_02_Take12_Anim02_Idle_Cascadeur.uasset b/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/Listening/AS_MC_Tim_02_Take12_Anim02_Idle_Cascadeur.uasset new file mode 100644 index 0000000..270caa8 --- /dev/null +++ b/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/Listening/AS_MC_Tim_02_Take12_Anim02_Idle_Cascadeur.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:239424fe7b588d3d77540e413319079d7ec15ae6337272a249bdbe3af661876d +size 2457486 diff --git a/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/Thinking/AS_MC_Tim_02_Take05_Anim01_LookToSide_Cut_Cascadeur.uasset b/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/Thinking/AS_MC_Tim_02_Take05_Anim01_LookToSide_Cut_Cascadeur.uasset new file mode 100644 index 0000000..1b6398b --- /dev/null +++ b/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/Thinking/AS_MC_Tim_02_Take05_Anim01_LookToSide_Cut_Cascadeur.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:019cc388909ade3345ebe6898c1f3376cb24266926eae6a70aa1cf4f7b4fb109 +size 2880852 diff --git a/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/Thinking/AS_MC_Tim_02_Take05_Anim02_LookToSide_Cut_Cascadeur.uasset b/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/Thinking/AS_MC_Tim_02_Take05_Anim02_LookToSide_Cut_Cascadeur.uasset new file mode 100644 index 0000000..2dadcfc --- /dev/null +++ b/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/Thinking/AS_MC_Tim_02_Take05_Anim02_LookToSide_Cut_Cascadeur.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ffa716af62ee1da0b80846657254cd264affb8e73ba7a45b7302970eff2dccc0 +size 1522222 diff --git a/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/Thinking/AS_MC_Tim_02_Take09_Anim01_LookToSide_Cut_Cascadeur.uasset b/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/Thinking/AS_MC_Tim_02_Take09_Anim01_LookToSide_Cut_Cascadeur.uasset new file mode 100644 index 0000000..5f11aa3 --- /dev/null +++ b/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/Thinking/AS_MC_Tim_02_Take09_Anim01_LookToSide_Cut_Cascadeur.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6584519f1649dcdd91f8b68c38e5aa9020f12c43a15cf86a8d5ac6937a90307f +size 3184597 diff --git a/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/Thinking/AS_MC_Tim_02_Take09_Anim02_LookToSide_Cut_Cascadeur.uasset b/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/Thinking/AS_MC_Tim_02_Take09_Anim02_LookToSide_Cut_Cascadeur.uasset new file mode 100644 index 0000000..91df088 --- /dev/null +++ b/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/Thinking/AS_MC_Tim_02_Take09_Anim02_LookToSide_Cut_Cascadeur.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:332eec8bf8cf398eed84845eb29d9e5f1216b1d004c8fd572cc17446cb69f9f5 +size 1906806 diff --git a/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/VeryIdle/AS_LL_JG_01_Idle_01_Wink.uasset b/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/VeryIdle/AS_LL_JG_01_Idle_01_Wink.uasset deleted file mode 100644 index a7dc574..0000000 --- a/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/VeryIdle/AS_LL_JG_01_Idle_01_Wink.uasset +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9d05c6c6e034cab3390b9b70d1b461c52869d198490a2d06f3741c3f746e5e38 -size 1542515 diff --git a/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/VeryIdle/AS_LL_JG_01_Idle_02_adjusted.uasset b/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/VeryIdle/AS_LL_JG_01_Idle_02_adjusted.uasset deleted file mode 100644 index 39c7914..0000000 --- a/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/VeryIdle/AS_LL_JG_01_Idle_02_adjusted.uasset +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0ed86254f85d8e572b61bdbb345f171dd3e5a3f25c357f4db9f6cea527092963 -size 48237457 diff --git a/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/VeryIdle/AS_LL_JG_01_Idle_03_adjusted.uasset b/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/VeryIdle/AS_LL_JG_01_Idle_03_adjusted.uasset deleted file mode 100644 index 6aed4b9..0000000 --- a/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/VeryIdle/AS_LL_JG_01_Idle_03_adjusted.uasset +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f4832d78ad285bdcd409a8279fa5f5de0bf993d90eff17211347ca59d046644e -size 40872706 diff --git a/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/VeryIdle/AS_LL_JG_01_Idle_04_adjusted.uasset b/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/VeryIdle/AS_LL_JG_01_Idle_04_adjusted.uasset deleted file mode 100644 index ffcbf33..0000000 --- a/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/VeryIdle/AS_LL_JG_01_Idle_04_adjusted.uasset +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8c2fbac071d566bd69ef82f12c7fb3288398f71897a5431d5adbe49a6e6d2671 -size 28351765 diff --git a/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/VeryIdle/AS_LL_JG_01_Idle_06_adjusted.uasset b/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/VeryIdle/AS_LL_JG_01_Idle_06_adjusted.uasset deleted file mode 100644 index 30d55bc..0000000 --- a/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/VeryIdle/AS_LL_JG_01_Idle_06_adjusted.uasset +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:38f53aa1c618fd7c6686250ed463f5f7822b95fade701280e955a9404efaa9dc -size 41138902 diff --git a/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/VeryIdle/AS_LL_JG_01_Idle_07_Eyebrows.uasset b/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/VeryIdle/AS_LL_JG_01_Idle_07_Eyebrows.uasset deleted file mode 100644 index ae866f1..0000000 --- a/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/VeryIdle/AS_LL_JG_01_Idle_07_Eyebrows.uasset +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:857c4db661a8a39d27814f69d5527a6aa5ffc48091dca9f3bc40650c21a198b3 -size 1836424 diff --git a/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/VeryIdle/AS_LL_JG_01_Idle_08.uasset b/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/VeryIdle/AS_LL_JG_01_Idle_08.uasset deleted file mode 100644 index d864a0f..0000000 --- a/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/VeryIdle/AS_LL_JG_01_Idle_08.uasset +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b57ca20233e39f5a96852b7297d5d66a9b8f1ebc3cb2a5023019220a243b3ec1 -size 2625374 diff --git a/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/VeryIdle/AS_LL_JG_01_Idle_09_adjusted.uasset b/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/VeryIdle/AS_LL_JG_01_Idle_09_adjusted.uasset deleted file mode 100644 index 4ffc728..0000000 --- a/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/VeryIdle/AS_LL_JG_01_Idle_09_adjusted.uasset +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f60ddd3c58b46860f50e6b84063fd0587b1e021d8bfd3ae048f3636df7ac2ff6 -size 23172041 diff --git a/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/VeryIdle/AS_LL_JG_01_Idle_10.uasset b/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/VeryIdle/AS_LL_JG_01_Idle_10.uasset deleted file mode 100644 index 4c75df5..0000000 --- a/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/VeryIdle/AS_LL_JG_01_Idle_10.uasset +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9060b046b3c0a61b57877bcc71d238a0404661a9779e07b466cc2edc161a7e7b -size 1898259 diff --git a/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/VeryIdle/AS_LL_JG_01_Idle_11.uasset b/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/VeryIdle/AS_LL_JG_01_Idle_11.uasset deleted file mode 100644 index a514a50..0000000 --- a/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/VeryIdle/AS_LL_JG_01_Idle_11.uasset +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4e224ae774cdab54379bc65c28015145260a08eb84b1b11e00eb4a5914dbeb4c -size 1867400 diff --git a/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/VeryIdle/AS_LL_JG_01_Idle_13.uasset b/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/VeryIdle/AS_LL_JG_01_Idle_13.uasset deleted file mode 100644 index 5a2e59c..0000000 --- a/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/VeryIdle/AS_LL_JG_01_Idle_13.uasset +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:36327a1dcaeaedf0f7bb38c4eae356cbc368ac143930aee6fd6437abde000989 -size 3120471 diff --git a/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/VeryIdle/AS_LL_JG_01_Idle_14.uasset b/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/VeryIdle/AS_LL_JG_01_Idle_14.uasset deleted file mode 100644 index 917f47b..0000000 --- a/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/VeryIdle/AS_LL_JG_01_Idle_14.uasset +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9fa502d6e1daacb57e9cefb175d1ddbad06b066e09032cca85864e0da11bcfa7 -size 1697162 diff --git a/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/VeryIdle/AS_LL_JG_01_Idle_15.uasset b/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/VeryIdle/AS_LL_JG_01_Idle_15.uasset deleted file mode 100644 index 02dc8f1..0000000 --- a/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/VeryIdle/AS_LL_JG_01_Idle_15.uasset +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e32d6ebf674affc4ccc2ef81b8a9db9e5b020192f6e9d993026d3d3b44e6c265 -size 1944727 diff --git a/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/VeryIdle/AS_LL_JG_01_Idle_17.uasset b/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/VeryIdle/AS_LL_JG_01_Idle_17.uasset deleted file mode 100644 index 2c23d3c..0000000 --- a/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/VeryIdle/AS_LL_JG_01_Idle_17.uasset +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3d3a2f64a794cd9cc325d8f017f56a8fc6dd91ebb9596d303784541b9decf843 -size 2625533 diff --git a/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/VeryIdle/AS_LL_JG_01_Idle_18_adjusted.uasset b/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/VeryIdle/AS_LL_JG_01_Idle_18_adjusted.uasset deleted file mode 100644 index eaf35d1..0000000 --- a/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/VeryIdle/AS_LL_JG_01_Idle_18_adjusted.uasset +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:251cd4f49e9bad8e130d5dd11495d54c2f017114c0075878373141cf9b87fb46 -size 25655514 diff --git a/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/VeryIdle/AS_LL_JG_01_Idle_20.uasset b/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/VeryIdle/AS_LL_JG_01_Idle_20.uasset deleted file mode 100644 index 9659639..0000000 --- a/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/VeryIdle/AS_LL_JG_01_Idle_20.uasset +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ebc1b09899cc710073a05df5461f078fa209c939d1bffff1c2b70dcfa90f651c -size 2083946 diff --git a/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/VeryIdle/AS_LL_JG_01_Idle_23.uasset b/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/VeryIdle/AS_LL_JG_01_Idle_23.uasset deleted file mode 100644 index 7124b05..0000000 --- a/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/VeryIdle/AS_LL_JG_01_Idle_23.uasset +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:18329ebb46d4b9064b7b499b7842c52d8b6a29679d7301e0cc139e623630f9b1 -size 1926551 diff --git a/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/VeryIdle/AS_LL_JG_01_Idle_25.uasset b/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/VeryIdle/AS_LL_JG_01_Idle_25.uasset deleted file mode 100644 index 865a64b..0000000 --- a/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/VeryIdle/AS_LL_JG_01_Idle_25.uasset +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6e9dab8ce5b231554b0412cc3eab3ff651d11d62757b663ba8b375887d3d8754 -size 3553650 diff --git a/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/VeryIdle/AS_LL_JG_01_Idle_26.uasset b/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/VeryIdle/AS_LL_JG_01_Idle_26.uasset deleted file mode 100644 index 1003d4a..0000000 --- a/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/VeryIdle/AS_LL_JG_01_Idle_26.uasset +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2252f5e7431e891289dc0b5b593dbadc2e2c6a95e92678fc40db5112431652ac -size 3569132 diff --git a/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/VeryIdle/AS_LL_JG_01_Idle_28_01.uasset b/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/VeryIdle/AS_LL_JG_01_Idle_28_01.uasset deleted file mode 100644 index 2eeb2ae..0000000 --- a/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/VeryIdle/AS_LL_JG_01_Idle_28_01.uasset +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9c6b38b02926a3d3f9ccd73c7dc241d037bea5476a8ab11a3baeec1d1cc874ad -size 5657647 diff --git a/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/VeryIdle/AS_LL_JG_01_Idle_28_02.uasset b/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/VeryIdle/AS_LL_JG_01_Idle_28_02.uasset deleted file mode 100644 index 364fccf..0000000 --- a/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/Animations/VeryIdle/AS_LL_JG_01_Idle_28_02.uasset +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:29be6c526bd671db2b08ce243c5f8cb0b7bdfef9d042750871820f17cb8e4d29 -size 16734920 diff --git a/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/ControlRig/CR_AvatarCore_Body.uasset b/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/ControlRig/CR_AvatarCore_Body.uasset index 34f6719..52d97b4 100644 --- a/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/ControlRig/CR_AvatarCore_Body.uasset +++ b/Unreal/Plugins/AvatarCore_MetaHuman/Content/Animation/ControlRig/CR_AvatarCore_Body.uasset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:f9db4685a68c739dd1f88bd197cffa1b7f0b07f3e230019c4bd2834e2a2a2d64 -size 2028497 +oid sha256:fbd548c88d615159388ef09dc951a196e1adc5c5ad80289bcb826714f8b8799e +size 2398517 diff --git a/Unreal/Plugins/AvatarCore_MetaHuman/Content/BP/MetaHuman/AvatarBase.uasset b/Unreal/Plugins/AvatarCore_MetaHuman/Content/BP/MetaHuman/AvatarBase.uasset index 5b8dee5..6831f5d 100644 --- a/Unreal/Plugins/AvatarCore_MetaHuman/Content/BP/MetaHuman/AvatarBase.uasset +++ b/Unreal/Plugins/AvatarCore_MetaHuman/Content/BP/MetaHuman/AvatarBase.uasset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:9508511ff13c2fe9f14cfb35360dd9ccd17702279e9de92ef97b67d8b3978d22 -size 1830347 +oid sha256:64b36f976e9a0d8ef23118e2d9188891b10795d12a0bb3a9de29ca54c66cb8ca +size 1894619 diff --git a/Unreal/Plugins/AvatarCore_MetaHuman/Content/BP/PersonalityConfig/PDA_PersonalityConfig.uasset b/Unreal/Plugins/AvatarCore_MetaHuman/Content/BP/PersonalityConfig/PDA_PersonalityConfig.uasset index 3dc8555..7a373cd 100644 --- a/Unreal/Plugins/AvatarCore_MetaHuman/Content/BP/PersonalityConfig/PDA_PersonalityConfig.uasset +++ b/Unreal/Plugins/AvatarCore_MetaHuman/Content/BP/PersonalityConfig/PDA_PersonalityConfig.uasset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:c7aa7f75bbe226246d873641b73f6ab5561324df82d24fd1f30eb6e748a4d419 -size 24786 +oid sha256:a79c293300aa503b129f3b1a4989fe2287e1d70ea9adc7343521ea6000ceb411 +size 26271 diff --git a/Unreal/Plugins/AvatarCore_MetaHuman/Content/BP/StructsAndEnums/E_AnimationType.uasset b/Unreal/Plugins/AvatarCore_MetaHuman/Content/BP/StructsAndEnums/E_AnimationType.uasset index 224e279..0e5c244 100644 --- a/Unreal/Plugins/AvatarCore_MetaHuman/Content/BP/StructsAndEnums/E_AnimationType.uasset +++ b/Unreal/Plugins/AvatarCore_MetaHuman/Content/BP/StructsAndEnums/E_AnimationType.uasset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:d4b64877a8ba5906336a920d7b1986b2153748997003efb7959a07e8bbcf6083 -size 4582 +oid sha256:3b954f599c508714dbf30934ab736f4b671b7586b9677f2e635084a7de28473d +size 5301 diff --git a/Unreal/Plugins/AvatarCore_MetaHuman/Content/BP/StructsAndEnums/E_LookTargetType.uasset b/Unreal/Plugins/AvatarCore_MetaHuman/Content/BP/StructsAndEnums/E_LookTargetType.uasset index 6c81a33..aaf638b 100644 --- a/Unreal/Plugins/AvatarCore_MetaHuman/Content/BP/StructsAndEnums/E_LookTargetType.uasset +++ b/Unreal/Plugins/AvatarCore_MetaHuman/Content/BP/StructsAndEnums/E_LookTargetType.uasset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:663563fa67c12420254b36aa274b3c593c2e7ec43c68404638aee853c98d5298 -size 2565 +oid sha256:d25cc4e34257469383ee546c5efed6a8fbf0aa24a6517a31c3444c0104794ff6 +size 2350 diff --git a/Unreal/Plugins/AvatarCore_MetaHuman/Content/BP/StructsAndEnums/S_AnimAsset.uasset b/Unreal/Plugins/AvatarCore_MetaHuman/Content/BP/StructsAndEnums/S_AnimAsset.uasset index e12200d..461e491 100644 --- a/Unreal/Plugins/AvatarCore_MetaHuman/Content/BP/StructsAndEnums/S_AnimAsset.uasset +++ b/Unreal/Plugins/AvatarCore_MetaHuman/Content/BP/StructsAndEnums/S_AnimAsset.uasset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:843547cce2c0f3aa6566c1d9be0dcc2d7ada0fd219fbffc1f744afaad282b896 -size 8592 +oid sha256:dfa83be53eee42b26d74aa77b57a411233b84198a63c7b145f3a2375a1fd9ca2 +size 7531 diff --git a/Unreal/Plugins/AvatarCore_TTS/Source/AvatarCore_TTS/Private/Cartesia/CartesiaTTSManager.cpp b/Unreal/Plugins/AvatarCore_TTS/Source/AvatarCore_TTS/Private/Cartesia/CartesiaTTSManager.cpp new file mode 100644 index 0000000..aeee923 --- /dev/null +++ b/Unreal/Plugins/AvatarCore_TTS/Source/AvatarCore_TTS/Private/Cartesia/CartesiaTTSManager.cpp @@ -0,0 +1,396 @@ +// Fill out your copyright notice in the Description page of Project Settings. + + +#include "Cartesia/CartesiaTTSManager.h" + +#include "WebSocketsModule.h" +#include "IWebSocket.h" +#include "Async/Async.h" +#include "Dom/JsonObject.h" +#include "Serialization/JsonSerializer.h" +#include "Serialization/JsonWriter.h" +#include "Misc/Base64.h" +#include "Misc/ScopeLock.h" +#include "Misc/Guid.h" +#include "Modules/ModuleManager.h" + +namespace +{ + static FString SerializeJson(const TSharedPtr& Obj) + { + FString Out; + TSharedRef> Writer = TJsonWriterFactory<>::Create(&Out); + FJsonSerializer::Serialize(Obj.ToSharedRef(), Writer); + return Out; + } +} + +FString UCartesiaTTSManager::BuildWebSocketUrl() const +{ + const FString Base = (CartesiaTTSConfig && !CartesiaTTSConfig->CartesiaBaseURI.IsEmpty()) ? CartesiaTTSConfig->CartesiaBaseURI : TEXT("api.cartesia.ai"); + return FString::Printf(TEXT("wss://%s/tts/websocket"), *Base); +} + +FString UCartesiaTTSManager::GetOrCreateContextId(int32 TaskID) +{ + { + FScopeLock Lock(&SocketsCS); + if (const FString* Found = TaskContextIds.Find(TaskID)) + { + return *Found; + } + } + + const FString NewId = FString::Printf(TEXT("task-%d-%s"), TaskID, *FGuid::NewGuid().ToString(EGuidFormats::Digits)); + { + FScopeLock Lock(&SocketsCS); + TaskContextIds.Add(TaskID, NewId); + } + return NewId; +} + +void UCartesiaTTSManager::InitTTSManager(UTTSBaseConfig* InTSSConfig, bool DebugMode) +{ + UTTSManagerBase::InitTTSManager(InTSSConfig, DebugMode); + CartesiaTTSConfig = Cast(InTSSConfig); + if (!CartesiaTTSConfig) + { + TTSError(TEXT("Cannot cast config file to TTSCartesiaConfig")); + return; + } + + bSupportsStreamedInput = CartesiaTTSConfig->StreamInputText; + + if (!FModuleManager::Get().IsModuleLoaded("WebSockets")) + { + FModuleManager::Get().LoadModule("WebSockets"); + } + + SetTTSState(ETTSState::Ready); +} + +void UCartesiaTTSManager::DeinitTTSManager() +{ + TArray Keys; + { + FScopeLock Lock(&SocketsCS); + ActiveSockets.GetKeys(Keys); + } + for (int32 TaskId : Keys) + { + CloseAndRemoveSocket(TaskId, false); + } + UTTSManagerBase::DeinitTTSManager(); +} + +void UCartesiaTTSManager::ClearTTS() +{ + TArray Keys; + { + FScopeLock Lock(&SocketsCS); + ActiveSockets.GetKeys(Keys); + } + for (int32 TaskId : Keys) + { + CloseAndRemoveSocket(TaskId, false); + } + UTTSManagerBase::ClearTTS(); +} + +void UCartesiaTTSManager::CloseAndRemoveSocket(int32 TaskID, bool bSendFinal) +{ + TSharedPtr Socket; + { + FScopeLock Lock(&SocketsCS); + if (TSharedPtr* Found = ActiveSockets.Find(TaskID)) + { + Socket = *Found; + ActiveSockets.Remove(TaskID); + } + TaskContextIds.Remove(TaskID); + TasksFlushSent.Remove(TaskID); + TasksSentFirst.Remove(TaskID); + } + + if (Socket.IsValid()) + { + if (bSendFinal) + { + AsyncTask(ENamedThreads::GameThread, [this, TaskID]() + { + OnGeneratedAudioChunkReceivedByID(TaskID, TArray(), true); + }); + } + Socket->Close(1000, TEXT("done")); + } +} + +void UCartesiaTTSManager::SendJsonForTask(int32 TaskID, const TSharedPtr& Obj) +{ + TSharedPtr LocalWS; + { + FScopeLock Lock(&SocketsCS); + TSharedPtr* Found = ActiveSockets.Find(TaskID); + LocalWS = Found ? *Found : nullptr; + } + + if (!LocalWS.IsValid()) + { + return; + } + + const FString Payload = SerializeJson(Obj); + TTSLog(FString::Printf(TEXT("[Cartesia][%d] -> %s"), TaskID, *Payload)); + LocalWS->Send(Payload); +} + +void UCartesiaTTSManager::SendTranscriptMessage(int32 TaskID, const FString& Transcript, bool bContinue) +{ + if (!CartesiaTTSConfig) + { + return; + } + + { + FScopeLock Lock(&SocketsCS); + if (TasksFlushSent.Contains(TaskID)) + { + return; + } + } + + TSharedPtr Obj = MakeShared(); + Obj->SetStringField(TEXT("model_id"), CartesiaTTSConfig->CartesiaModelId); + Obj->SetStringField(TEXT("transcript"), Transcript); + Obj->SetStringField(TEXT("language"), CartesiaTTSConfig->CartesiaLanguage); + Obj->SetStringField(TEXT("context_id"), GetOrCreateContextId(TaskID)); + Obj->SetBoolField(TEXT("continue"), bContinue); + + TSharedPtr VoiceObj = MakeShared(); + VoiceObj->SetStringField(TEXT("mode"), TEXT("id")); + VoiceObj->SetStringField(TEXT("id"), CartesiaTTSConfig->CartesiaVoiceId); + Obj->SetObjectField(TEXT("voice"), VoiceObj); + + TSharedPtr OutputObj = MakeShared(); + OutputObj->SetStringField(TEXT("container"), CartesiaTTSConfig->CartesiaContainer); + OutputObj->SetStringField(TEXT("encoding"), CartesiaTTSConfig->CartesiaEncoding); + const int32 EffectiveSR = (TTSConfig && TTSConfig->ResampleToSampleRate > 0) ? TTSConfig->ResampleToSampleRate : (TTSConfig ? TTSConfig->AudioSampleRate : 24000); + OutputObj->SetNumberField(TEXT("sample_rate"), EffectiveSR); + Obj->SetObjectField(TEXT("output_format"), OutputObj); + + Obj->SetBoolField(TEXT("add_timestamps"), false); + + SendJsonForTask(TaskID, Obj); +} + +void UCartesiaTTSManager::SendFlushMessage(int32 TaskID) +{ + if (!CartesiaTTSConfig) + { + return; + } + + { + FScopeLock Lock(&SocketsCS); + if (TasksFlushSent.Contains(TaskID)) + { + return; + } + // Only flush if we've sent at least one transcript in this context. + if (!TasksSentFirst.Contains(TaskID)) + { + return; + } + TasksFlushSent.Add(TaskID); + } + + TSharedPtr Obj = MakeShared(); + Obj->SetStringField(TEXT("model_id"), CartesiaTTSConfig->CartesiaModelId); + Obj->SetStringField(TEXT("transcript"), TEXT("")); + Obj->SetStringField(TEXT("language"), CartesiaTTSConfig->CartesiaLanguage); + Obj->SetStringField(TEXT("context_id"), GetOrCreateContextId(TaskID)); + Obj->SetBoolField(TEXT("continue"), true); + Obj->SetBoolField(TEXT("flush"), true); + + TSharedPtr VoiceObj = MakeShared(); + VoiceObj->SetStringField(TEXT("mode"), TEXT("id")); + VoiceObj->SetStringField(TEXT("id"), CartesiaTTSConfig->CartesiaVoiceId); + Obj->SetObjectField(TEXT("voice"), VoiceObj); + + TSharedPtr OutputObj = MakeShared(); + OutputObj->SetStringField(TEXT("container"), CartesiaTTSConfig->CartesiaContainer); + OutputObj->SetStringField(TEXT("encoding"), CartesiaTTSConfig->CartesiaEncoding); + const int32 EffectiveSR = (TTSConfig && TTSConfig->ResampleToSampleRate > 0) ? TTSConfig->ResampleToSampleRate : (TTSConfig ? TTSConfig->AudioSampleRate : 24000); + OutputObj->SetNumberField(TEXT("sample_rate"), EffectiveSR); + Obj->SetObjectField(TEXT("output_format"), OutputObj); + + Obj->SetBoolField(TEXT("add_timestamps"), false); + + SendJsonForTask(TaskID, Obj); +} + +void UCartesiaTTSManager::GenerateAudio(FTTSTask& Task) +{ + // Single-shot generation: do not use continuation/flush. + StartStreamingGeneration(Task.TaskID, Task.Text, !Task.bIsStreaming); +} + +void UCartesiaTTSManager::StartStreamingGeneration(int32 TaskID, const FString& FirstChunk, bool bIsFinal) +{ + if (!CartesiaTTSConfig) + { + TTSError(TEXT("Cartesia config not set")); + return; + } + if (CartesiaTTSConfig->CartesiaAPIKey.IsEmpty()) + { + TTSError(TEXT("Cartesia API key is empty")); + return; + } + if (CartesiaTTSConfig->CartesiaVoiceId.IsEmpty()) + { + TTSError(TEXT("Cartesia VoiceId is empty")); + return; + } + + const FString Url = BuildWebSocketUrl(); + + TMap Headers; + Headers.Add(TEXT("X-API-Key"), CartesiaTTSConfig->CartesiaAPIKey); + Headers.Add(TEXT("Cartesia-Version"), CartesiaTTSConfig->CartesiaVersion); + Headers.Add(TEXT("Accept"), TEXT("application/json")); + Headers.Add(TEXT("User-Agent"), TEXT("AvatarCoreTTS/1.0")); + Headers.Add(TEXT("Content-Type"), TEXT("application/json")); + + TSharedPtr WS = FWebSocketsModule::Get().CreateWebSocket(Url, TEXT(""), Headers); + if (!WS.IsValid()) + { + TTSError(TEXT("Failed to create Cartesia WebSocket")); + return; + } + + { + FScopeLock Lock(&SocketsCS); + ActiveSockets.Add(TaskID, WS); + } + + TWeakObjectPtr WeakThis(this); + + WS->OnConnected().AddLambda([WeakThis, TaskID, FirstChunk, bIsFinal]() + { + if (!WeakThis.IsValid()) return; + UCartesiaTTSManager* Self = WeakThis.Get(); + Self->TTSLog(FString::Printf(TEXT("[Cartesia] WS connected for task %d"), TaskID)); + }); + + WS->OnMessage().AddLambda([WeakThis, TaskID](const FString& Message) + { + if (!WeakThis.IsValid()) return; + UCartesiaTTSManager* Self = WeakThis.Get(); + Self->TTSLog(FString::Printf(TEXT("[Cartesia][%d] <- %s"), TaskID, *Message)); + + TSharedPtr Obj; + TSharedRef> Reader = TJsonReaderFactory<>::Create(Message); + if (!FJsonSerializer::Deserialize(Reader, Obj) || !Obj.IsValid()) + { + return; + } + + FString Type; + Obj->TryGetStringField(TEXT("type"), Type); + + if (Type.Equals(TEXT("chunk"), ESearchCase::IgnoreCase)) + { + FString DataStr; + if (Obj->TryGetStringField(TEXT("data"), DataStr) && !DataStr.IsEmpty()) + { + TArray PCMBytes; + if (FBase64::Decode(DataStr, PCMBytes)) + { + AsyncTask(ENamedThreads::GameThread, [Self, TaskID, PCM = MoveTemp(PCMBytes)]() mutable + { + Self->OnGeneratedAudioChunkReceivedByID(TaskID, PCM, false); + }); + } + } + return; + } + + if (Type.Equals(TEXT("flush_done"), ESearchCase::IgnoreCase)) + { + return; + } + + if (Type.Equals(TEXT("done"), ESearchCase::IgnoreCase)) + { + bool bDone = false; + Obj->TryGetBoolField(TEXT("done"), bDone); + if (bDone) + { + Self->CloseAndRemoveSocket(TaskID, true); + } + return; + } + + FString ErrorMsg; + if (Obj->TryGetStringField(TEXT("error"), ErrorMsg) && !ErrorMsg.IsEmpty()) + { + // If the server says the context is already closed, we treat it as completion. + if (ErrorMsg.Contains(TEXT("Context has closed"), ESearchCase::IgnoreCase) || ErrorMsg.Contains(TEXT("Context closed"), ESearchCase::IgnoreCase)) + { + Self->CloseAndRemoveSocket(TaskID, true); + return; + } + Self->TTSError(FString::Printf(TEXT("[Cartesia][%d] error: %s"), TaskID, *ErrorMsg)); + Self->CloseAndRemoveSocket(TaskID, true); + return; + } + }); + + /*WS->OnRawMessage().AddLambda([WeakThis, TaskID](const void* Data, SIZE_T Size, SIZE_T BytesRemaining) + { + if (!WeakThis.IsValid()) return; + UCartesiaTTSManager* Self = WeakThis.Get(); + Self->TTSLog(FString::Printf(TEXT("[Cartesia][%d] <- raw message (%llu bytes, remaining=%llu)"), TaskID, (uint64)Size, (uint64)BytesRemaining)); + });*/ + + WS->OnConnectionError().AddLambda([WeakThis, TaskID](const FString& Error) + { + if (!WeakThis.IsValid()) return; + UCartesiaTTSManager* Self = WeakThis.Get(); + Self->TTSError(FString::Printf(TEXT("[Cartesia] Connection error (task %d): %s"), TaskID, *Error)); + Self->CloseAndRemoveSocket(TaskID, true); + }); + + WS->OnClosed().AddLambda([WeakThis, TaskID](int32 StatusCode, const FString& Reason, bool bWasClean) + { + if (!WeakThis.IsValid()) return; + UCartesiaTTSManager* Self = WeakThis.Get(); + Self->TTSLog(FString::Printf(TEXT("[Cartesia] Closed task %d (code=%d, clean=%s): %s"), TaskID, StatusCode, bWasClean ? TEXT("true") : TEXT("false"), *Reason)); + Self->CloseAndRemoveSocket(TaskID, true); + }); + + WS->Connect(); + + //Websockets does the caching for us + SendTranscriptMessage(TaskID, FirstChunk, !bIsFinal); +} + +void UCartesiaTTSManager::UpdateStreamingText(int32 TaskID, const FString& NewChunk, bool bIsFinal) +{ + if (NewChunk.IsEmpty() && !bIsFinal) + { + return; + } + + if (!NewChunk.IsEmpty()) + { + SendTranscriptMessage(TaskID, NewChunk, true); + } + + if (bIsFinal) + { + SendFlushMessage(TaskID); + } +} + diff --git a/Unreal/Plugins/AvatarCore_TTS/Source/AvatarCore_TTS/Private/Cartesia/TTSCartesiaConfig.cpp b/Unreal/Plugins/AvatarCore_TTS/Source/AvatarCore_TTS/Private/Cartesia/TTSCartesiaConfig.cpp new file mode 100644 index 0000000..033f289 --- /dev/null +++ b/Unreal/Plugins/AvatarCore_TTS/Source/AvatarCore_TTS/Private/Cartesia/TTSCartesiaConfig.cpp @@ -0,0 +1,18 @@ +// Fill out your copyright notice in the Description page of Project Settings. + + +#include "Cartesia/TTSCartesiaConfig.h" + +#include "Cartesia/CartesiaTTSManager.h" + +UTTSCartesiaConfig::UTTSCartesiaConfig(const FObjectInitializer& ObjectInitializer) +{ + TSSManagerClass = UCartesiaTTSManager::StaticClass(); +} + +FString UTTSCartesiaConfig::GetHashPrefix() const +{ + const int32 EffectiveSR = (ResampleToSampleRate > 0) ? ResampleToSampleRate : AudioSampleRate; + return FString::Printf(TEXT("%d|%d|%s|%s|%s|%s"), AudioNumChannels, EffectiveSR, *CartesiaVoiceId, *CartesiaModelId, *CartesiaContainer, *CartesiaEncoding); +} + diff --git a/Unreal/Plugins/AvatarCore_TTS/Source/AvatarCore_TTS/Public/Cartesia/CartesiaTTSManager.h b/Unreal/Plugins/AvatarCore_TTS/Source/AvatarCore_TTS/Public/Cartesia/CartesiaTTSManager.h new file mode 100644 index 0000000..2892848 --- /dev/null +++ b/Unreal/Plugins/AvatarCore_TTS/Source/AvatarCore_TTS/Public/Cartesia/CartesiaTTSManager.h @@ -0,0 +1,46 @@ +// Fill out your copyright notice in the Description page of Project Settings. + +#pragma once + +#include "CoreMinimal.h" +#include "TTSManagerBase.h" +#include "Cartesia/TTSCartesiaConfig.h" +#include "CartesiaTTSManager.generated.h" + +class IWebSocket; + +/** + * + */ +UCLASS() +class AVATARCORE_TTS_API UCartesiaTTSManager : public UTTSManagerBase +{ + GENERATED_BODY() + +public: + virtual void InitTTSManager(UTTSBaseConfig* InTSSConfig, bool DebugMode) override; + virtual void DeinitTTSManager() override; + virtual void ClearTTS() override; + +protected: + virtual void GenerateAudio(FTTSTask& Task) override; + virtual void StartStreamingGeneration(int32 TaskID, const FString& FirstChunk, bool bIsFinal) override; + virtual void UpdateStreamingText(int32 TaskID, const FString& NewChunk, bool bIsFinal) override; + +private: + UTTSCartesiaConfig* CartesiaTTSConfig = nullptr; + + TMap> ActiveSockets; + TMap TaskContextIds; + TSet TasksFlushSent; + TSet TasksSentFirst; + FCriticalSection SocketsCS; + + FString BuildWebSocketUrl() const; + FString GetOrCreateContextId(int32 TaskID); + + void CloseAndRemoveSocket(int32 TaskID, bool bSendFinal); + void SendJsonForTask(int32 TaskID, const TSharedPtr& Obj); + void SendTranscriptMessage(int32 TaskID, const FString& Transcript, bool bContinue); + void SendFlushMessage(int32 TaskID); +}; diff --git a/Unreal/Plugins/AvatarCore_TTS/Source/AvatarCore_TTS/Public/Cartesia/TTSCartesiaConfig.h b/Unreal/Plugins/AvatarCore_TTS/Source/AvatarCore_TTS/Public/Cartesia/TTSCartesiaConfig.h new file mode 100644 index 0000000..d9cd1cd --- /dev/null +++ b/Unreal/Plugins/AvatarCore_TTS/Source/AvatarCore_TTS/Public/Cartesia/TTSCartesiaConfig.h @@ -0,0 +1,49 @@ +// Fill out your copyright notice in the Description page of Project Settings. + +#pragma once + +#include "CoreMinimal.h" +#include "TTSBaseConfig.h" +#include "TTSCartesiaConfig.generated.h" + +/** + * + */ +UCLASS() +class AVATARCORE_TTS_API UTTSCartesiaConfig : public UTTSBaseConfig +{ + GENERATED_BODY() + + UTTSCartesiaConfig(const FObjectInitializer& ObjectInitializer); + + public: + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "AvatarCoreTTS|Cartesia", meta = (ExposeOnSpawn = "true")) + FString CartesiaAPIKey = ""; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "AvatarCoreTTS|Cartesia", meta = (ExposeOnSpawn = "true")) + FString CartesiaVoiceId = TEXT("e00dd3df-19e7-4cd4-827a-7ff6687b6954"); + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "AvatarCoreTTS|Cartesia", meta = (ExposeOnSpawn = "true")) + FString CartesiaModelId = TEXT("sonic-3"); + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "AvatarCoreTTS|Cartesia", meta = (ExposeOnSpawn = "true")) + FString CartesiaLanguage = TEXT("en"); + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "AvatarCoreTTS|Cartesia", meta = (ExposeOnSpawn = "true")) + bool StreamInputText = true; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "AvatarCoreTTS|Cartesia", meta = (ExposeOnSpawn = "true")) + FString CartesiaBaseURI = TEXT("api.cartesia.ai"); + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "AvatarCoreTTS|Cartesia", meta = (ExposeOnSpawn = "true")) + FString CartesiaVersion = TEXT("2026-01-12"); + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "AvatarCoreTTS|Cartesia", meta = (ExposeOnSpawn = "true")) + FString CartesiaEncoding = TEXT("pcm_s16le"); + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "AvatarCoreTTS|Cartesia", meta = (ExposeOnSpawn = "true")) + FString CartesiaContainer = TEXT("raw"); + + FString GetHashPrefix() const override; +}; diff --git a/Unreal/Plugins/AvatarCore_nDisplay/AvatarCore_nDisplay.uplugin b/Unreal/Plugins/AvatarCore_nDisplay/AvatarCore_nDisplay.uplugin deleted file mode 100644 index ee63252..0000000 --- a/Unreal/Plugins/AvatarCore_nDisplay/AvatarCore_nDisplay.uplugin +++ /dev/null @@ -1,34 +0,0 @@ -{ - "FileVersion": 3, - "Version": 1, - "VersionName": "1.1", - "FriendlyName": "Avatar Core nDisplay", - "Description": "nDisplay integration for the Avatar Core Framework", - "Category": "Other", - "CreatedBy": "b.ReX", - "CreatedByURL": "b.ReX", - "DocsURL": "", - "MarketplaceURL": "", - "SupportURL": "", - "CanContainContent": true, - "IsBetaVersion": false, - "IsExperimentalVersion": false, - "Installed": false, - "Modules": [ - { - "Name": "AvatarCore_nDisplay", - "Type": "Runtime", - "LoadingPhase": "PreLoadingScreen" - } - ], - "Plugins": [ - { - "Name": "nDisplay", - "Enabled": true - }, - { - "Name": "AvatarCore_Manager", - "Enabled": true - } - ] -} \ No newline at end of file diff --git a/Unreal/Plugins/AvatarCore_nDisplay/Content/AvatarBaseReplicated.uasset b/Unreal/Plugins/AvatarCore_nDisplay/Content/AvatarBaseReplicated.uasset deleted file mode 100644 index b440b1e..0000000 --- a/Unreal/Plugins/AvatarCore_nDisplay/Content/AvatarBaseReplicated.uasset +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3ffc37cd0272d0cd97829e508ccddcce9a0ff55d0a64559b9a340805a1129993 -size 159662 diff --git a/Unreal/Plugins/AvatarCore_nDisplay/Content/BodyReplicated_AnimBP.uasset b/Unreal/Plugins/AvatarCore_nDisplay/Content/BodyReplicated_AnimBP.uasset deleted file mode 100644 index 4b66d31..0000000 --- a/Unreal/Plugins/AvatarCore_nDisplay/Content/BodyReplicated_AnimBP.uasset +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a7b3b542379c45c813e6f04853f9b0862d4a985de11fc009a2aecb728e01503d -size 70187 diff --git a/Unreal/Plugins/AvatarCore_nDisplay/Content/FaceReplicated_AvatarCore_AnimBP.uasset b/Unreal/Plugins/AvatarCore_nDisplay/Content/FaceReplicated_AvatarCore_AnimBP.uasset deleted file mode 100644 index 6559c01..0000000 --- a/Unreal/Plugins/AvatarCore_nDisplay/Content/FaceReplicated_AvatarCore_AnimBP.uasset +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:471da184b8567374ec098036ebea5c5ccfda27638968f380cd6d6d17c9f9c65e -size 128602 diff --git a/Unreal/Plugins/AvatarCore_nDisplay/Content/FaceReplicating_AvatarCore_AnimInst_Face_Child.uasset b/Unreal/Plugins/AvatarCore_nDisplay/Content/FaceReplicating_AvatarCore_AnimInst_Face_Child.uasset deleted file mode 100644 index ab79942..0000000 --- a/Unreal/Plugins/AvatarCore_nDisplay/Content/FaceReplicating_AvatarCore_AnimInst_Face_Child.uasset +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:71dca60ba253cfae841b436927654cc8dc37ac815d38d53ef5b179856f11bbd7 -size 78745 diff --git a/Unreal/Plugins/AvatarCore_nDisplay/Resources/Icon128.png b/Unreal/Plugins/AvatarCore_nDisplay/Resources/Icon128.png deleted file mode 100644 index 25b1721..0000000 --- a/Unreal/Plugins/AvatarCore_nDisplay/Resources/Icon128.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b1831a717c8a8f83fd3819fef3f921966e33c0a546dec6a85592a4b9d81f21bd -size 5946 diff --git a/Unreal/Plugins/AvatarCore_nDisplay/Source/AvatarCore_nDisplay/AvatarCore_nDisplay.Build.cs b/Unreal/Plugins/AvatarCore_nDisplay/Source/AvatarCore_nDisplay/AvatarCore_nDisplay.Build.cs deleted file mode 100644 index f1f2451..0000000 --- a/Unreal/Plugins/AvatarCore_nDisplay/Source/AvatarCore_nDisplay/AvatarCore_nDisplay.Build.cs +++ /dev/null @@ -1,54 +0,0 @@ -// Some copyright should be here... - -using UnrealBuildTool; - -public class AvatarCore_nDisplay : ModuleRules -{ - public AvatarCore_nDisplay(ReadOnlyTargetRules Target) : base(Target) - { - PCHUsage = ModuleRules.PCHUsageMode.UseExplicitOrSharedPCHs; - - PublicIncludePaths.AddRange( - new string[] { - // ... add public include paths required here ... - } - ); - - - PrivateIncludePaths.AddRange( - new string[] { - // ... add other private include paths required here ... - } - ); - - - PublicDependencyModuleNames.AddRange( - new string[] - { - "Core", - "DisplayCluster", - // ... add other public dependencies that you statically link with here ... - } - ); - - - PrivateDependencyModuleNames.AddRange( - new string[] - { - "CoreUObject", - "Engine", - "Slate", - "SlateCore", - // ... add private dependencies that you statically link with here ... - } - ); - - - DynamicallyLoadedModuleNames.AddRange( - new string[] - { - // ... add any modules that your module loads dynamically here ... - } - ); - } -} diff --git a/Unreal/Plugins/AvatarCore_nDisplay/Source/AvatarCore_nDisplay/Private/AvatarCore_nDisplay.cpp b/Unreal/Plugins/AvatarCore_nDisplay/Source/AvatarCore_nDisplay/Private/AvatarCore_nDisplay.cpp deleted file mode 100644 index 8cd439c..0000000 --- a/Unreal/Plugins/AvatarCore_nDisplay/Source/AvatarCore_nDisplay/Private/AvatarCore_nDisplay.cpp +++ /dev/null @@ -1,22 +0,0 @@ -// Copyright Epic Games, Inc. All Rights Reserved. - -#include "AvatarCore_nDisplay.h" - -#define LOCTEXT_NAMESPACE "FAvatarCore_nDisplayModule" - -void FAvatarCore_nDisplayModule::StartupModule() -{ - // This code will execute after your module is loaded into memory; the exact timing is specified in the .uplugin file per-module - -} - -void FAvatarCore_nDisplayModule::ShutdownModule() -{ - // This function may be called during shutdown to clean up your module. For modules that support dynamic reloading, - // we call this function before unloading the module. - -} - -#undef LOCTEXT_NAMESPACE - -IMPLEMENT_MODULE(FAvatarCore_nDisplayModule, AvatarCore_nDisplay) \ No newline at end of file diff --git a/Unreal/Plugins/AvatarCore_nDisplay/Source/AvatarCore_nDisplay/Private/AvatarCore_nDisplayBPLibrary.cpp b/Unreal/Plugins/AvatarCore_nDisplay/Source/AvatarCore_nDisplay/Private/AvatarCore_nDisplayBPLibrary.cpp deleted file mode 100644 index 048f67a..0000000 --- a/Unreal/Plugins/AvatarCore_nDisplay/Source/AvatarCore_nDisplay/Private/AvatarCore_nDisplayBPLibrary.cpp +++ /dev/null @@ -1,161 +0,0 @@ -// Copyright Epic Games, Inc. All Rights Reserved. - -#include "AvatarCore_nDisplayBPLibrary.h" -#include "Engine/Engine.h" -#include "AvatarCore_nDisplay.h" -#include "Animation/AnimInstance.h" -#include "Components/SkeletalMeshComponent.h" -#include "ReplicatedFaceCPPAnimInstance.h" -#include "Serialization/BufferArchive.h" -#include "Serialization/MemoryReader.h" - -UAvatarCore_nDisplayBPLibrary::UAvatarCore_nDisplayBPLibrary(const FObjectInitializer& ObjectInitializer) -: Super(ObjectInitializer) -{ - -} - -FDisplayClusterClusterEventBinary UAvatarCore_nDisplayBPLibrary::MakeClusterPoseEvent( - UAnimInstance* AnimInstance, - int32 EventID, - FName SnapshotName) -{ - FDisplayClusterClusterEventBinary OutEvent; - if (!AnimInstance) - { - return OutEvent; - } - - // 1) Capture skeleton pose into AnimInstance's internal local-space snapshot - AnimInstance->SavePoseSnapshot(SnapshotName); - - // 2) Retrieve the snapshot pointer - const FPoseSnapshot* PosePtr = AnimInstance->GetPoseSnapshot(SnapshotName); - if (!PosePtr || !PosePtr->bIsValid) - { - return OutEvent; - } - - // 3) Serialize the FPoseSnapshot struct - FBufferArchive Buffer(true); - const UScriptStruct* Struct = FPoseSnapshot::StaticStruct(); - Struct->SerializeBin(Buffer, const_cast(PosePtr)); - - // 4) Capture morph target weights directly from the mesh component after graph evaluation - TArray MorphNames; - TArray MorphWeights; - - //Get Morph Curve list and save them to buffer - TMap InOutCurveList; - - AnimInstance->GetAnimationCurveList(EAnimCurveType::MorphTargetCurve, InOutCurveList); - AnimInstance->GetAnimationCurveList(EAnimCurveType::AttributeCurve, InOutCurveList); - - const auto* foundItem = InOutCurveList.Find(FName(TEXT("CTRL_expressions_jawOpen"))); - float JawOpenValue = foundItem ? *foundItem : -1.0f; - - //UAvatarCore_nDisplayBPLibrary::PrintHighestMorphTarget(InOutCurveList); //Debug Printing - - InOutCurveList.GenerateKeyArray(MorphNames); - InOutCurveList.GenerateValueArray(MorphWeights); - Buffer << MorphNames; - Buffer << MorphWeights; - - // 5) Package into cluster event data - OutEvent.EventId = EventID; - OutEvent.EventData = MoveTemp(Buffer); - return OutEvent; -} - - -void UAvatarCore_nDisplayBPLibrary::ApplyClusterPoseEvent( - UAnimInstance* AnimInstance, - const FDisplayClusterClusterEventBinary& EventData) -{ - if (!AnimInstance) - { - return; - } - - // Deserialize skeleton pose and morph target data in one go - FPoseSnapshot Pose; - TArray MorphNames; - TArray MorphWeights; - - - const UScriptStruct* Struct = FPoseSnapshot::StaticStruct(); - { - FMemoryReader Reader(EventData.EventData, /*bIsPersistent=*/ true); - // 1) Skeleton pose - Struct->SerializeBin(Reader, &Pose); - // 2) Morph targets - Reader << MorphNames; - Reader << MorphWeights; - } - - // 3) Apply skeleton pose - if (Pose.bIsValid) - { - AnimInstance->RemovePoseSnapshot(Pose.SnapshotName); - FPoseSnapshot& InternalPose = AnimInstance->AddPoseSnapshot(Pose.SnapshotName); - InternalPose = Pose; - } - - TMap InOutCurveList; - - if (MorphNames.Num() == MorphWeights.Num()) - { - for (int32 i = 0; i < MorphNames.Num(); ++i) - { - InOutCurveList.Add(MorphNames[i], MorphWeights[i]); - } - } - else - { - if (GEngine) - GEngine->AddOnScreenDebugMessage(-1, 15.0f, FColor::Yellow, FString::Printf(TEXT("MorphNames and MorphWeights arrays have different lengths!"))); - } - - //UAvatarCore_nDisplayBPLibrary::PrintHighestMorphTarget(InOutCurveList); //Debug Printing - - // First apply to animation instance for the animation system to pick up - AnimInstance->AppendAnimationCurveList(EAnimCurveType::MorphTargetCurve, InOutCurveList); - AnimInstance->UpdateCurvesPostEvaluation(); - - // Then apply directly to the skeletal mesh component to ensure it works on all nDisplay nodes - if (auto* SkelMesh = AnimInstance->GetSkelMeshComponent()) - { - // Clear old targets - SkelMesh->ClearMorphTargets(); - if (auto* MI = Cast(SkelMesh->GetAnimInstance())) - { - MI->SetMorphTargetCurves(InOutCurveList); - } - - // (Optional) also set them directly on the mesh if you need immediate, nDisplay-safe updates: - for (auto& KV : InOutCurveList) - { - SkelMesh->SetMorphTarget(KV.Key, KV.Value, false); ///*bRemoveZeroWeight=*/ - } - } -} - -void UAvatarCore_nDisplayBPLibrary::PrintHighestMorphTarget(const TMap& MorphTargets) -{ - FName HighestKey; - float HighestValue = -FLT_MAX; - bool bFound = false; - for (const auto& Pair : MorphTargets) - { - if (!bFound || Pair.Value > HighestValue) - { - HighestKey = Pair.Key; - HighestValue = Pair.Value; - bFound = true; - } - } - if (bFound && GEngine) - { - GEngine->AddOnScreenDebugMessage(-1, 15.0f, FColor::Yellow, FString::Printf(TEXT("MorphName %s with %f is the highest"), *HighestKey.ToString(), HighestValue)); - } -} diff --git a/Unreal/Plugins/AvatarCore_nDisplay/Source/AvatarCore_nDisplay/Private/ReplicatedFaceCPPAnimInstance.cpp b/Unreal/Plugins/AvatarCore_nDisplay/Source/AvatarCore_nDisplay/Private/ReplicatedFaceCPPAnimInstance.cpp deleted file mode 100644 index c8f612c..0000000 --- a/Unreal/Plugins/AvatarCore_nDisplay/Source/AvatarCore_nDisplay/Private/ReplicatedFaceCPPAnimInstance.cpp +++ /dev/null @@ -1,14 +0,0 @@ -// Fill out your copyright notice in the Description page of Project Settings. - - -#include "ReplicatedFaceCPPAnimInstance.h" - -void UReplicatedFaceCPPAnimInstance::SetMorphTargetCurves(const TMap& NewCurves) -{ - PendingMorphCurves = NewCurves; -} - -void UReplicatedFaceCPPAnimInstance::NativePostEvaluateAnimation() -{ - Super::NativePostEvaluateAnimation(); -} \ No newline at end of file diff --git a/Unreal/Plugins/AvatarCore_nDisplay/Source/AvatarCore_nDisplay/Public/AvatarCore_nDisplay.h b/Unreal/Plugins/AvatarCore_nDisplay/Source/AvatarCore_nDisplay/Public/AvatarCore_nDisplay.h deleted file mode 100644 index d265bf7..0000000 --- a/Unreal/Plugins/AvatarCore_nDisplay/Source/AvatarCore_nDisplay/Public/AvatarCore_nDisplay.h +++ /dev/null @@ -1,14 +0,0 @@ -// Copyright Epic Games, Inc. All Rights Reserved. - -#pragma once - -#include "Modules/ModuleManager.h" - -class FAvatarCore_nDisplayModule : public IModuleInterface -{ -public: - - /** IModuleInterface implementation */ - virtual void StartupModule() override; - virtual void ShutdownModule() override; -}; diff --git a/Unreal/Plugins/AvatarCore_nDisplay/Source/AvatarCore_nDisplay/Public/AvatarCore_nDisplayBPLibrary.h b/Unreal/Plugins/AvatarCore_nDisplay/Source/AvatarCore_nDisplay/Public/AvatarCore_nDisplayBPLibrary.h deleted file mode 100644 index ea114ed..0000000 --- a/Unreal/Plugins/AvatarCore_nDisplay/Source/AvatarCore_nDisplay/Public/AvatarCore_nDisplayBPLibrary.h +++ /dev/null @@ -1,59 +0,0 @@ -// Copyright Epic Games, Inc. All Rights Reserved. - -#pragma once -#include "CoreMinimal.h" -#include "Cluster/DisplayClusterClusterEvent.h" -#include "Animation/PoseSnapshot.h" -#include "Animation/AnimInstance.h" -#include "Kismet/BlueprintFunctionLibrary.h" -#include "AvatarCore_nDisplayBPLibrary.generated.h" - -/* -* Function library class. -* Each function in it is expected to be static and represents blueprint node that can be called in any blueprint. -* -* When declaring function you can define metadata for the node. Key function specifiers will be BlueprintPure and BlueprintCallable. -* BlueprintPure - means the function does not affect the owning object in any way and thus creates a node without Exec pins. -* BlueprintCallable - makes a function which can be executed in Blueprints - Thus it has Exec pins. -* DisplayName - full name of the node, shown when you mouse over the node and in the blueprint drop down menu. -* Its lets you name the node using characters not allowed in C++ function names. -* CompactNodeTitle - the word(s) that appear on the node. -* Keywords - the list of keywords that helps you to find node when you search for it using Blueprint drop-down menu. -* Good example is "Print String" node which you can find also by using keyword "log". -* Category - the category your node will be under in the Blueprint drop-down menu. -* -* For more info on custom blueprint nodes visit documentation: -* https://wiki.unrealengine.com/Custom_Blueprint_Node_Creation -*/ -UCLASS() -class UAvatarCore_nDisplayBPLibrary : public UBlueprintFunctionLibrary -{ - GENERATED_UCLASS_BODY() - -public: - /** - * Prints the morph target name with the highest value from the provided map. - */ - UFUNCTION(BlueprintCallable, Category = "Animation|nDisplay") - static void PrintHighestMorphTarget(const TMap& MorphTargets); - /** - * Capture the current pose on Master, serialize to bytes, assign a unique EventId, - * and wrap in a cluster-binary event for broadcasting. - */ - UFUNCTION(BlueprintCallable, Category = "Animation|nDisplay") - static FDisplayClusterClusterEventBinary MakeClusterPoseEvent( - UAnimInstance* AnimInstance, - int32 EventID, - UPARAM(DisplayName = "Snapshot Name") FName SnapshotName = FName("ClusterPose") - ); - - /** - * Unpack a received cluster-binary event, deserialize bytes into a pose snapshot, - * and save it into the target AnimInstance under the same snapshot name. - */ - UFUNCTION(BlueprintCallable, Category = "Animation|nDisplay") - static void ApplyClusterPoseEvent( - UAnimInstance* AnimInstance, - const FDisplayClusterClusterEventBinary& EventData - ); -}; diff --git a/Unreal/Plugins/AvatarCore_nDisplay/Source/AvatarCore_nDisplay/Public/ReplicatedFaceCPPAnimInstance.h b/Unreal/Plugins/AvatarCore_nDisplay/Source/AvatarCore_nDisplay/Public/ReplicatedFaceCPPAnimInstance.h deleted file mode 100644 index ce6c352..0000000 --- a/Unreal/Plugins/AvatarCore_nDisplay/Source/AvatarCore_nDisplay/Public/ReplicatedFaceCPPAnimInstance.h +++ /dev/null @@ -1,30 +0,0 @@ -// Fill out your copyright notice in the Description page of Project Settings. - -#pragma once - -#include "CoreMinimal.h" -#include "Animation/AnimInstance.h" -#include "ReplicatedFaceCPPAnimInstance.generated.h" - -/** - * - */ -UCLASS() -class AVATARCORE_NDISPLAY_API UReplicatedFaceCPPAnimInstance : public UAnimInstance -{ - GENERATED_BODY() - -public: - // Called by your gRPC callback when new morph data arrives - UFUNCTION(BlueprintCallable, Category = "Morph") - void SetMorphTargetCurves(const TMap& NewCurves); - - // Temporary storage of the latest values until injection - UPROPERTY(BlueprintReadOnly, Transient) - TMap PendingMorphCurves; - -protected: - // AnimInstance hook where we inject our curves - virtual void NativePostEvaluateAnimation() override; - -}; diff --git a/Unreal/Plugins/BTools/Content/ConfigPawn/AC_ConfigComponent.uasset b/Unreal/Plugins/BTools/Content/ConfigPawn/AC_ConfigComponent.uasset index de19b69..87d807c 100644 --- a/Unreal/Plugins/BTools/Content/ConfigPawn/AC_ConfigComponent.uasset +++ b/Unreal/Plugins/BTools/Content/ConfigPawn/AC_ConfigComponent.uasset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:e90e596ec7917a32482dfcbf8d19f1ee02c4a5a2a669645309860811b8a0cb4f +oid sha256:bc77cbd057ddc856f2ee830b7d27edd29d32041a96073deaaf33e3ce73937705 size 278551 diff --git a/Unreal/Plugins/BTools/Content/DebugWidget/ChildWidgets/DebugWidgetTab.uasset b/Unreal/Plugins/BTools/Content/DebugWidget/ChildWidgets/DebugWidgetTab.uasset index 2e54fc4..8ffe73f 100644 --- a/Unreal/Plugins/BTools/Content/DebugWidget/ChildWidgets/DebugWidgetTab.uasset +++ b/Unreal/Plugins/BTools/Content/DebugWidget/ChildWidgets/DebugWidgetTab.uasset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:d123fc1306bd9bac34a9d0296a187065f53c3a1df86c3e3ade5995945223cd67 -size 79561 +oid sha256:9ee6b3b53764a672d7bbadc20f746334c8fe06e94be2d4db6e7ded77479b3dcf +size 101263 diff --git a/Unreal/Plugins/BTools/Content/DebugWidget/ChildWidgets/W_DebugWidget_Button.uasset b/Unreal/Plugins/BTools/Content/DebugWidget/ChildWidgets/W_DebugWidget_Button.uasset index d64b1b5..cf9e524 100644 --- a/Unreal/Plugins/BTools/Content/DebugWidget/ChildWidgets/W_DebugWidget_Button.uasset +++ b/Unreal/Plugins/BTools/Content/DebugWidget/ChildWidgets/W_DebugWidget_Button.uasset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:f78f22edf836cf2d0b4cc8a61310ff2c64281a1dccfac133d0f63fcbfb596639 -size 90793 +oid sha256:9ab85642452fee11b8310e81f0ed21637c895d92b65f15c51281f54349615da0 +size 114314 diff --git a/Unreal/Plugins/BTools/Content/DebugWidget/ChildWidgets/W_DebugWidget_EditableField.uasset b/Unreal/Plugins/BTools/Content/DebugWidget/ChildWidgets/W_DebugWidget_EditableField.uasset index 10ed466..a8f947d 100644 --- a/Unreal/Plugins/BTools/Content/DebugWidget/ChildWidgets/W_DebugWidget_EditableField.uasset +++ b/Unreal/Plugins/BTools/Content/DebugWidget/ChildWidgets/W_DebugWidget_EditableField.uasset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:42e7cc671527db68d863447fd239212a9e7109ba29ae9c84c2802cd5450c40bb -size 245852 +oid sha256:7a8b44cf60c182e1d136ee09f58d7855d3e0aaeda151aa1c3140d2d221f50ead +size 261255 diff --git a/Unreal/Plugins/BTools/Content/DebugWidget/DebugWidget.uasset b/Unreal/Plugins/BTools/Content/DebugWidget/DebugWidget.uasset index aa02fc4..d779372 100644 --- a/Unreal/Plugins/BTools/Content/DebugWidget/DebugWidget.uasset +++ b/Unreal/Plugins/BTools/Content/DebugWidget/DebugWidget.uasset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:731b51737e87121c0f4126fccaad2169c8b92d9db2baf80077416a7d29dfeda7 -size 405338 +oid sha256:9f3398570b653523c75a513eaaea5e771887272b1c8dd71b079fb704c9220726 +size 438519 diff --git a/Unreal/Plugins/BTools/Source/BTools/BTools.Build.cs b/Unreal/Plugins/BTools/Source/BTools/BTools.Build.cs index 41f713a..db75294 100644 --- a/Unreal/Plugins/BTools/Source/BTools/BTools.Build.cs +++ b/Unreal/Plugins/BTools/Source/BTools/BTools.Build.cs @@ -41,7 +41,8 @@ public class BTools : ModuleRules "Slate", "SlateCore", "ApplicationCore", - "CinematicCamera" + "CinematicCamera", + "UMG" // ... add private dependencies that you statically link with here ... } ); diff --git a/Unreal/Plugins/BTools/Source/BTools/Private/BToolsBPLibrary.cpp b/Unreal/Plugins/BTools/Source/BTools/Private/BToolsBPLibrary.cpp index 2a96c47..bac2764 100644 --- a/Unreal/Plugins/BTools/Source/BTools/Private/BToolsBPLibrary.cpp +++ b/Unreal/Plugins/BTools/Source/BTools/Private/BToolsBPLibrary.cpp @@ -24,7 +24,18 @@ #include #include "GenericPlatform/GenericWindow.h" #include +//Create Shortscuts on Runtime + #include "Windows/AllowWindowsPlatformTypes.h" + #include + #include + #include + #include "Windows/HideWindowsPlatformTypes.h" +//For getting Desktop Path + #include + #include #endif +#include "Components/NamedSlot.h" +#include "Runtime/UMG/public/Blueprint/UserWidget.h" FTheProcHandle UBToolsBPLibrary::OpenProgram(FText filename, FText arguments, bool launchDetached, bool launchHidden, bool launchReallyHidden) { @@ -202,6 +213,35 @@ FString UBToolsBPLibrary::GetLocalAppDataPath() return TEXT("ONLY ON WINDOWS PLATFORM"); } +FString UBToolsBPLibrary::GetDesktopPath() +{ +#if PLATFORM_WINDOWS + + PWSTR RawPath = nullptr; + + HRESULT Hr = SHGetKnownFolderPath( + FOLDERID_Desktop, + 0, + nullptr, + &RawPath + ); + + if (FAILED(Hr) || !RawPath) + return FString(); + + FString Result(RawPath); + + CoTaskMemFree(RawPath); + + return Result; + +#else + + return FString(); + +#endif +} + bool UBToolsBPLibrary::ContainsOneOf(FString SearchIn, TArray Substrings, bool UseCase, bool SearchFromEnd, FString& FoundString) { for (auto Substring : Substrings) @@ -764,6 +804,89 @@ FTransform UBToolsBPLibrary::GetZeroTransform() return FTransform(); } +bool UBToolsBPLibrary::CreateWindowsShortcut(const FString& TargetPath, const FString& ShortcutPath, const FString& Description, const FString& IconPath, int32 IconIndex) +{ +#if PLATFORM_WINDOWS + + if (!FPaths::FileExists(TargetPath) && + !IFileManager::Get().DirectoryExists(*TargetPath)) + { + return false; // invalid target + } + + FString FinalShortcutPath = ShortcutPath; + + if (!FPaths::GetExtension(FinalShortcutPath, false).Equals(TEXT("lnk"), ESearchCase::IgnoreCase)) + { + FinalShortcutPath += TEXT(".lnk"); + } + + FString WorkingDir; + if (IFileManager::Get().DirectoryExists(*TargetPath)) + WorkingDir = TargetPath; // folder + else + WorkingDir = FPaths::GetPath(TargetPath); // file + + FString FinalIconPath = IconPath; + + if (FinalIconPath.IsEmpty()) + { + wchar_t SysDir[MAX_PATH]; + GetSystemDirectoryW(SysDir, MAX_PATH); + FinalIconPath = FString(SysDir) / TEXT("shell32.dll"); + } + + HRESULT Hr = CoInitialize(nullptr); + const bool bNeedUninit = SUCCEEDED(Hr); + + IShellLinkW* ShellLink = nullptr; + + Hr = CoCreateInstance( + CLSID_ShellLink, + nullptr, + CLSCTX_INPROC_SERVER, + IID_IShellLinkW, + (void**)&ShellLink + ); + + if (FAILED(Hr) || !ShellLink) + { + if (bNeedUninit) CoUninitialize(); + return false; + } + + ShellLink->SetPath(*TargetPath); + ShellLink->SetWorkingDirectory(*WorkingDir); + + if (!Description.IsEmpty()) + ShellLink->SetDescription(*Description); + + ShellLink->SetIconLocation(*FinalIconPath, IconIndex); + + IPersistFile* PersistFile = nullptr; + Hr = ShellLink->QueryInterface(IID_IPersistFile, (void**)&PersistFile); + + bool bSuccess = false; + + if (SUCCEEDED(Hr) && PersistFile) + { + Hr = PersistFile->Save(*FinalShortcutPath, true); + bSuccess = SUCCEEDED(Hr); + PersistFile->Release(); + } + + ShellLink->Release(); + + if (bNeedUninit) + CoUninitialize(); + + return bSuccess; + +#else + return false; +#endif +} + ////////////////////////////////////// // Multi monitor setup functions ////////////////////////////////////// @@ -1136,6 +1259,47 @@ void UBToolsBPLibrary::MoveWindowToMonitor(int monitorID) //#endif // !WITH_EDITOR } +FVector2D UBToolsBPLibrary::GetWidgetScreenPosition(const UUserWidget* Widget) +{ + if (!Widget) + { + UE_LOG(LogTemp, Error, TEXT("Widget is null")); + return FVector2D::ZeroVector; + } + + // Use widget center directly + FGeometry Geometry = Widget->GetCachedGeometry(); + FVector2D LocalCenter = Geometry.GetLocalSize() * 0.5f; + FVector2D AbsoluteCenter = Geometry.LocalToAbsolute(LocalCenter); + + return AbsoluteCenter; +} + +FVector UBToolsBPLibrary::GetWorldLocationFromUIElement(const UUserWidget* Widget) +{ + FVector Target; + if (!Widget) return Target; + + // Hole Widget Position auf Screen + FVector2D WidgetScreenPosition = GetWidgetScreenPosition(Widget); + + UWorld* World = Widget->GetWorld(); + if (!World) return Target; + // Deproject von Screen zu World + APlayerController* PC = World->GetFirstPlayerController(); + if (!PC) return Target; + + FVector WorldLocation, WorldDirection; + PC->DeprojectScreenPositionToWorld( + WidgetScreenPosition.X, + WidgetScreenPosition.Y, + WorldLocation, + WorldDirection + ); + + return WorldLocation; +}; + // The following function do not work on pseudo monitors ////////////////////////////////////////////////////////////// diff --git a/Unreal/Plugins/BTools/Source/BTools/Public/BToolsBPLibrary.h b/Unreal/Plugins/BTools/Source/BTools/Public/BToolsBPLibrary.h index a3ee69b..87aa3c4 100644 --- a/Unreal/Plugins/BTools/Source/BTools/Public/BToolsBPLibrary.h +++ b/Unreal/Plugins/BTools/Source/BTools/Public/BToolsBPLibrary.h @@ -23,6 +23,8 @@ #include "BToolsBPLibrary.generated.h" +class UUserWidget; + /* * Function library class. * Each function in it is expected to be static and represents blueprint node that can be called in any blueprint. @@ -139,6 +141,9 @@ public: UFUNCTION(BlueprintCallable, Category = "System|Paths") static FString GetLocalAppDataPath(); + UFUNCTION(BlueprintCallable, Category = "System|Paths") + static FString GetDesktopPath(); + // String Functions @@ -303,6 +308,16 @@ public: UFUNCTION(BlueprintPure, Category = "BTools") static FTransform GetZeroTransform(); + //Create a Windows Shortcut at the given ShortcutPath with an additional icon set + UFUNCTION(BlueprintCallable, Meta = (DisplayName = "Create Windows Shortcut"), Category = "BTools") + static bool CreateWindowsShortcut( + const FString& TargetPath, + const FString& ShortcutPath, + const FString& Description = TEXT(""), + const FString& IconPath = TEXT(""), + int32 IconIndex = 0 + ); + //Screen related functions UFUNCTION(BlueprintCallable, meta = (DisplayName = "Minimize Window", Keywords = "minimize window", ToolTip = "Minimizes the game window. THIS ONLY WORKS IN PACKAGED GAMES!"), Category = "BTools") @@ -326,6 +341,11 @@ public: UFUNCTION(BlueprintCallable, meta = (DisplayName = "Move window to another Monitor", Keywords = "move window", ToolTip = "Move window to another monitor. THIS ONLY WORKS IN PACKAGED GAMES!"), Category = "BTools") static void MoveWindowToMonitor(int monitorID); + UFUNCTION(BlueprintCallable, meta = (WorldContext = "WorldContextObject", DisplayName = "Get Widget Screen Position", Keywords = "Widget Position", ToolTip = "Gets Widget Location on Viewport as 2D Coordinate"), Category = "BTools") + static FVector2D GetWidgetScreenPosition(const UUserWidget* Widget); + UFUNCTION(BlueprintCallable, meta = (WorldContext = "WorldContextObject", DisplayName = "Convert Widget Screen Space To World", Keywords = "Widget World Location", ToolTip = "Convert the 2d Viewport location of a widget to world space location"), Category = "BTools") + static FVector GetWorldLocationFromUIElement(const UUserWidget* Widget); + /** * Brings the Unreal application window to the foreground, overlaying all other windows (Windows only). */