1
0
Fork 0
mirror of https://github.com/AquariaOSE/Aquaria.git synced 2025-01-24 17:26:41 +00:00

move anim editor keyframes to timeline; minor cleanups

This commit is contained in:
fgenesis 2025-01-08 03:51:43 +01:00
parent c6ba6ea99d
commit 9e75e2093e
2 changed files with 77 additions and 51 deletions

View file

@ -35,8 +35,27 @@ float TIMELINE_UNIT = 0.1f;
float TIMELINE_UNIT_STEP = 0.01f;
const int KEYFRAME_POS_Y = 570;
class KeyframeWidget : public Quad
{
public:
KeyframeWidget(int key);
float t;
int key;
static KeyframeWidget *movingWidget;
BitmapText *b;
void shiftLeft();
void shiftRight();
protected:
void onUpdate(float dt);
};
class TimelineRender : public RenderObject
{
virtual ~TimelineRender()
{
}
void onRender(const RenderState& rs) const OVERRIDE
{
glLineWidth(1);
@ -49,17 +68,53 @@ class TimelineRender : public RenderObject
}
glEnd();
}
};
AnimationEditor *ae = 0;
public:
KeyframeWidget *KeyframeWidget::movingWidget = 0;
void addKeyframe(KeyframeWidget *w)
{
addChild(w, PM_POINTER);
keyframes.push_back(w);
}
inline const std::vector<KeyframeWidget*>& getKeyframes() const { return keyframes; }
void clearKeyframes()
{
for(size_t i = 0; i < keyframes.size(); ++i)
{
// They need to survive at least one more frame since this may be called from inside the keyframe click handler.
keyframes[i]->setLife(0.03f); // ie. don't call ->safeKill() here
keyframes[i]->setDecayRate(1);
}
keyframes.clear();
}
void resizeKeyframes(size_t n)
{
while(keyframes.size() > n)
{
KeyframeWidget *k = keyframes.back();
k->setLife(0.03f);
k->setDecayRate(1);
keyframes.pop_back();
}
Gradient *bgGrad = 0;
while(keyframes.size() < n)
{
KeyframeWidget *k = new KeyframeWidget(keyframes.size());
addKeyframe(k);
}
}
private:
std::vector<KeyframeWidget*> keyframes;
};
int keyframeOffset = 0;
AnimationEditor *ae = 0;
Bone *lastSelectedBone = 0;
KeyframeWidget *KeyframeWidget::movingWidget = 0;
void AnimationEditor::constrainMouse()
{
@ -83,7 +138,6 @@ KeyframeWidget::KeyframeWidget(int key) : Quad()
b->setFontSize(12);
addChild(b, PM_POINTER);
this->key = key;
ae->keyframeWidgets.push_back(this);
}
void KeyframeWidget::shiftLeft()
@ -162,7 +216,6 @@ void KeyframeWidget::onUpdate(float dt)
ae->reorderKeys();
return;
}
position.y = KEYFRAME_POS_Y;
}
void AnimationEditor::cycleLerpType()
@ -200,7 +253,6 @@ void AnimationEditor::cycleLerpType()
AnimationEditor::AnimationEditor() : StateObject()
{
registerState(this, "AnimationEditor");
}
void AnimationEditor::resetScaleOrSave()
@ -487,9 +539,9 @@ void AnimationEditor::applyState()
text2->setFontSize(6);
addRenderObject(text2, LR_HUD);
TimelineRender *tr = new TimelineRender();
tr->position = Vector(0, KEYFRAME_POS_Y);
addRenderObject(tr, LR_BLACKGROUND);
timeline = new TimelineRender();
timeline->position = Vector(0, KEYFRAME_POS_Y);
addRenderObject(timeline, LR_BLACKGROUND);
editSprite->setSelectedBone(0);
@ -611,31 +663,13 @@ void AnimationEditor::reorderKeys()
void AnimationEditor::rebuildKeyframeWidgets()
{
int offx=0;
for (size_t i = 0; i < keyframeWidgets.size(); i++)
{
keyframeWidgets[i]->setLife(0.03f);
keyframeWidgets[i]->setDecayRate(1);
offx = keyframeWidgets[i]->offset.x;
}
keyframeWidgets.clear();
if (Animation *a = editSprite->getCurrentAnimation())
{
for (int i = 0; i < 1000; i++)
{
SkeletalKeyframe *key = a->getKeyframe(i);
if (!key) break;
KeyframeWidget *k = new KeyframeWidget(i);
k->offset.x = offx;
addRenderObject(k, LR_HUD);
keyframeWidgets.push_back(k);
}
}
size_t n = editSprite->getCurrentAnimation()->getNumKeyframes();
timeline->resizeKeyframes(n);
}
void AnimationEditor::removeState()
{
keyframeWidgets.clear();
timeline->clearKeyframes();
StateObject::removeState();
core->cameraPos = Vector(0,0);
}
@ -891,6 +925,7 @@ void AnimationEditor::nextKey()
{
if (core->getCtrlState())
{
const std::vector<KeyframeWidget*>& keyframeWidgets = timeline->getKeyframes();
for (size_t i = 0; i < keyframeWidgets.size(); i++)
{
keyframeWidgets[i]->shiftLeft();
@ -924,6 +959,7 @@ void AnimationEditor::prevKey()
{
if (core->getCtrlState())
{
const std::vector<KeyframeWidget*>& keyframeWidgets = timeline->getKeyframes();
for (size_t i = 0; i < keyframeWidgets.size(); i++)
{
keyframeWidgets[i]->shiftRight();
@ -1392,7 +1428,6 @@ void AnimationEditor::saveFile()
void AnimationEditor::loadFile()
{
SkeletalSprite::clearCache();
lastSelectedBone = 0;
editingBone = 0;
clearUndoHistory();
editSprite->position = Vector(400,300);
@ -1506,6 +1541,7 @@ void AnimationEditor::moveNextWidgets(float dt)
int s = 0;
KeyframeWidget *w=0;
const std::vector<KeyframeWidget*>& keyframeWidgets = timeline->getKeyframes();
for (size_t i = 0; i < keyframeWidgets.size(); i++)
{
w = keyframeWidgets[i];

View file

@ -9,22 +9,11 @@ class DebugFont;
class BitmapText;
class SplineGrid;
class DebugButton;
class Gradient;
class KeyframeWidget : public Quad
{
public:
KeyframeWidget(int key);
float t;
int key;
static KeyframeWidget *movingWidget;
BitmapText *b;
void shiftLeft();
void shiftRight();
protected:
void onUpdate(float dt);
};
// internal
class TimelineRender;
class KeyframeWidget;
class AnimationEditor : public StateObject
{
@ -114,8 +103,6 @@ public:
std::string editingFile;
std::vector<KeyframeWidget*> keyframeWidgets;
void action(int id, int state, int source, InputDevice device);
void rebuildKeyframeWidgets();
@ -168,6 +155,9 @@ public:
void toggleSplineMode();
DebugButton *bSplineAssist;
void updateButtonLabels();
Gradient *bgGrad;
TimelineRender *timeline;
};