// VRM4U Copyright (c) 2021-2024 Haruyoshi Yamamoto. This software is released under the MIT License. #pragma once #include "CoreMinimal.h" #include "UObject/ObjectMacros.h" #include "BoneContainer.h" #include "BonePose.h" #include "BoneControllers/AnimNode_ModifyBone.h" #include "Misc/EngineVersionComparison.h" #include "AnimNode_VrmVMC.generated.h" class USkeletalMeshComponent; class UVrmMetaObject; class UVrmAssetListObject; /** * Simple controller that replaces or adds to the translation/rotation of a single bone. */ USTRUCT(BlueprintInternalUseOnly) struct VRM4UCAPTURE_API FAnimNode_VrmVMC : public FAnimNode_SkeletalControlBase { GENERATED_USTRUCT_BODY() UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Skeleton, meta = (PinHiddenByDefault)) bool EnableAutoSearchMetaData = true; UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Skeleton, meta=(PinHiddenByDefault)) const UVrmMetaObject *VrmMetaObject = nullptr; #if UE_VERSION_OLDER_THAN(5,0,0) TAssetPtr VrmMetaObject_Internal = nullptr; TAssetPtr VrmAssetListObject_Internal = nullptr; #else TSoftObjectPtr VrmMetaObject_Internal = nullptr; TSoftObjectPtr VrmAssetListObject_Internal = nullptr; #endif //UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Skeleton, meta = (PinShownByDefault)) //TMap BoneTrans; UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Skeleton, meta = (PinShownByDefault)) bool bUseRemoteCenterPos = true; UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Skeleton, meta = (PinShownByDefault)) float ModelRelativeScale = 1.f; UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Skeleton, meta = (PinShownByDefault)) bool bIgnoreLocalRotation = false; UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Skeleton, meta = (PinShownByDefault)) FString ServerAddress = "0.0.0.0"; UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Skeleton, meta = (PinShownByDefault)) int Port = 39539; UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Skeleton, meta = (PinShownByDefault)) bool bApplyPerfectSync = true; UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Skeleton, meta = (PinHiddenByDefault)) bool bForceUpdate = false; bool bCreateServer = false; TArray RefSkeletonTransform_global; FAnimNode_VrmVMC(); virtual ~FAnimNode_VrmVMC(); // FAnimNode_Base interface virtual void GatherDebugData(FNodeDebugData& DebugData) override; // End of FAnimNode_Base interface // FAnimNode_SkeletalControlBase interface virtual void Initialize_AnyThread(const FAnimationInitializeContext& Context) override; virtual void CacheBones_AnyThread(const FAnimationCacheBonesContext& Context) override; // virtual void Update_AnyThread(const FAnimationUpdateContext& Context) override; virtual void EvaluateSkeletalControl_AnyThread(FComponentSpacePoseContext& Output, TArray& OutBoneTransforms) override; virtual void EvaluateComponentPose_AnyThread(FComponentSpacePoseContext& Output) override; virtual bool IsValidToEvaluate(const USkeleton* Skeleton, const FBoneContainer& RequiredBones) override; virtual void UpdateInternal(const FAnimationUpdateContext& Context)override; // End of FAnimNode_SkeletalControlBase interface virtual void ConditionalDebugDraw(FPrimitiveDrawInterface* PDI, USkeletalMeshComponent* PreviewSkelMeshComp, bool bPreviewForeground = false) const; private: // FAnimNode_SkeletalControlBase interface virtual void InitializeBoneReferences(const FBoneContainer& RequiredBones) override; // End of FAnimNode_SkeletalControlBase interface };