Skip to content

Commit d83fb53

Browse files
committed
abstracted and extended animation controls to the mask data class
1 parent 9be11ce commit d83fb53

File tree

3 files changed

+143
-20
lines changed

3 files changed

+143
-20
lines changed

mask-resource-animation.h

Lines changed: 29 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,20 @@ namespace Mask {
6464
virtual void SetAnimatableValue(float v, AnimationChannelType act) = 0;
6565
};
6666

67+
class IAnimationControls {
68+
public:
69+
virtual void Play() = 0;
70+
virtual void PlayBackwards() = 0;
71+
virtual void Stop() = 0;
72+
virtual void Rewind(bool last = false) = 0;
73+
virtual float GetDuration() = 0;
74+
virtual float LastFrame() = 0;
75+
virtual float GetFPS() = 0;
76+
virtual float GetPlaybackSpeed() = 0;
77+
virtual void SetPlaybackSpeed(float speed) = 0;
78+
virtual void Seek(float time) = 0;
79+
};
80+
6781
struct AnimationInstanceData : public InstanceData {
6882
float elapsed;
6983
AnimationInstanceData() : elapsed(0.0f) {}
@@ -72,16 +86,16 @@ namespace Mask {
7286

7387
struct AnimationChannel {
7488
std::shared_ptr<IAnimatable> item;
75-
AnimationChannelType type;
76-
AnimationBehaviour preState;
77-
AnimationBehaviour postState;
78-
std::vector<float> values;
89+
AnimationChannelType type;
90+
AnimationBehaviour preState;
91+
AnimationBehaviour postState;
92+
std::vector<float> values;
7993

8094
float GetValue(int frame);
8195
};
8296

8397

84-
class Animation : public IBase {
98+
class Animation : public IBase, IAnimationControls {
8599
public:
86100
Animation(Mask::MaskData* parent, std::string name, obs_data_t* data);
87101
virtual ~Animation();
@@ -90,16 +104,16 @@ namespace Mask {
90104
virtual void Update(Mask::Part* part, float time) override;
91105
virtual void Render(Mask::Part* part) override;
92106

93-
void Play() { m_speed = 1.0f; }
94-
void PlayBackwards() { m_speed = -1.0f; }
95-
void Stop() { m_speed = 0.0f; }
96-
void Rewind(bool last = false) { last ? Seek(LastFrame()) : Seek(0); }
97-
float GetDuration() { return m_duration; }
98-
float LastFrame() { return m_duration - (1.0f / m_fps); }
99-
float GetFPS() { return m_fps; }
100-
float GetPlaybackSpeed() { return m_speed; }
101-
void SetPlaybackSpeed(float speed) { m_speed = speed; }
102-
void Seek(float time);
107+
void Play() override { m_speed = 1.0f; }
108+
void PlayBackwards() override { m_speed = -1.0f; }
109+
void Stop() override { m_speed = 0.0f; }
110+
void Rewind(bool last = false) override { last ? Seek(LastFrame()) : Seek(0); }
111+
float GetDuration() override { return m_duration; }
112+
float LastFrame() override { return m_duration - (1.0f / m_fps); }
113+
float GetFPS() override { return m_fps; }
114+
float GetPlaybackSpeed() override { return m_speed; }
115+
void SetPlaybackSpeed(float speed) override { m_speed = speed; }
116+
void Seek(float time) override;
103117

104118
protected:
105119
float m_speed;

mask.cpp

Lines changed: 101 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -468,12 +468,14 @@ void Mask::MaskData::PartCalcMatrix(std::shared_ptr<Mask::Part> _part) {
468468

469469
void Mask::MaskData::Tick(float time) {
470470
// update animations with the first Part
471+
Part* p = nullptr;
471472
for (auto aakv : m_animations) {
472473
if (aakv.second) {
473-
Part* p = nullptr;
474-
for (auto kv : m_parts) {
475-
p = kv.second.get();
476-
break;
474+
if (!p) {
475+
for (auto kv : m_parts) {
476+
p = kv.second.get();
477+
break;
478+
}
477479
}
478480
aakv.second->Update(p, time);
479481
}
@@ -637,6 +639,101 @@ std::shared_ptr<Mask::Part> Mask::MaskData::LoadPart(std::string name, obs_data_
637639
return current;
638640
}
639641

642+
643+
void Mask::MaskData::Play() {
644+
for (auto aakv : m_animations) {
645+
if (aakv.second) {
646+
aakv.second->Play();
647+
}
648+
}
649+
}
650+
651+
void Mask::MaskData::PlayBackwards() {
652+
for (auto aakv : m_animations) {
653+
if (aakv.second) {
654+
aakv.second->PlayBackwards();
655+
}
656+
}
657+
}
658+
659+
void Mask::MaskData::Stop() {
660+
for (auto aakv : m_animations) {
661+
if (aakv.second) {
662+
aakv.second->Stop();
663+
}
664+
}
665+
}
666+
667+
void Mask::MaskData::Rewind(bool last) {
668+
for (auto aakv : m_animations) {
669+
if (aakv.second) {
670+
aakv.second->Rewind(last);
671+
}
672+
}
673+
}
674+
675+
float Mask::MaskData::GetDuration() {
676+
// find max
677+
float d = 0.0f;
678+
for (auto aakv : m_animations) {
679+
if (aakv.second) {
680+
if (d < aakv.second->GetDuration())
681+
d = aakv.second->GetDuration();
682+
}
683+
}
684+
return d;
685+
}
686+
687+
float Mask::MaskData::LastFrame() {
688+
// find max
689+
float f = 0.0f;
690+
for (auto aakv : m_animations) {
691+
if (aakv.second) {
692+
if (f < aakv.second->LastFrame())
693+
f = aakv.second->LastFrame();
694+
}
695+
}
696+
return f;
697+
}
698+
699+
float Mask::MaskData::GetFPS() {
700+
// just grab first
701+
for (auto aakv : m_animations) {
702+
if (aakv.second) {
703+
return aakv.second->GetFPS();
704+
}
705+
}
706+
return 0.0f;
707+
}
708+
709+
float Mask::MaskData::GetPlaybackSpeed() {
710+
// just grab first
711+
for (auto aakv : m_animations) {
712+
if (aakv.second) {
713+
return aakv.second->GetPlaybackSpeed();
714+
}
715+
}
716+
return 0.0f;
717+
}
718+
719+
void Mask::MaskData::SetPlaybackSpeed(float speed) {
720+
for (auto aakv : m_animations) {
721+
if (aakv.second) {
722+
aakv.second->SetPlaybackSpeed(speed);
723+
}
724+
}
725+
}
726+
727+
void Mask::MaskData::Seek(float time) {
728+
for (auto aakv : m_animations) {
729+
if (aakv.second) {
730+
aakv.second->Seek(time);
731+
}
732+
}
733+
}
734+
735+
736+
640737
Mask::Resource::Morph* Mask::MaskData::GetMorph() {
641738
// cache the morph pointer so we dont constantly search for it
642739
if (m_morph == nullptr) {

mask.h

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ namespace Mask {
8686
class Animation;
8787
}
8888

89-
class MaskData {
89+
class MaskData : public Resource::IAnimationControls {
9090
public:
9191
MaskData();
9292
virtual ~MaskData();
@@ -114,6 +114,18 @@ namespace Mask {
114114
void Tick(float time);
115115
void Render(bool depthOnly = false);
116116

117+
// IAnimationControls
118+
void Play() override;
119+
void PlayBackwards() override;
120+
void Stop() override;
121+
void Rewind(bool last = false) override;
122+
float GetDuration() override;
123+
float LastFrame() override;
124+
float GetFPS() override;
125+
float GetPlaybackSpeed() override;
126+
void SetPlaybackSpeed(float speed) override;
127+
void Seek(float time) override;
128+
117129
// sorted draw objects
118130
void ClearSortedDrawObjects();
119131
void AddSortedDrawObject(SortedDrawObject* obj);

0 commit comments

Comments
 (0)