// Copyright Epic Games, Inc. All Rights Reserved. #pragma once #include "Camera/CameraShakeBase.h" #include "Camera/CameraTypes.h" #include "Channels/MovieSceneChannel.h" #include "Channels/MovieSceneChannelData.h" #include "Channels/MovieSceneChannelTraits.h" #include "Containers/Array.h" #include "Containers/ArrayView.h" #include "CoreTypes.h" #include "Curves/KeyHandle.h" #include "Math/Range.h" #include "Math/Rotator.h" #include "Misc/FrameNumber.h" #include "Misc/FrameTime.h" #include "Templates/SubclassOf.h" #include "UObject/ObjectMacros.h" #include "MovieSceneCameraShakeSourceTriggerChannel.generated.h" class UCameraShakeBase; struct FFrameRate; struct FKeyHandle; USTRUCT(BlueprintType) struct FMovieSceneCameraShakeSourceTrigger { GENERATED_BODY() FMovieSceneCameraShakeSourceTrigger() : ShakeClass(nullptr) , PlayScale(1.f) , PlaySpace(ECameraShakePlaySpace::CameraLocal) , UserDefinedPlaySpace(ForceInitToZero) {} FMovieSceneCameraShakeSourceTrigger(TSubclassOf InShakeClass) : ShakeClass(InShakeClass) , PlayScale(1.f) , PlaySpace(ECameraShakePlaySpace::CameraLocal) , UserDefinedPlaySpace(ForceInitToZero) {} /** Class of the camera shake to play */ UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="Camera Shake") TSubclassOf ShakeClass; /** Scalar that affects shake intensity */ UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="Camera Shake") float PlayScale; UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="Camera Shake") ECameraShakePlaySpace PlaySpace; UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="Camera Shake") FRotator UserDefinedPlaySpace; }; USTRUCT() struct FMovieSceneCameraShakeSourceTriggerChannel : public FMovieSceneChannel { GENERATED_BODY() typedef FMovieSceneCameraShakeSourceTrigger CurveValueType; FORCEINLINE TMovieSceneChannelData GetData() { return TMovieSceneChannelData(&KeyTimes, &KeyValues, this, &KeyHandles); } FORCEINLINE TMovieSceneChannelData GetData() const { return TMovieSceneChannelData(&KeyTimes, &KeyValues); } public: // ~ FMovieSceneChannel Interface MOVIESCENETRACKS_API virtual void GetKeys(const TRange& WithinRange, TArray* OutKeyTimes, TArray* OutKeyHandles) override; MOVIESCENETRACKS_API virtual void GetKeyTimes(TArrayView InHandles, TArrayView OutKeyTimes) override; MOVIESCENETRACKS_API virtual void SetKeyTimes(TArrayView InHandles, TArrayView InKeyTimes) override; MOVIESCENETRACKS_API virtual void DuplicateKeys(TArrayView InHandles, TArrayView OutNewHandles) override; MOVIESCENETRACKS_API virtual void DeleteKeys(TArrayView InHandles) override; MOVIESCENETRACKS_API virtual void DeleteKeysFrom(FFrameNumber InTime, bool bDeleteKeysBefore) override; MOVIESCENETRACKS_API virtual void RemapTimes(const UE::MovieScene::IRetimingInterface& Retimer) override; MOVIESCENETRACKS_API virtual TRange ComputeEffectiveRange() const override; MOVIESCENETRACKS_API virtual int32 GetNumKeys() const override; MOVIESCENETRACKS_API virtual void Reset() override; MOVIESCENETRACKS_API virtual void Offset(FFrameNumber DeltaPosition) override; private: /** Array of times for each key */ UPROPERTY(meta=(KeyTimes)) TArray KeyTimes; /** Array of values that correspond to each key time */ UPROPERTY(meta=(KeyValues)) TArray KeyValues; /** This needs to be a UPROPERTY so it gets saved into editor transactions but transient so it doesn't get saved into assets. */ UPROPERTY(Transient) FMovieSceneKeyHandleMap KeyHandles; }; template<> struct TMovieSceneChannelTraits : TMovieSceneChannelTraitsBase { enum { SupportsDefaults = false }; }; inline bool EvaluateChannel(const FMovieSceneCameraShakeSourceTriggerChannel* InChannel, FFrameTime InTime, FMovieSceneCameraShakeSourceTrigger& OutValue) { return false; }