Files
FlaxEngine/Source/Engine/Animations/SceneAnimations/SceneAnimation.h
2024-04-22 22:53:27 +02:00

478 lines
11 KiB
C++

// Copyright (c) 2012-2024 Wojciech Figat. All rights reserved.
#pragma once
#include "Engine/Content/BinaryAsset.h"
#include "Engine/Content/AssetReference.h"
#include "Engine/Core/Math/Color32.h"
#include "Engine/Animations/Curve.h"
#include "Engine/Serialization/MemoryWriteStream.h"
/// <summary>
/// Scene animation timeline for animating objects and playing cut-scenes.
/// </summary>
API_CLASS(NoSpawn) class FLAXENGINE_API SceneAnimation final : public BinaryAsset
{
DECLARE_BINARY_ASSET_HEADER(SceneAnimation, 1);
public:
/// <summary>
/// The animation timeline track data.
/// </summary>
struct Track
{
enum class Types
{
//Emitter = 0,
Folder = 1,
PostProcessMaterial = 2,
NestedSceneAnimation = 3,
ScreenFade = 4,
Audio = 5,
AudioVolume = 6,
Actor = 7,
Script = 8,
KeyframesProperty = 9,
CurveProperty = 10,
StringProperty = 11,
ObjectReferenceProperty = 12,
StructProperty = 13,
ObjectProperty = 14,
Event = 15,
CameraCut = 16,
//AnimationChannel = 17,
//AnimationChannelData = 18,
//AnimationEvent = 19,
};
enum class Flags
{
None = 0,
Mute = 1,
Loop = 2,
PrefabObject = 4,
};
/// <summary>
/// The type of the track.
/// </summary>
Types Type;
/// <summary>
/// The flags of the track.
/// </summary>
Flags Flag;
/// <summary>
/// The parent track index or -1 for root tracks.
/// </summary>
int32 ParentIndex;
/// <summary>
/// The amount of child tracks (stored in the sequence after this track).
/// </summary>
int32 ChildrenCount;
/// <summary>
/// The name of the track.
/// </summary>
String Name;
/// <summary>
/// True if track is disabled, otherwise false (cached on load based on the flags and parent flags).
/// </summary>
bool Disabled;
/// <summary>
/// The track color.
/// </summary>
Color32 Color;
/// <summary>
/// The referenced asset.
/// </summary>
AssetReference<Asset> Asset;
/// <summary>
/// The track state index.
/// </summary>
int32 TrackStateIndex;
/// <summary>
/// The track data (from the asset storage).
/// </summary>
void* Data;
/// <summary>
/// The track dependent data (from the shared runtime allocation).
/// </summary>
void* RuntimeData;
Track()
{
}
template<typename T>
FORCE_INLINE const T* GetData() const
{
return static_cast<T*>(Data);
}
template<typename T>
FORCE_INLINE T* GetRuntimeData()
{
return static_cast<T*>(RuntimeData);
}
template<typename T>
FORCE_INLINE const T* GetRuntimeData() const
{
return static_cast<T*>(RuntimeData);
}
};
struct Media
{
int32 StartFrame;
int32 DurationFrames;
};
struct PostProcessMaterialTrack
{
struct Data
{
Guid AssetID;
};
struct Runtime
{
int32 Count;
Media* Media;
};
};
struct NestedSceneAnimationTrack
{
struct Data
{
Guid AssetID;
int32 StartFrame;
int32 DurationFrames;
};
struct Runtime
{
};
};
struct ScreenFadeTrack
{
struct GradientStop
{
int32 Frame;
Color Value;
};
struct Data
{
int32 StartFrame;
int32 DurationFrames;
int32 GradientStopsCount;
};
struct Runtime
{
GradientStop* GradientStops;
};
};
struct AudioTrack
{
struct Media
{
int32 StartFrame;
int32 DurationFrames;
float Offset;
};
struct Data
{
Guid AssetID;
};
struct Runtime
{
int32 VolumeTrackIndex;
int32 Count;
Media* Media;
};
};
struct AudioVolumeTrack
{
typedef CurveBase<float, BezierCurveKeyframe<float>> CurveType;
struct Data
{
int32 KeyframesCount;
};
struct Runtime
{
int32 KeyframesCount;
BezierCurveKeyframe<float>* Keyframes;
};
};
struct ObjectTrack
{
struct Data
{
Guid ID;
};
struct Runtime
{
};
};
struct ActorTrack : ObjectTrack
{
struct Data : ObjectTrack::Data
{
};
struct Runtime : ObjectTrack::Runtime
{
};
};
struct ScriptTrack : ObjectTrack
{
struct Data : ObjectTrack::Data
{
};
struct Runtime : ObjectTrack::Runtime
{
};
};
struct PropertyTrack
{
struct Data
{
int32 ValueSize;
int32 PropertyNameLength;
int32 PropertyTypeNameLength;
};
struct Runtime
{
int32 ValueSize;
char* PropertyName;
char* PropertyTypeName;
};
};
struct KeyframesPropertyTrack : PropertyTrack
{
struct Data : PropertyTrack::Data
{
int32 KeyframesCount;
};
struct Runtime : PropertyTrack::Runtime
{
int32 KeyframesCount;
/// <summary>
/// The keyframes array (items count is KeyframesCount). Each keyframe is represented by pair of time (of type float) and the value data (of size ValueSize).
/// </summary>
void* Keyframes;
int32 KeyframesSize;
};
};
struct CurvePropertyTrack : PropertyTrack
{
enum class DataTypes
{
Unknown,
Float,
Double,
Float2,
Float3,
Float4,
Double2,
Double3,
Double4,
Quaternion,
Color,
Color32,
};
struct Data : PropertyTrack::Data
{
int32 KeyframesCount;
};
struct Runtime : PropertyTrack::Runtime
{
DataTypes DataType;
DataTypes ValueType;
int32 KeyframesCount;
/// <summary>
/// The keyframes array (items count is KeyframesCount). Each keyframe is represented by: time (of type float), value data (of size ValueSize) and two values for bezier tangents.
/// </summary>
void* Keyframes;
};
};
struct StringPropertyTrack : PropertyTrack
{
struct Data : PropertyTrack::Data
{
int32 KeyframesCount;
};
struct Runtime : PropertyTrack::Runtime
{
int32 KeyframesCount;
// ..followed by the keyframes times and the values arrays (separate)
};
};
typedef KeyframesPropertyTrack ObjectReferencePropertyTrack;
typedef PropertyTrack StructPropertyTrack;
typedef PropertyTrack ObjectPropertyTrack;
struct EventTrack
{
enum
{
MaxParams = 8,
};
struct Data
{
};
struct Runtime
{
/// <summary>
/// The total amount of the event parameters.
/// </summary>
int32 EventParamsCount;
/// <summary>
/// The event invocations count.
/// </summary>
int32 EventsCount;
/// <summary>
/// The total size of the event parameters data in bytes).
/// </summary>
int32 EventParamsSize;
/// <summary>
/// The name of the event (just a member name).
/// </summary>
char* EventName;
/// <summary>
/// The name of the event parameter type (per parameter).
/// </summary>
char* EventParamTypes[MaxParams];
/// <summary>
/// The size (in bytes) of the event parameter type data (per parameter).
/// </summary>
int32 EventParamSizes[MaxParams];
/// <summary>
/// The events data begin.
/// </summary>
const byte* DataBegin;
};
};
struct CameraCutTrack : ObjectTrack
{
struct Data : ObjectTrack::Data
{
};
struct Runtime : ObjectTrack::Runtime
{
int32 Count;
Media* Media;
};
};
private:
BytesContainer _data;
MemoryWriteStream _runtimeData;
public:
/// <summary>
/// The frames amount per second of the timeline animation.
/// </summary>
API_FIELD(ReadOnly) float FramesPerSecond;
/// <summary>
/// The animation duration (in frames).
/// </summary>
API_FIELD(ReadOnly) int32 DurationFrames;
/// <summary>
/// The tracks on the system timeline.
/// </summary>
Array<Track> Tracks;
/// <summary>
/// The amount of per-track state information required to allocate for this animation (including nested tracks).
/// </summary>
int32 TrackStatesCount;
public:
/// <summary>
/// Gets the animation duration (in seconds).
/// </summary>
API_PROPERTY() float GetDuration() const;
public:
/// <summary>
/// Gets the serialized timeline data.
/// </summary>
/// <returns>The output timeline data container. Empty if failed to load.</returns>
API_FUNCTION() const BytesContainer& LoadTimeline();
#if USE_EDITOR
/// <summary>
/// Saves the serialized timeline data to the asset.
/// </summary>
/// <remarks>It cannot be used by virtual assets.</remarks>
/// <param name="data">The timeline data container.</param>
/// <returns><c>true</c> failed to save data; otherwise, <c>false</c>.</returns>
API_FUNCTION() bool SaveTimeline(const BytesContainer& data);
#endif
public:
// [BinaryAsset]
#if USE_EDITOR
void GetReferences(Array<Guid>& output) const override;
#endif
protected:
// [SceneAnimationBase]
LoadResult load() override;
void unload(bool isReloading) override;
AssetChunksFlag getChunksToPreload() const override;
};
DECLARE_ENUM_OPERATORS(SceneAnimation::Track::Flags);