void USkeleton::HandleSkeletonHierarchyChange() { MarkPackageDirty(); RegenerateGuid(); // Clear exiting MeshLinkUp tables. ClearCacheData(); // Fix up loaded animations (any animations that aren't loaded will be fixed on load) for(TObjectIterator<UAnimationAsset> It; It; ++It) { UAnimationAsset* CurrentAnimation = *It; if (CurrentAnimation->GetSkeleton() == this) { CurrentAnimation->ValidateSkeleton(); } } #if WITH_EDITORONLY_DATA RefreshAllRetargetSources(); #endif OnSkeletonHierarchyChanged.Broadcast(); }
void USkeleton::PostDuplicate(bool bDuplicateForPIE) { Super::PostDuplicate(bDuplicateForPIE); if (!bDuplicateForPIE) { // regenerate Guid RegenerateGuid(); } }
void USkeleton::PostInitProperties() { Super::PostInitProperties(); // this gets called after constructor, and this data can get // serialized back if this already has Guid if (!IsTemplate()) { RegenerateGuid(); } }
bool USkeleton::RecreateBoneTree(USkeletalMesh* InSkelMesh) { if( InSkelMesh ) { // regenerate Guid RegenerateGuid(); BoneTree.Empty(); ReferenceSkeleton.Empty(); return MergeAllBonesToBoneTree(InSkelMesh); } return false; }
void USkeleton::HandleSkeletonHierarchyChange() { MarkPackageDirty(); RegenerateGuid(); // Fix up loaded animations (any animations that aren't loaded will be fixed on load) for(TObjectIterator<UAnimationAsset> It; It; ++It) { UAnimationAsset* CurrentAnimation = *It; CurrentAnimation->ValidateSkeleton(); } RefreshAllRetargetSources(); OnSkeletonHierarchyChanged.Broadcast(); }
void USkeleton::Serialize( FArchive& Ar ) { Super::Serialize(Ar); if( Ar.UE4Ver() >= VER_UE4_REFERENCE_SKELETON_REFACTOR ) { Ar << ReferenceSkeleton; } if (Ar.UE4Ver() >= VER_UE4_FIX_ANIMATIONBASEPOSE_SERIALIZATION) { // Load Animation RetargetSources if (Ar.IsLoading()) { int32 NumOfRetargetSources; Ar << NumOfRetargetSources; FName RetargetSourceName; FReferencePose RetargetSource; for (int32 Index=0; Index<NumOfRetargetSources; ++Index) { Ar << RetargetSourceName; Ar << RetargetSource; AnimRetargetSources.Add(RetargetSourceName, RetargetSource); } } else { int32 NumOfRetargetSources = AnimRetargetSources.Num(); Ar << NumOfRetargetSources; for (auto Iter = AnimRetargetSources.CreateIterator(); Iter; ++Iter) { Ar << Iter.Key(); Ar << Iter.Value(); } } } else { // this is broken, but we have to keep it to not corrupt content. for (auto Iter = AnimRetargetSources.CreateIterator(); Iter; ++Iter) { Ar << Iter.Key(); Ar << Iter.Value(); } } if (Ar.UE4Ver() < VER_UE4_SKELETON_GUID_SERIALIZATION) { RegenerateGuid(); } else { Ar << Guid; } // If we should be using smartnames, serialize the mappings if(Ar.UE4Ver() >= VER_UE4_SKELETON_ADD_SMARTNAMES) { SmartNames.Serialize(Ar); } #if WITH_EDITORONLY_DATA if (Ar.UE4Ver() < VER_UE4_SKELETON_ASSET_PROPERTY_TYPE_CHANGE) { PreviewAttachedAssetContainer.SaveAttachedObjectsFromDeprecatedProperties(); } #endif }