Files
UnrealEngineUWP/Engine/Source/Runtime/MovieSceneTracks/Private/Systems/DoublePerlinNoiseChannelEvaluatorSystem.cpp
Max Chen 1dc4497688 Sequencer: Static analysis fix - Use UE_ARRAY_COUNT instead of size_of
#jira UE-137361
#preflight 61b8c62b9c7c3936c8c79db6
#rb ludovic.chabant

[CL 18456387 by Max Chen in ue5-main branch]
2021-12-14 13:11:14 -05:00

84 lines
3.1 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#include "Systems/DoublePerlinNoiseChannelEvaluatorSystem.h"
#include "Systems/MovieScenePiecewiseDoubleBlenderSystem.h"
#include "EntitySystem/BuiltInComponentTypes.h"
#include "EntitySystem/MovieSceneEntitySystemTask.h"
#include "EntitySystem/MovieSceneEntitySystemLinker.h"
#include "EntitySystem/MovieSceneEvalTimeSystem.h"
#include "Channels/MovieSceneDoublePerlinNoiseChannel.h"
#include "MovieSceneTracksComponentTypes.h"
#include "Math/NumericLimits.h"
DECLARE_CYCLE_STAT(TEXT("MovieScene: Evaluate Double Perlin Noise channels"), MovieSceneEval_EvaluateDoublePerlinNoiseChannelTask, STATGROUP_MovieSceneECS);
namespace UE
{
namespace MovieScene
{
struct FEvaluateDoublePerlinNoiseChannels
{
FInstanceRegistry* InstanceRegistry;
FEvaluateDoublePerlinNoiseChannels(FInstanceRegistry* InInstanceRegistry)
: InstanceRegistry{ InInstanceRegistry }
{
check(InstanceRegistry);
}
void ForEachEntity(FMovieSceneDoublePerlinNoiseChannel DoublePerlinNoiseChannel, FInstanceHandle InstanceHandle, double& OutResult)
{
const FMovieSceneContext& Context = InstanceRegistry->GetContext(InstanceHandle);
FFrameTime Time = Context.GetTime();
FFrameRate Rate = Context.GetFrameRate();
OutResult = DoublePerlinNoiseChannel.Evaluate(Rate.AsSeconds(Time));
}
};
} // namespace MovieScene
} // namespace UE
UDoublePerlinNoiseChannelEvaluatorSystem::UDoublePerlinNoiseChannelEvaluatorSystem(const FObjectInitializer& ObjInit)
: Super(ObjInit)
{
using namespace UE::MovieScene;
const FBuiltInComponentTypes* BuiltInComponents = FBuiltInComponentTypes::Get();
const FMovieSceneTracksComponentTypes* TrackComponents = FMovieSceneTracksComponentTypes::Get();
RelevantComponent = TrackComponents->DoublePerlinNoiseChannel;
if (HasAnyFlags(RF_ClassDefaultObject))
{
// Allow writing to all the possible channels
for (int32 i = 0; i < UE_ARRAY_COUNT(BuiltInComponents->DoubleResult); ++i)
{
DefineComponentProducer(UDoublePerlinNoiseChannelEvaluatorSystem::StaticClass(), BuiltInComponents->DoubleResult[i]);
}
DefineImplicitPrerequisite(UMovieSceneEvalTimeSystem::StaticClass(), GetClass());
DefineImplicitPrerequisite(GetClass(), UMovieScenePiecewiseDoubleBlenderSystem::StaticClass());
}
}
void UDoublePerlinNoiseChannelEvaluatorSystem::OnRun(FSystemTaskPrerequisites& InPrerequisites, FSystemSubsequentTasks& Subsequents)
{
using namespace UE::MovieScene;
const FBuiltInComponentTypes* BuiltInComponents = FBuiltInComponentTypes::Get();
const FMovieSceneTracksComponentTypes* TrackComponents = FMovieSceneTracksComponentTypes::Get();
for (int32 i = 0; i < UE_ARRAY_COUNT(BuiltInComponents->DoubleResult); ++i)
{
FEntityTaskBuilder()
.Read(TrackComponents->DoublePerlinNoiseChannel)
.Read(BuiltInComponents->InstanceHandle)
.Write(BuiltInComponents->DoubleResult[i])
.FilterNone({ BuiltInComponents->Tags.Ignored })
.SetStat(GET_STATID(MovieSceneEval_EvaluateDoublePerlinNoiseChannelTask))
.Dispatch_PerEntity<FEvaluateDoublePerlinNoiseChannels>(&Linker->EntityManager, InPrerequisites, &Subsequents, GetLinker()->GetInstanceRegistry());
}
}