165 lines
4.6 KiB
C++
165 lines
4.6 KiB
C++
// Copyright (c) 2012-2023 Wojciech Figat. All rights reserved.
|
|
|
|
#pragma once
|
|
|
|
#include "../BinaryAsset.h"
|
|
#include "Engine/Core/Collections/Dictionary.h"
|
|
#include "Engine/Animations/AnimationData.h"
|
|
#include "Engine/Content/AssetReference.h"
|
|
|
|
class SkinnedModel;
|
|
class AnimEvent;
|
|
|
|
/// <summary>
|
|
/// Asset that contains an animation spline represented by a set of keyframes, each representing an endpoint of a linear curve.
|
|
/// </summary>
|
|
API_CLASS(NoSpawn) class FLAXENGINE_API Animation : public BinaryAsset
|
|
{
|
|
DECLARE_BINARY_ASSET_HEADER(Animation, 1);
|
|
|
|
/// <summary>
|
|
/// Contains basic information about the animation asset contents.
|
|
/// </summary>
|
|
API_STRUCT() struct FLAXENGINE_API InfoData
|
|
{
|
|
DECLARE_SCRIPTING_TYPE_NO_SPAWN(InfoData);
|
|
|
|
/// <summary>
|
|
/// Length of the animation in seconds.
|
|
/// </summary>
|
|
API_FIELD() float Length;
|
|
|
|
/// <summary>
|
|
/// Amount of animation frames (some curve tracks may use less keyframes).
|
|
/// </summary>
|
|
API_FIELD() int32 FramesCount;
|
|
|
|
/// <summary>
|
|
/// Amount of animation channel tracks.
|
|
/// </summary>
|
|
API_FIELD() int32 ChannelsCount;
|
|
|
|
/// <summary>
|
|
/// The total amount of keyframes in the animation tracks.
|
|
/// </summary>
|
|
API_FIELD() int32 KeyframesCount;
|
|
|
|
/// <summary>
|
|
/// The estimated memory usage (in bytes) of the animation (all tracks and keyframes size in memory).
|
|
/// </summary>
|
|
API_FIELD() int32 MemoryUsage;
|
|
};
|
|
|
|
/// <summary>
|
|
/// Contains <see cref="AnimEvent"/> instance.
|
|
/// </summary>
|
|
struct FLAXENGINE_API AnimEventData
|
|
{
|
|
float Duration = 0.0f;
|
|
AnimEvent* Instance = nullptr;
|
|
#if USE_EDITOR
|
|
StringAnsi TypeName;
|
|
#endif
|
|
};
|
|
|
|
/// <summary>
|
|
/// Contains <see cref="AnimEvent"/> instance.
|
|
/// </summary>
|
|
struct FLAXENGINE_API NestedAnimData
|
|
{
|
|
float Time = 0.0f;
|
|
float Duration = 0.0f;
|
|
float Speed = 1.0f;
|
|
float StartTime = 0.0f;
|
|
bool Enabled = false;
|
|
bool Loop = false;
|
|
AssetReference<Animation> Anim;
|
|
};
|
|
|
|
private:
|
|
#if USE_EDITOR
|
|
bool _registeredForScriptingReload = false;
|
|
void OnScriptsReloadStart();
|
|
#endif
|
|
|
|
public:
|
|
/// <summary>
|
|
/// The animation data.
|
|
/// </summary>
|
|
AnimationData Data;
|
|
|
|
/// <summary>
|
|
/// The animation events (keyframes per named track).
|
|
/// </summary>
|
|
Array<Pair<String, StepCurve<AnimEventData>>> Events;
|
|
|
|
/// <summary>
|
|
/// The nested animations (animation per named track).
|
|
/// </summary>
|
|
Array<Pair<String, NestedAnimData>> NestedAnims;
|
|
|
|
public:
|
|
/// <summary>
|
|
/// Gets the length of the animation (in seconds).
|
|
/// </summary>
|
|
API_PROPERTY() float GetLength() const
|
|
{
|
|
return IsLoaded() ? Data.GetLength() : 0.0f;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Gets the duration of the animation (in frames).
|
|
/// </summary>
|
|
API_PROPERTY() float GetDuration() const
|
|
{
|
|
return (float)Data.Duration;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Gets the amount of the animation frames per second.
|
|
/// </summary>
|
|
API_PROPERTY() float GetFramesPerSecond() const
|
|
{
|
|
return (float)Data.FramesPerSecond;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Gets the animation clip info.
|
|
/// </summary>
|
|
API_PROPERTY() InfoData GetInfo() const;
|
|
|
|
#if USE_EDITOR
|
|
/// <summary>
|
|
/// Gets the animation as serialized timeline data. Used to show it in Editor.
|
|
/// </summary>
|
|
/// <param name="result">The output timeline data container. Empty if failed to load.</param>
|
|
API_FUNCTION() void LoadTimeline(API_PARAM(Out) BytesContainer& result) const;
|
|
|
|
/// <summary>
|
|
/// Saves the serialized timeline data to the asset as animation.
|
|
/// </summary>
|
|
/// <remarks>The 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(BytesContainer& data);
|
|
|
|
/// <summary>
|
|
/// Saves the animation data to the asset. Supported only in Editor.
|
|
/// </summary>
|
|
/// <remarks>The cannot be used by virtual assets.</remarks>
|
|
/// <returns><c>true</c> failed to save data; otherwise, <c>false</c>.</returns>
|
|
bool Save(const StringView& path = StringView::Empty);
|
|
#endif
|
|
|
|
public:
|
|
// [BinaryAsset]
|
|
uint64 GetMemoryUsage() const override;
|
|
void OnScriptingDispose() override;
|
|
|
|
protected:
|
|
// [BinaryAsset]
|
|
LoadResult load() override;
|
|
void unload(bool isReloading) override;
|
|
AssetChunksFlag getChunksToPreload() const override;
|
|
};
|