void UAnimSingleNodeInstance::SetLooping(bool bIsLooping) { bLooping = bIsLooping; if (UAnimMontage* Montage = Cast<UAnimMontage>(CurrentAsset)) { SetMontageLoop(Montage, bLooping, Montage_GetCurrentSection()); } }
void UAnimSingleNodeInstance::RestartMontage(UAnimMontage * Montage, FName FromSection) { if( Montage == CurrentAsset ) { Montage_Play(Montage, PlayRate); if( FromSection != NAME_None ) { Montage_JumpToSection(FromSection); } SetMontageLoop(Montage, bLooping, FromSection); } }
void UAnimPreviewInstance::MontagePreview_SetLoopNormal(bool bIsLooping, int32 PreferSectionIdx) { if (UAnimMontage* Montage = Cast<UAnimMontage>(CurrentAsset)) { MontagePreview_ResetSectionsOrder(); if (PreferSectionIdx == INDEX_NONE) { PreferSectionIdx = Montage->GetSectionIndexFromPosition(CurrentTime); } int32 TotalSection = Montage->CompositeSections.Num(); if (TotalSection > 0) { int PreferedInChain = TotalSection; TArray<bool> AlreadyUsed; AlreadyUsed.AddZeroed(TotalSection); while (true) { // find first not already used section int32 NotUsedIdx = 0; while (NotUsedIdx < TotalSection) { if (! AlreadyUsed[NotUsedIdx]) { break; } ++ NotUsedIdx; } if (NotUsedIdx >= TotalSection) { break; } // find if this is one we're looking for closest to starting one int32 CurSectionIdx = NotUsedIdx; int32 InChain = 0; while (true) { // find first that contains this if (CurSectionIdx == PreferSectionIdx && InChain < PreferedInChain) { PreferedInChain = InChain; PreferSectionIdx = NotUsedIdx; } AlreadyUsed[CurSectionIdx] = true; FName NextSection = Montage->CompositeSections[CurSectionIdx].NextSectionName; CurSectionIdx = Montage->GetSectionIndex(NextSection); if (CurSectionIdx == INDEX_NONE || AlreadyUsed[CurSectionIdx]) // break loops { break; } ++ InChain; } // loop this section SetMontageLoop(Montage, bIsLooping, Montage->CompositeSections[NotUsedIdx].SectionName); } if (Montage->CompositeSections.IsValidIndex(PreferSectionIdx)) { SetMontageLoop(Montage, bIsLooping, Montage->CompositeSections[PreferSectionIdx].SectionName); } } } }