#pragma once #include "npc/NpcDataLoader.h" #include #include #include #include namespace frostbite2D { class NpcAnimation : public Actor { public: struct CompositeFrameInfo { bool valid = false; Rect localBounds; Vec2 originInTexture = Vec2::Zero(); Vec2 groundAnchorInTexture = Vec2::Zero(); int width = 1; int height = 1; }; bool Init(const npc::NpcConfig& config); void Update(float deltaTime) override; void Render() override; void SetDirection(int direction); bool IsReady() const { return displayAnimation_ != nullptr; } bool IsAnimationFinished() const; const std::string& GetAnimationPath() const { return animationPath_; } bool GetDisplayLocalBounds(Rect& outBounds) const; bool EnsureCompositeTextureReady(); bool HasCompositeTexture() const; Ptr GetCompositeTexture() const; Vec2 GetCompositeTextureSize() const; Vec2 GetCompositeGroundAnchorInTexture() const; uint64 GetCompositeVersion() const { return compositeVersion_; } private: CompositeFrameInfo ComputeCompositeFrameInfo(int direction) const; CompositeFrameInfo GetCurrentCompositeFrameInfo() const { return compositeFrameInfo_; } uint64 CaptureCurrentRenderSignature() const; void MarkCompositeDirty(); void UpdateCompositeCamera(); void RefreshCompositeTextureIfNeeded(); void RenderCurrentAnimationToCompositeCanvas(); RefPtr displayAnimation_ = nullptr; RefPtr compositeCanvas_ = nullptr; CompositeFrameInfo compositeFrameInfo_; std::string animationPath_; int direction_ = 1; bool compositeDirty_ = true; uint64 compositeVersion_ = 0; uint64 lastCompositeSignature_ = 0; }; } // namespace frostbite2D