// Copyright (C) 2020 Jérôme Leclercq // This file is part of the "Nazara Engine - Utility module" // For conditions of distribution and use, see copyright notice in Config.hpp #pragma once #ifndef NAZARA_ANIMATION_HPP #define NAZARA_ANIMATION_HPP #include #include #include #include #include #include #include #include #include #include #include #include #include namespace Nz { struct NAZARA_UTILITY_API AnimationParams : ResourceParameters { // La frame de fin à charger std::size_t endFrame = 0xFFFFFFFF; // La frame de début à charger std::size_t startFrame = 0; bool IsValid() const; }; class Animation; struct Sequence; struct SequenceJoint; class Skeleton; using AnimationConstRef = ObjectRef; using AnimationLibrary = ObjectLibrary; using AnimationLoader = ResourceLoader; using AnimationManager = ResourceManager; using AnimationRef = ObjectRef; struct AnimationImpl; class NAZARA_UTILITY_API Animation : public RefCounted, public Resource { friend AnimationLibrary; friend AnimationLoader; friend AnimationManager; friend class Utility; public: Animation() = default; ~Animation(); bool AddSequence(const Sequence& sequence); void AnimateSkeleton(Skeleton* targetSkeleton, std::size_t frameA, std::size_t frameB, float interpolation) const; bool CreateSkeletal(std::size_t frameCount, std::size_t jointCount); void Destroy(); void EnableLoopPointInterpolation(bool loopPointInterpolation); std::size_t GetFrameCount() const; std::size_t GetJointCount() const; Sequence* GetSequence(const String& sequenceName); Sequence* GetSequence(std::size_t index); const Sequence* GetSequence(const String& sequenceName) const; const Sequence* GetSequence(std::size_t index) const; std::size_t GetSequenceCount() const; std::size_t GetSequenceIndex(const String& sequenceName) const; SequenceJoint* GetSequenceJoints(std::size_t frameIndex = 0); const SequenceJoint* GetSequenceJoints(std::size_t frameIndex = 0) const; AnimationType GetType() const; bool HasSequence(const String& sequenceName) const; bool HasSequence(std::size_t index = 0) const; bool IsLoopPointInterpolationEnabled() const; bool IsValid() const; void RemoveSequence(const String& sequenceName); void RemoveSequence(std::size_t index); template static AnimationRef New(Args&&... args); static AnimationRef LoadFromFile(const std::filesystem::path& filePath, const AnimationParams& params = AnimationParams()); static AnimationRef LoadFromMemory(const void* data, std::size_t size, const AnimationParams& params = AnimationParams()); static AnimationRef LoadFromStream(Stream& stream, const AnimationParams& params = AnimationParams()); // Signals: NazaraSignal(OnAnimationDestroy, const Animation* /*animation*/); NazaraSignal(OnAnimationRelease, const Animation* /*animation*/); private: static bool Initialize(); static void Uninitialize(); MovablePtr m_impl = nullptr; static AnimationLibrary::LibraryMap s_library; static AnimationLoader::LoaderList s_loaders; static AnimationManager::ManagerMap s_managerMap; static AnimationManager::ManagerParams s_managerParameters; }; } #include #endif // NAZARA_ANIMATION_HPP