void FMovieSceneAnimationTrackInstance::Update( float Position, float LastPosition, const TArray<UObject*>& RuntimeObjects, class IMovieScenePlayer& Player ) { // @todo Sequencer gameplay update has a different code path than editor update for animation for (int32 i = 0; i < RuntimeObjects.Num(); ++i) { IMatineeAnimInterface* AnimInterface = Cast<IMatineeAnimInterface>(RuntimeObjects[i]); if (AnimInterface) { UMovieSceneAnimationSection* AnimSection = Cast<UMovieSceneAnimationSection>(AnimationTrack->GetAnimSectionAtTime(Position)); if (AnimSection) { int32 ChannelIndex = 0; FName SlotName = FName("AnimationSlot"); UAnimSequence* AnimSequence = AnimSection->GetAnimSequence(); float AnimPosition = FMath::Fmod(Position - AnimSection->GetAnimationStartTime(), AnimSection->GetAnimationDuration()) / AnimSection->GetAnimationDilationFactor(); AnimInterface->PreviewBeginAnimControl(NULL); AnimInterface->PreviewSetAnimPosition(SlotName, ChannelIndex, AnimSequence, AnimPosition, true, false, 0.f); } } } }
int32 FAnimationSection::OnPaintSection( const FGeometry& AllottedGeometry, const FSlateRect& SectionClippingRect, FSlateWindowElementList& OutDrawElements, int32 LayerId, bool bParentEnabled ) const { UMovieSceneAnimationSection* AnimSection = Cast<UMovieSceneAnimationSection>(&Section); FTimeToPixel TimeToPixelConverter( AllottedGeometry, TRange<float>( Section.GetStartTime(), Section.GetEndTime() ) ); // Add a box for the section FSlateDrawElement::MakeBox( OutDrawElements, LayerId, AllottedGeometry.ToPaintGeometry(), FEditorStyle::GetBrush("Sequencer.GenericSection.Background"), SectionClippingRect, ESlateDrawEffect::None, FLinearColor(0.7f, 0.4f, 0.7f, 1.f) ); // Darken the part that doesn't have animation if (AnimSection->GetAnimationStartTime() > AnimSection->GetStartTime()) { float StartDarkening = AnimSection->GetStartTime(); float EndDarkening = FMath::Min(AnimSection->GetAnimationStartTime(), AnimSection->GetEndTime()); float StartPixels = TimeToPixelConverter.TimeToPixel(StartDarkening); float EndPixels = TimeToPixelConverter.TimeToPixel(EndDarkening); FSlateDrawElement::MakeBox( OutDrawElements, LayerId + 1, AllottedGeometry.ToPaintGeometry(FVector2D(StartPixels, 0), FVector2D(EndPixels - StartPixels, AllottedGeometry.Size.Y)), FEditorStyle::GetBrush("WhiteTexture"), SectionClippingRect, ESlateDrawEffect::None, FLinearColor(0.f, 0.f, 0.f, 0.3f) ); } // Add lines where the animation starts and ends/loops float CurrentTime = AnimSection->GetAnimationStartTime(); while (CurrentTime < AnimSection->GetEndTime()) { if (CurrentTime > AnimSection->GetStartTime()) { float CurrentPixels = TimeToPixelConverter.TimeToPixel(CurrentTime); TArray<FVector2D> Points; Points.Add(FVector2D(CurrentPixels, 0)); Points.Add(FVector2D(CurrentPixels, AllottedGeometry.Size.Y)); FSlateDrawElement::MakeLines( OutDrawElements, LayerId + 2, AllottedGeometry.ToPaintGeometry(), Points, SectionClippingRect ); } CurrentTime += AnimSection->GetAnimationDuration(); } return LayerId+3; }