I’ve successfully gotten custom animation nodes to work with the exception of AnimNode_SkeletalControlBase. I get linker errors all over the place, however I’ve implemented as many virtual functions as I could within the struct.
Everything else works fine. I’ve got AnimNode_Base derived classes working just fine and got a few blend nodes going.
Does anyone have any experience with this? Is there some module required by it that wasn’t required by the other AnimNode types? I’ve also copied the AnimNode_ModifyBone class yet I still get these errors.
EDIT: I do have the proper module AnimGraphRuntime.
These are the linker errors:
[SPOILER]1>Module.DevProject.cpp.obj : error LNK2019: unresolved external symbol “__declspec(dllimport) public: __cdecl FAnimNode_SkeletalControlBase::FAnimNode_SkeletalControlBase(void)” (_imp??0FAnimNode_SkeletalControlBase@@QEAA@XZ) referenced in function “public: __cdecl FAnimNode_FPFABRIK::FAnimNode_FPFABRIK(void)” (??0FAnimNode_FPFABRIK@@QEAA@XZ)
1>Module.DevProject.cpp.obj : error LNK2019: unresolved external symbol “__declspec(dllimport) public: virtual __cdecl FAnimNode_SkeletalControlBase::~FAnimNode_SkeletalControlBase(void)” (_imp??1FAnimNode_SkeletalControlBase@@UEAA@XZ) referenced in function “public: virtual __cdecl FAnimNode_FPFABRIK::~FAnimNode_FPFABRIK(void)” (??1FAnimNode_FPFABRIK@@UEAA@XZ)
1>Module.DevProject.gen.cpp.obj : error LNK2001: unresolved external symbol “__declspec(dllimport) public: virtual __cdecl FAnimNode_SkeletalControlBase::~FAnimNode_SkeletalControlBase(void)” (_imp??1FAnimNode_SkeletalControlBase@@UEAA@XZ)
1>Module.DevProject.cpp.obj : error LNK2019: unresolved external symbol “__declspec(dllimport) public: __cdecl FAnimNode_SkeletalControlBase::FAnimNode_SkeletalControlBase(struct FAnimNode_SkeletalControlBase const &)” (_imp??0FAnimNode_SkeletalControlBase@@QEAA@AEBU0@@Z) referenced in function “public: __cdecl FAnimNode_FPFABRIK::FAnimNode_FPFABRIK(struct FAnimNode_FPFABRIK const &)” (??0FAnimNode_FPFABRIK@@QEAA@AEBU0@@Z)
1>Module.DevProject.gen.cpp.obj : error LNK2001: unresolved external symbol “__declspec(dllimport) public: __cdecl FAnimNode_SkeletalControlBase::FAnimNode_SkeletalControlBase(struct FAnimNode_SkeletalControlBase const &)” (_imp??0FAnimNode_SkeletalControlBase@@QEAA@AEBU0@@Z)
1>Module.DevProject.cpp.obj : error LNK2019: unresolved external symbol “__declspec(dllimport) public: __cdecl FAnimNode_SkeletalControlBase::FAnimNode_SkeletalControlBase(struct FAnimNode_SkeletalControlBase &&)” (_imp??0FAnimNode_SkeletalControlBase@@QEAA@$$QEAU0@@Z) referenced in function “public: __cdecl FAnimNode_FPFABRIK::FAnimNode_FPFABRIK(struct FAnimNode_FPFABRIK &&)” (??0FAnimNode_FPFABRIK@@QEAA@$$QEAU0@@Z)
1>Module.DevProject.gen.cpp.obj : error LNK2001: unresolved external symbol “__declspec(dllimport) public: __cdecl FAnimNode_SkeletalControlBase::FAnimNode_SkeletalControlBase(struct FAnimNode_SkeletalControlBase &&)” (_imp??0FAnimNode_SkeletalControlBase@@QEAA@$$QEAU0@@Z)
1>Module.DevProject.cpp.obj : error LNK2019: unresolved external symbol “__declspec(dllimport) public: struct FAnimNode_SkeletalControlBase & __cdecl FAnimNode_SkeletalControlBase::operator=(struct FAnimNode_SkeletalControlBase const &)” (_imp??4FAnimNode_SkeletalControlBase@@QEAAAEAU0@AEBU0@@Z) referenced in function “public: struct FAnimNode_FPFABRIK & __cdecl FAnimNode_FPFABRIK::operator=(struct FAnimNode_FPFABRIK const &)” (??4FAnimNode_FPFABRIK@@QEAAAEAU0@AEBU0@@Z)
1>Module.DevProject.gen.cpp.obj : error LNK2001: unresolved external symbol “__declspec(dllimport) public: struct FAnimNode_SkeletalControlBase & __cdecl FAnimNode_SkeletalControlBase::operator=(struct FAnimNode_SkeletalControlBase const &)” (_imp??4FAnimNode_SkeletalControlBase@@QEAAAEAU0@AEBU0@@Z)
1>Module.DevProject.cpp.obj : error LNK2019: unresolved external symbol “__declspec(dllimport) public: struct FAnimNode_SkeletalControlBase & __cdecl FAnimNode_SkeletalControlBase::operator=(struct FAnimNode_SkeletalControlBase &&)” (_imp??4FAnimNode_SkeletalControlBase@@QEAAAEAU0@$$QEAU0@@Z) referenced in function “public: struct FAnimNode_FPFABRIK & __cdecl FAnimNode_FPFABRIK::operator=(struct FAnimNode_FPFABRIK &&)” (??4FAnimNode_FPFABRIK@@QEAAAEAU0@$$QEAU0@@Z)
1>Module.DevProject.gen.cpp.obj : error LNK2001: unresolved external symbol “__declspec(dllimport) public: struct FAnimNode_SkeletalControlBase & __cdecl FAnimNode_SkeletalControlBase::operator=(struct FAnimNode_SkeletalControlBase &&)” (_imp??4FAnimNode_SkeletalControlBase@@QEAAAEAU0@$$QEAU0@@Z)
1>Module.DevProject.cpp.obj : error LNK2001: unresolved external symbol “protected: virtual void __cdecl FAnimNode_SkeletalControlBase::EvaluateBoneTransforms(class USkeletalMeshComponent *,struct FCSPose<struct FCompactPose> &,class TArray<struct FBoneTransform,class FDefaultAllocator> &)” (?EvaluateBoneTransforms@FAnimNode_SkeletalControlBase@@MEAAXPEAVUSkeletalMeshComponent@@AEAU?$FCSPose@UFCompactPose@@@@AEAV?$TArray@UFBoneTransform@@VFDefaultAllocator@@@@@Z)
1>Module.DevProject.gen.cpp.obj : error LNK2001: unresolved external symbol “protected: virtual void __cdecl FAnimNode_SkeletalControlBase::EvaluateBoneTransforms(class USkeletalMeshComponent *,struct FCSPose<struct FCompactPose> &,class TArray<struct FBoneTransform,class FDefaultAllocator> &)” (?EvaluateBoneTransforms@FAnimNode_SkeletalControlBase@@MEAAXPEAVUSkeletalMeshComponent@@AEAU?$FCSPose@UFCompactPose@@@@AEAV?$TArray@UFBoneTransform@@VFDefaultAllocator@@@@@Z)
1>Module.DevProject.cpp.obj : error LNK2001: unresolved external symbol “public: virtual void __cdecl FAnimNode_SkeletalControlBase::EvaluateComponentSpace_AnyThread(struct FComponentSpacePoseContext &)” (?EvaluateComponentSpace_AnyThread@FAnimNode_SkeletalControlBase@@UEAAXAEAUFComponentSpacePoseContext@@@Z)
1>Module.DevProject.gen.cpp.obj : error LNK2001: unresolved external symbol “public: virtual void __cdecl FAnimNode_SkeletalControlBase::EvaluateComponentSpace_AnyThread(struct FComponentSpacePoseContext &)” (?EvaluateComponentSpace_AnyThread@FAnimNode_SkeletalControlBase@@UEAAXAEAUFComponentSpacePoseContext@@@Z)
1>Module.DevProject.cpp.obj : error LNK2001: unresolved external symbol "public: virtual int __cdecl FAnimNode_SkeletalControlBase::GetLODThreshold(void)const " (?GetLODThreshold@FAnimNode_SkeletalControlBase@@UEBAHXZ)
1>Module.DevProject.gen.cpp.obj : error LNK2001: unresolved external symbol "public: virtual int __cdecl FAnimNode_SkeletalControlBase::GetLODThreshold(void)const " (?GetLODThreshold@FAnimNode_SkeletalControlBase@@UEBAHXZ)
1>Module.DevProject.cpp.obj : error LNK2001: unresolved external symbol “public: virtual void __cdecl FAnimNode_SkeletalControlBase::Update_AnyThread(struct FAnimationUpdateContext const &)” (?Update_AnyThread@FAnimNode_SkeletalControlBase@@UEAAXAEBUFAnimationUpdateContext@@@Z)
1>Module.DevProject.gen.cpp.obj : error LNK2001: unresolved external symbol “public: virtual void __cdecl FAnimNode_SkeletalControlBase::Update_AnyThread(struct FAnimationUpdateContext const &)” (?Update_AnyThread@FAnimNode_SkeletalControlBase@@UEAAXAEBUFAnimationUpdateContext@@@Z)
1>Module.DevProject.gen.cpp.obj : error LNK2019: unresolved external symbol “__declspec(dllimport) class UScriptStruct * __cdecl Z_Construct_UScriptStruct_FAnimNode_SkeletalControlBase(void)” (_imp?Z_Construct_UScriptStruct_FAnimNode_SkeletalControlBase@@YAPEAVUScriptStruct@@XZ) referenced in function “void __cdecl `dynamic initializer for ‘public: static struct UE4CodeGen_Private::FStructParams const Z_Construct_UScriptStruct_FAnimNode_FPFABRIK_Statics::ReturnStructParams’'(void)” (??__E?ReturnStructParams@Z_Construct_UScriptStruct_FAnimNode_FPFABRIK_Statics@@2UFStructParams@UE4CodeGen_Private@@B@@YAXXZ)[/SPOILER]
The functions in question:
// FAnimNode_Base interface
virtual void Initialize_AnyThread(const FAnimationInitializeContext& Context) override;
virtual void CacheBones_AnyThread(const FAnimationCacheBonesContext& Context) override;
virtual void Update_AnyThread(const FAnimationUpdateContext& Context) final;
virtual void EvaluateComponentSpace_AnyThread(FComponentSpacePoseContext& Output) final;
// End of FAnimNode_Base interface
protected:
// Interface for derived skeletal controls to implement
// use this function to update for skeletal control base
virtual void UpdateInternal(const FAnimationUpdateContext& Context);
// Update incoming component pose.
virtual void UpdateComponentPose_AnyThread(const FAnimationUpdateContext& Context);
// Evaluate incoming component pose.
virtual void EvaluateComponentPose_AnyThread(FComponentSpacePoseContext& Output);
// use this function to evaluate for skeletal control base
virtual void EvaluateComponentSpaceInternal(FComponentSpacePoseContext& Context);
DEPRECATED(4.16, "Please use EvaluateSkeletalControl_AnyThread.")
virtual void EvaluateBoneTransforms(USkeletalMeshComponent* SkelComp, FCSPose<FCompactPose>& MeshBases, TArray<FBoneTransform>& OutBoneTransforms) {}
// Evaluate the new component-space transforms for the affected bones.
virtual void EvaluateSkeletalControl_AnyThread(FComponentSpacePoseContext& Output, TArray<FBoneTransform>& OutBoneTransforms);
// return true if it is valid to Evaluate
virtual bool IsValidToEvaluate(const USkeleton* Skeleton, const FBoneContainer& RequiredBones) { return false; }
// initialize any bone references you have
virtual void InitializeBoneReferences(const FBoneContainer& RequiredBones){};
/** Allow base to add info to the node debug output */
void AddDebugNodeData(FString& OutDebugData);
The only functions I can’t override are ‘Update_AnyThread()’, ‘EvaluateComponentSpace_AnyThread()’, and ‘EvaluateBoneTransforms’ as the former two are final and the latter is deprecated.