Polyphase Game Engine
Loading...
Searching...
No Matches
SpriteAnimator.h
Go to the documentation of this file.
1#pragma once
2
3#include "Nodes/Node.h"
5#include "AssetRef.h"
6#include "ScriptFunc.h"
7
8#include "glm/glm.hpp"
9
10#include <string>
11#include <vector>
12#include <unordered_map>
13
14class Texture;
15
16// One playable animation entry inside a SpriteAnimator. May be backed either
17// by a SpriteAnimation asset (sourceAsset != null) — in which case Discrete vs
18// AtlasGrid mode and atlas UV math come from the asset — or by a runtime-built
19// list of textures (script-built via CreateAnimation/AddImage), which is
20// always Discrete-mode.
22{
23 std::string name;
25
26 // Used only when sourceAsset is null (script-built entries).
27 std::vector<TextureRef> frames;
28 float fps = 12.0f;
29 bool loop = true;
30};
31
32// A logical animator that advances a named animation over time and exposes the
33// current frame as a Texture* (and atlas UVs). Bind GetCurrentTexture() to a
34// Quad's SetTexture, or to a Material parameter via SetTextureParameter, to
35// drive any kind of sprite-driven visual.
36//
37// Designed as a plain Node (not Node3D / not Widget) — it has no transform of
38// its own, just produces output. Sits alongside whatever node renders the
39// sprite (Quad, MeshRenderer with material, etc.).
41{
42public:
43
45
47 virtual ~SpriteAnimator();
48
49 virtual const char* GetTypeName() const override;
50 virtual void GatherProperties(std::vector<Property>& outProps) override;
51#if EDITOR
52 virtual bool DrawCustomProperty(Property& prop) override;
53#endif
54
55 virtual void Create() override;
56 virtual void Destroy() override;
57 virtual void Start() override;
58 virtual void Tick(float deltaTime) override;
59 virtual void EditorTick(float deltaTime) override;
60
61 // Lifecycle / playback
62 void Play();
63 void Pause();
64 void Stop();
65 void PlayAnimation(const std::string& name);
66 void SetFrame(int32_t frameIndex);
67 bool AnimateTo(int32_t targetFrame, bool pauseOnFinished, const ScriptFunc& onFinished);
68 bool AnimateToProgress(float progress, bool pauseOnFinished, const ScriptFunc& onFinished);
69 void CancelAnimateTo();
70 void SetSpeed(float speed);
71 float GetSpeed() const { return mPlaybackSpeed; }
72 bool IsPlaying() const { return mPlaying; }
73
74 bool GetAutoPlay() const { return mAutoPlay; }
75 void SetAutoPlay(bool autoPlay) { mAutoPlay = autoPlay; }
76 bool GetLoopOverride() const { return mLoopOverride; }
77 void SetLoopOverride(bool loop) { mLoopOverride = loop; }
78 const std::string& GetDefaultAnimation() const { return mDefaultAnimation; }
79 void SetDefaultAnimation(const std::string& name) { mDefaultAnimation = name; }
80
81 // Asset-driven registration
82 void AddAnimation(SpriteAnimation* asset);
83 void AddAnimation(const std::string& assetPath);
84
85 // Runtime-built registration (always Discrete mode)
86 void CreateAnimation(const std::string& name);
87 void CreateAnimation(const std::string& name, const std::vector<Texture*>& frames);
88 void AddImage(const std::string& name, Texture* tex);
89 void AddImage(const std::string& name, const std::string& path);
90 void AddImages(const std::string& name, const std::vector<std::string>& paths);
91
92 void RemoveAnimation(const std::string& name);
93 bool HasAnimation(const std::string& name) const;
94
95 float GetProgress() const;
96
97 // Output for binding (works uniformly for Discrete and AtlasGrid frames)
98 Texture* GetCurrentTexture() const;
99 glm::vec2 GetCurrentUVScale() const; // (1,1) for discrete; (uv1-uv0) for atlas
100 glm::vec2 GetCurrentUVOffset() const; // (0,0) for discrete; uv0 for atlas
101 glm::vec4 GetCurrentUVRect() const; // (u0,v0,u1,v1) packed for material vec4 params
102 const std::string& GetCurrentAnimationName() const { return mCurrentName; }
103 int32_t GetCurrentFrameIndex() const { return mCurrentFrame; }
104
105 // Editor preview: when true, EditorTick advances the animation so users
106 // can scrub through frames without entering Play mode. Off by default.
107 bool GetEditorPreview() const { return mEditorPreview; }
108 void SetEditorPreview(bool enabled) { mEditorPreview = enabled; }
109
110protected:
111
112 static bool HandlePropChange(Datum* datum, uint32_t index, const void* newValue);
113
114 void RebuildRegistry();
115 void TickInternal(float deltaTime);
116 bool ResolveCurrentUV(glm::vec2& outUV0, glm::vec2& outUV1) const;
117 Texture* ResolveCurrentTexture() const;
118 SpriteAnimEntry* FindEntry(const std::string& name);
119 const SpriteAnimEntry* FindEntry(const std::string& name) const;
120 int32_t EntryFrameCount(const SpriteAnimEntry& entry) const;
121 float EntryFps(const SpriteAnimEntry& entry) const;
122 bool EntryLoop(const SpriteAnimEntry& entry) const;
123
124 // Property-backed
125 std::vector<SpriteAnimationRef> mAnimations;
126 std::string mDefaultAnimation;
127 bool mAutoPlay = true;
128 bool mLoopOverride = false;
129 float mPlaybackSpeed = 1.0f;
130
131 // Synthetic editor-only "Editor Preview" toggle (stored, not serialized as a
132 // gameplay property — but exposed in inspector for live preview).
133 bool mEditorPreview = false;
134
135 // Synthetic Play/Stop button placeholders for inspector buttons (SoundWave-style).
136 bool mEditorPlayButton = false;
137 bool mEditorStopButton = false;
138
139 // Runtime registry — unifies asset entries and script-built entries by name.
140 std::unordered_map<std::string, SpriteAnimEntry> mRegistry;
141
142 // Playback state
143 std::string mCurrentName;
144 int32_t mCurrentFrame = 0;
145 float mElapsed = 0.0f;
146 bool mPlaying = false;
147 bool mRegistryDirty = true;
148
149 // AnimateTo: set by AnimateTo()/AnimateToProgress(); checked + cleared in
150 // TickInternal when target frame is reached.
151 bool mAnimateToActive = false;
152 int32_t mAnimateToTarget = -1;
153 bool mAnimateToPause = true;
155};
#define POLYPHASE_API
Definition PolyphaseAPI.h:31
Definition AssetRef.h:18
Definition Datum.h:164
Definition Node.h:67
virtual void EditorTick(float deltaTime)
Definition Node.cpp:563
virtual void Create()
Definition Node.cpp:220
virtual void Stop()
Definition Node.cpp:504
virtual void GatherProperties(std::vector< Property > &outProps) override
Definition Node.cpp:598
static bool HandlePropChange(Datum *datum, uint32_t index, const void *newValue)
Definition Node.cpp:74
virtual void Start()
Definition Node.cpp:459
virtual void Tick(float deltaTime)
Definition Node.cpp:558
virtual const char * GetTypeName() const
Definition Node.cpp:1513
virtual void Destroy()
Definition Node.cpp:234
virtual bool DrawCustomProperty(Property &prop)
Definition Object.h:46
Definition Property.h:14
Definition ScriptFunc.h:10
Definition SpriteAnimation.h:31
Definition SpriteAnimator.h:41
DECLARE_NODE(SpriteAnimator, Node)
bool GetEditorPreview() const
Definition SpriteAnimator.h:107
std::vector< SpriteAnimationRef > mAnimations
Definition SpriteAnimator.h:125
std::string mDefaultAnimation
Definition SpriteAnimator.h:126
void SetEditorPreview(bool enabled)
Definition SpriteAnimator.h:108
void SetAutoPlay(bool autoPlay)
Definition SpriteAnimator.h:75
bool IsPlaying() const
Definition SpriteAnimator.h:72
ScriptFunc mAnimateToCallback
Definition SpriteAnimator.h:154
std::string mCurrentName
Definition SpriteAnimator.h:143
int32_t GetCurrentFrameIndex() const
Definition SpriteAnimator.h:103
bool GetAutoPlay() const
Definition SpriteAnimator.h:74
bool GetLoopOverride() const
Definition SpriteAnimator.h:76
float GetSpeed() const
Definition SpriteAnimator.h:71
const std::string & GetCurrentAnimationName() const
Definition SpriteAnimator.h:102
std::unordered_map< std::string, SpriteAnimEntry > mRegistry
Definition SpriteAnimator.h:140
void SetDefaultAnimation(const std::string &name)
Definition SpriteAnimator.h:79
const std::string & GetDefaultAnimation() const
Definition SpriteAnimator.h:78
void SetLoopOverride(bool loop)
Definition SpriteAnimator.h:77
Definition Texture.h:10
Definition SpriteAnimator.h:22
std::string name
Definition SpriteAnimator.h:23
std::vector< TextureRef > frames
Definition SpriteAnimator.h:27
SpriteAnimationRef sourceAsset
Definition SpriteAnimator.h:24
bool loop
Definition SpriteAnimator.h:29
float fps
Definition SpriteAnimator.h:28