void FBoneHierarchyBuilder::CopyToRefSkeleton(FReferenceSkeleton& RefSkeleton) { for (int32 SourceBoneIndex = 0; SourceBoneIndex < AllBones.Num(); ++SourceBoneIndex) { const FName BoneName(AllBones[SourceBoneIndex]); const int32 ParentIndex(ParentIndices[SourceBoneIndex]); const FMeshBoneInfo BoneInfo(BoneName, BoneName.ToString(), ParentIndex); const FTransform& Transform = Transforms[SourceBoneIndex]; RefSkeleton.Add(BoneInfo, Transform); } }
/** * Process and fill in the mesh ref skeleton bone hierarchy using the raw binary import data * * @param RefSkeleton - [out] reference skeleton hierarchy to update * @param SkeletalDepth - [out] depth of the reference skeleton hierarchy * @param ImportData - raw binary import data to process * @return true if the operation completed successfully */ bool ProcessImportMeshSkeleton(FReferenceSkeleton& RefSkeleton, int32& SkeletalDepth, FSkeletalMeshImportData& ImportData) { TArray <VBone>& RefBonesBinary = ImportData.RefBonesBinary; // Setup skeletal hierarchy + names structure. RefSkeleton.Empty(); // Digest bones to the serializable format. for( int32 b=0; b<RefBonesBinary.Num(); b++ ) { const VBone & BinaryBone = RefBonesBinary[ b ]; const FString BoneName = FSkeletalMeshImportData::FixupBoneName( BinaryBone.Name ); const FMeshBoneInfo BoneInfo(FName(*BoneName, FNAME_Add, true), BinaryBone.ParentIndex); const FTransform BoneTransform(BinaryBone.BonePos.Orientation, BinaryBone.BonePos.Position, FVector(1.f)); if(RefSkeleton.FindBoneIndex(BoneInfo.Name) != INDEX_NONE) { UnFbx::FFbxImporter* FFbxImporter = UnFbx::FFbxImporter::GetInstance(); FFbxImporter->AddTokenizedErrorMessage(FTokenizedMessage::Create(EMessageSeverity::Error, FText::Format(LOCTEXT("SkeletonHasDuplicateBones", "Skeleton has non-unique bone names.\nBone named '{0}' encountered more than once."), FText::FromName(BoneInfo.Name)))); return false; } RefSkeleton.Add(BoneInfo, BoneTransform); } // Add hierarchy index to each bone and detect max depth. SkeletalDepth = 0; TArray<int32> SkeletalDepths; SkeletalDepths.Empty( RefBonesBinary.Num() ); SkeletalDepths.AddZeroed( RefBonesBinary.Num() ); for( int32 b=0; b < RefSkeleton.GetNum(); b++ ) { int32 Parent = RefSkeleton.GetParentIndex(b); int32 Depth = 1.0f; SkeletalDepths[b] = 1.0f; if( Parent != INDEX_NONE ) { Depth += SkeletalDepths[Parent]; } if( SkeletalDepth < Depth ) { SkeletalDepth = Depth; } SkeletalDepths[b] = Depth; } return true; }