GUI: Added animation classes
This commit is contained in:
parent
6524a8d103
commit
ea80e24481
16 changed files with 924 additions and 0 deletions
|
@ -154,6 +154,13 @@ struct TransparentSurface : public Graphics::Surface {
|
|||
|
||||
TransparentSurface *convertTo(const PixelFormat &dstFormat, const byte *palette = 0) const;
|
||||
|
||||
float getRatio() {
|
||||
if (!w)
|
||||
return 0;
|
||||
|
||||
return h / (float)w;
|
||||
}
|
||||
|
||||
AlphaType getAlphaMode() const;
|
||||
void setAlphaMode(AlphaType);
|
||||
private:
|
||||
|
|
45
gui/animation/AccelerateInterpolator.h
Normal file
45
gui/animation/AccelerateInterpolator.h
Normal file
|
@ -0,0 +1,45 @@
|
|||
/* ScummVM - Graphic Adventure Engine
|
||||
*
|
||||
* ScummVM is the legal property of its developers, whose names
|
||||
* are too numerous to list here. Please refer to the COPYRIGHT
|
||||
* file distributed with this source distribution.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; either version 2
|
||||
* of the License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
*
|
||||
*/
|
||||
|
||||
// Based on code by omergilad.
|
||||
|
||||
#ifndef GUI_ANIMATION_ACCELERATEINTERPOLATOR_H
|
||||
#define GUI_ANIMATION_ACCELERATEINTERPOLATOR_H
|
||||
|
||||
#include "gui/animation/Interpolator.h"
|
||||
|
||||
namespace GUI {
|
||||
|
||||
class AccelerateInterpolator: public Interpolator {
|
||||
public:
|
||||
AccelerateInterpolator() {}
|
||||
virtual ~AccelerateInterpolator() {}
|
||||
|
||||
virtual float interpolate(float linearValue) {
|
||||
return pow(linearValue, 2);
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
} // End of namespace GUI
|
||||
|
||||
#endif /* GUI_ANIMATION_ACCELERATEINTERPOLATOR_H */
|
53
gui/animation/AlphaAnimation.h
Normal file
53
gui/animation/AlphaAnimation.h
Normal file
|
@ -0,0 +1,53 @@
|
|||
/* ScummVM - Graphic Adventure Engine
|
||||
*
|
||||
* ScummVM is the legal property of its developers, whose names
|
||||
* are too numerous to list here. Please refer to the COPYRIGHT
|
||||
* file distributed with this source distribution.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; either version 2
|
||||
* of the License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
*
|
||||
*/
|
||||
|
||||
// Based on code by omergilad.
|
||||
|
||||
#ifndef GUI_ANIMATION_ANIMATION_H
|
||||
#define GUI_ANIMATION_ANIMATION_H
|
||||
|
||||
#include "gui/animation/Animation.h"
|
||||
|
||||
namespace GUI {
|
||||
|
||||
class AlphaAnimation: public Animation {
|
||||
public:
|
||||
AlphaAnimation() {}
|
||||
virtual ~AlphaAnimation() {}
|
||||
float getEndAlpha() const { return _endAlpha; }
|
||||
void setEndAlpha(float endAlpha) { _endAlpha = endAlpha; }
|
||||
float getStartAlpha() const { return _startAlpha; }
|
||||
void setStartAlpha(float startAlpha) { _startAlpha = startAlpha; }
|
||||
|
||||
protected:
|
||||
virtual void updateInternal(Drawable* drawable, float interpolation) {
|
||||
// Calculate alpha value based on properties and interpolation
|
||||
drawable->setAlpha(_startAlpha * (1 - interpolation) + _endAlpha * interpolation);
|
||||
}
|
||||
|
||||
float _startAlpha;
|
||||
float _endAlpha;
|
||||
};
|
||||
|
||||
} // End of namespace GUI
|
||||
|
||||
#endif /* GUI_ANIMATION_ANIMATION_H */
|
98
gui/animation/Animation.cpp
Normal file
98
gui/animation/Animation.cpp
Normal file
|
@ -0,0 +1,98 @@
|
|||
/* ScummVM - Graphic Adventure Engine
|
||||
*
|
||||
* ScummVM is the legal property of its developers, whose names
|
||||
* are too numerous to list here. Please refer to the COPYRIGHT
|
||||
* file distributed with this source distribution.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; either version 2
|
||||
* of the License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
*
|
||||
*/
|
||||
|
||||
// Based on code by omergilad.
|
||||
|
||||
#include "gui/animation/Animation.h"
|
||||
|
||||
namespace GUI {
|
||||
|
||||
Animation::Animation()
|
||||
: _startTime(0), _duration(0), _finished(false), _finishOnEnd(true) {
|
||||
}
|
||||
|
||||
Animation::~Animation() {
|
||||
}
|
||||
|
||||
void Animation::start(long currentTime) {
|
||||
_finished = false;
|
||||
_startTime = currentTime;
|
||||
}
|
||||
|
||||
void Animation::setDuration(long duration) {
|
||||
_duration = duration;
|
||||
}
|
||||
|
||||
void Animation::update(Drawable *drawable, long currentTime) {
|
||||
float interpolation;
|
||||
|
||||
if (currentTime < _startTime) {
|
||||
// If the start time is in the future, nothing changes - the interpolated value is 0
|
||||
interpolation = 0;
|
||||
} else if (currentTime > _startTime + _duration) {
|
||||
// If the animation is finished, the interpolated value is 1 and the animation is marked as finished
|
||||
interpolation = 1;
|
||||
finishAnimation();
|
||||
} else {
|
||||
// Calculate the interpolated value
|
||||
interpolation = (currentTime - _startTime) / (float) (_duration);
|
||||
}
|
||||
|
||||
// Activate the interpolator if present
|
||||
if (_interpolator.get() != NULL) {
|
||||
interpolation = _interpolator->interpolate(interpolation);
|
||||
}
|
||||
|
||||
updateInternal(drawable, interpolation);
|
||||
}
|
||||
|
||||
void Animation::finishAnimation() {
|
||||
if (_finishOnEnd) {
|
||||
_finished = true;
|
||||
}
|
||||
}
|
||||
|
||||
void Animation::updateInternal(Drawable *drawable, float interpolation) {
|
||||
// Default implementation
|
||||
}
|
||||
|
||||
bool Animation::isFinished() const {
|
||||
return _finished;
|
||||
}
|
||||
|
||||
bool Animation::isFinishOnEnd() const {
|
||||
return _finishOnEnd;
|
||||
}
|
||||
|
||||
void Animation::setFinishOnEnd(bool finishOnEnd) {
|
||||
_finishOnEnd = finishOnEnd;
|
||||
}
|
||||
|
||||
InterpolatorPtr Animation::getInterpolator() const {
|
||||
return _interpolator;
|
||||
}
|
||||
|
||||
void Animation::setInterpolator(InterpolatorPtr interpolator) {
|
||||
_interpolator = interpolator;
|
||||
}
|
||||
|
||||
} // End of namespace GUI
|
76
gui/animation/Animation.h
Normal file
76
gui/animation/Animation.h
Normal file
|
@ -0,0 +1,76 @@
|
|||
/* ScummVM - Graphic Adventure Engine
|
||||
*
|
||||
* ScummVM is the legal property of its developers, whose names
|
||||
* are too numerous to list here. Please refer to the COPYRIGHT
|
||||
* file distributed with this source distribution.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; either version 2
|
||||
* of the License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
*
|
||||
*/
|
||||
|
||||
// Based on code by omergilad.
|
||||
|
||||
#ifndef GUI_ANIMATION_ANIMATION_H
|
||||
#define GUI_ANIMATION_ANIMATION_H
|
||||
|
||||
#include "gui/animation/Interpolator.h"
|
||||
|
||||
namespace GUI {
|
||||
|
||||
class Drawable;
|
||||
|
||||
class Animation {
|
||||
public:
|
||||
Animation();
|
||||
virtual ~Animation() = 0;
|
||||
|
||||
virtual void update(Drawable *drawable, long currentTime);
|
||||
|
||||
/**
|
||||
* Set start time in millis
|
||||
*/
|
||||
virtual void start(long currentTime);
|
||||
|
||||
/**
|
||||
* Set duration in millis
|
||||
*/
|
||||
virtual void setDuration(long duration);
|
||||
|
||||
virtual bool isFinished() const;
|
||||
|
||||
bool isFinishOnEnd() const;
|
||||
|
||||
void setFinishOnEnd(bool finishOnEnd);
|
||||
|
||||
InterpolatorPtr getInterpolator() const;
|
||||
void setInterpolator(InterpolatorPtr interpolator);
|
||||
|
||||
protected:
|
||||
void finishAnimation();
|
||||
|
||||
virtual void updateInternal(Drawable *drawable, float interpolation);
|
||||
|
||||
long _startTime;
|
||||
long _duration;
|
||||
bool _finished;
|
||||
bool _finishOnEnd;
|
||||
InterpolatorPtr _interpolator;
|
||||
};
|
||||
|
||||
typedef Common::SharedPtr<Animation> AnimationPtr;
|
||||
|
||||
} // End of namespace GUI
|
||||
|
||||
#endif /* GUI_ANIMATION_ANIMATION_H */
|
41
gui/animation/DeccelerateInterpolator.h
Normal file
41
gui/animation/DeccelerateInterpolator.h
Normal file
|
@ -0,0 +1,41 @@
|
|||
/* ScummVM - Graphic Adventure Engine
|
||||
*
|
||||
* ScummVM is the legal property of its developers, whose names
|
||||
* are too numerous to list here. Please refer to the COPYRIGHT
|
||||
* file distributed with this source distribution.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; either version 2
|
||||
* of the License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
*
|
||||
*/
|
||||
|
||||
// Based on code by omergilad.
|
||||
|
||||
#ifndef GUI_ANIMATION_DECCELERATEINTERPOLATOR_H
|
||||
#define GUI_ANIMATION_DECCELERATEINTERPOLATOR_H
|
||||
|
||||
#include "gui/animation/Interpolator.h"
|
||||
|
||||
namespace GUI {
|
||||
|
||||
class DeccelerateInterpolator: public Interpolator {
|
||||
public:
|
||||
DeccelerateInterpolator() {}
|
||||
virtual ~DeccelerateInterpolator() {}
|
||||
virtual float interpolate(float linearValue) { return sqrt(linearValue); }
|
||||
};
|
||||
|
||||
} // End of namespace GUI
|
||||
|
||||
#endif /* GUI_ANIMATION_DECCELERATEINTERPOLATOR_H */
|
109
gui/animation/Drawable.h
Normal file
109
gui/animation/Drawable.h
Normal file
|
@ -0,0 +1,109 @@
|
|||
/* ScummVM - Graphic Adventure Engine
|
||||
*
|
||||
* ScummVM is the legal property of its developers, whose names
|
||||
* are too numerous to list here. Please refer to the COPYRIGHT
|
||||
* file distributed with this source distribution.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; either version 2
|
||||
* of the License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
*
|
||||
*/
|
||||
|
||||
// Based on code by omergilad.
|
||||
|
||||
#ifndef GUI_ANIMATION_DRAWABLE_H
|
||||
#define GUI_ANIMATION_DRAWABLE_H
|
||||
|
||||
#include "common/ptr.h"
|
||||
#include "graphics/transparent_surface.h"
|
||||
|
||||
#include "gui/animation/Animation.h"
|
||||
|
||||
namespace GUI {
|
||||
|
||||
class Animation;
|
||||
typedef Common::SharedPtr<Animation> AnimationPtr;
|
||||
|
||||
class Drawable {
|
||||
public:
|
||||
Drawable() :
|
||||
_bitmap(NULL), _positionX(0), _positionY(0), _width(0), _height(0), _alpha(1),
|
||||
_usingSnapshot(false), _shouldCenter(false) {
|
||||
_displayRatio = 1.0;
|
||||
}
|
||||
|
||||
virtual ~Drawable() {
|
||||
if (_usingSnapshot)
|
||||
delete _bitmap;
|
||||
}
|
||||
|
||||
void updateAnimation(long currentTime) {
|
||||
if (_animation.get() != NULL) {
|
||||
_animation->update(this, currentTime);
|
||||
}
|
||||
}
|
||||
|
||||
bool isAnimationFinished() {
|
||||
if (_animation.get() != NULL)
|
||||
return _animation->isFinished();
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
float getAlpha() const { return _alpha; }
|
||||
void setAlpha(float alpha) { _alpha = alpha; }
|
||||
AnimationPtr getAnimation() const { return _animation; }
|
||||
void setAnimation(AnimationPtr animation) { _animation = animation; }
|
||||
Graphics::TransparentSurface *getBitmap() const { return _bitmap; }
|
||||
void setBitmap(Graphics::TransparentSurface *bitmap) { _bitmap = bitmap; }
|
||||
float getPositionX() const { return _positionX; }
|
||||
void setPositionX(float positionX) { _positionX = positionX; }
|
||||
float getPositionY() const { return _positionY; }
|
||||
void setPositionY(float positionY) { _positionY = positionY; }
|
||||
virtual float getWidth() const { return _width; }
|
||||
void setWidth(float width) { _width = width; }
|
||||
|
||||
virtual float getHeight() const {
|
||||
if (_height == 0)
|
||||
return getWidth() * _bitmap->getRatio() * _displayRatio;
|
||||
|
||||
return _height;
|
||||
}
|
||||
|
||||
void setHeight(float height) { _height = height; }
|
||||
void setDisplayRatio(float ratio) { _displayRatio = ratio; }
|
||||
inline bool shouldCenter() const { return _shouldCenter; }
|
||||
void setShouldCenter(bool shouldCenter) { _shouldCenter = shouldCenter; }
|
||||
|
||||
protected:
|
||||
bool _usingSnapshot;
|
||||
|
||||
private:
|
||||
Graphics::TransparentSurface *_bitmap;
|
||||
float _positionX;
|
||||
float _positionY;
|
||||
float _width;
|
||||
float _height;
|
||||
float _alpha;
|
||||
bool _shouldCenter;
|
||||
AnimationPtr _animation;
|
||||
|
||||
float _displayRatio;
|
||||
};
|
||||
|
||||
typedef Common::SharedPtr<Drawable> DrawablePtr;
|
||||
|
||||
} // End of namespace GUI
|
||||
|
||||
#endif /* GUI_ANIMATION_DRAWABLE_H */
|
44
gui/animation/Interpolator.h
Normal file
44
gui/animation/Interpolator.h
Normal file
|
@ -0,0 +1,44 @@
|
|||
/* ScummVM - Graphic Adventure Engine
|
||||
*
|
||||
* ScummVM is the legal property of its developers, whose names
|
||||
* are too numerous to list here. Please refer to the COPYRIGHT
|
||||
* file distributed with this source distribution.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; either version 2
|
||||
* of the License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
*
|
||||
*/
|
||||
|
||||
// Based on code by omergilad.
|
||||
|
||||
#ifndef GUI_ANIMATION_INTERPOLATOR_H
|
||||
#define GUI_ANIMATION_INTERPOLATOR_H
|
||||
|
||||
#include "common/ptr.h"
|
||||
|
||||
namespace GUI {
|
||||
|
||||
class Interpolator {
|
||||
public:
|
||||
Interpolator() {}
|
||||
virtual ~Interpolator() {}
|
||||
|
||||
virtual float interpolate(float linearValue) = 0;
|
||||
};
|
||||
|
||||
typedef Common::SharedPtr<Interpolator> InterpolatorPtr;
|
||||
|
||||
} // End of namespace GUI
|
||||
|
||||
#endif /* GUI_ANIMATION_INTERPOLATOR_H */
|
72
gui/animation/ParallelAnimation.h
Normal file
72
gui/animation/ParallelAnimation.h
Normal file
|
@ -0,0 +1,72 @@
|
|||
/* ScummVM - Graphic Adventure Engine
|
||||
*
|
||||
* ScummVM is the legal property of its developers, whose names
|
||||
* are too numerous to list here. Please refer to the COPYRIGHT
|
||||
* file distributed with this source distribution.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; either version 2
|
||||
* of the License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
*
|
||||
*/
|
||||
|
||||
// Based on code by omergilad.
|
||||
|
||||
#ifndef GUI_ANIMATION_PARALLELANIMATION_H
|
||||
#define GUI_ANIMATION_PARALLELANIMATION_H
|
||||
|
||||
#include "gui/animation/Animation.h"
|
||||
#include "common/array.h"
|
||||
|
||||
namespace GUI {
|
||||
|
||||
class ParallelAnimation: public Animation {
|
||||
public:
|
||||
ParallelAnimation() {}
|
||||
virtual ~ParallelAnimation() {}
|
||||
|
||||
virtual void addAnimation(AnimationPtr animation) {
|
||||
_animations.push_back(animation);
|
||||
}
|
||||
|
||||
virtual void update(Drawable *drawable, long currentTime) {
|
||||
for (AnimationPtr anim : _animations) {
|
||||
anim->update(drawable, currentTime);
|
||||
if (anim->isFinished()) {
|
||||
finishAnimation();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
virtual void start(long currentTime) {
|
||||
Animation::start(currentTime);
|
||||
|
||||
for (AnimationPtr anim : _animations)
|
||||
anim->start(currentTime);
|
||||
}
|
||||
|
||||
virtual void setDuration(long duration) {
|
||||
Animation::setDuration(duration);
|
||||
|
||||
for (AnimationPtr anim : _animations)
|
||||
anim->setDuration(duration);
|
||||
}
|
||||
|
||||
private:
|
||||
|
||||
Common::Array<AnimationPtr> _animations;
|
||||
};
|
||||
|
||||
} // End of namespace GUI
|
||||
|
||||
#endif /* GUI_ANIMATION_PARALLELANIMATION_H */
|
52
gui/animation/RepeatAnimationWrapper.cpp
Normal file
52
gui/animation/RepeatAnimationWrapper.cpp
Normal file
|
@ -0,0 +1,52 @@
|
|||
/* ScummVM - Graphic Adventure Engine
|
||||
*
|
||||
* ScummVM is the legal property of its developers, whose names
|
||||
* are too numerous to list here. Please refer to the COPYRIGHT
|
||||
* file distributed with this source distribution.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; either version 2
|
||||
* of the License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
*
|
||||
*/
|
||||
|
||||
// Based on code by omergilad.
|
||||
|
||||
#include "gui/animation/RepeatAnimationWrapper.h"
|
||||
|
||||
namespace GUI {
|
||||
|
||||
void RepeatAnimationWrapper::update(Drawable* drawable, long currentTime) {
|
||||
// Update wrapped animation
|
||||
_animation->update(drawable, currentTime);
|
||||
|
||||
// If the animation is finished, increase the repeat count and restart it if needed
|
||||
if (_animation->isFinished()) {
|
||||
++_repeatCount;
|
||||
if (_timesToRepeat > 0 && _repeatCount >= _timesToRepeat) {
|
||||
finishAnimation();
|
||||
} else {
|
||||
_animation->start(currentTime);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void RepeatAnimationWrapper::start(long currentTime) {
|
||||
Animation::start(currentTime);
|
||||
_repeatCount = 0;
|
||||
|
||||
// Start wrapped animation
|
||||
_animation->start(currentTime);
|
||||
}
|
||||
|
||||
} // End of namespace GUI
|
61
gui/animation/RepeatAnimationWrapper.h
Normal file
61
gui/animation/RepeatAnimationWrapper.h
Normal file
|
@ -0,0 +1,61 @@
|
|||
/* ScummVM - Graphic Adventure Engine
|
||||
*
|
||||
* ScummVM is the legal property of its developers, whose names
|
||||
* are too numerous to list here. Please refer to the COPYRIGHT
|
||||
* file distributed with this source distribution.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; either version 2
|
||||
* of the License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
*
|
||||
*/
|
||||
|
||||
// Based on code by omergilad.
|
||||
|
||||
#ifndef GUI_ANIMATION_REPEATANIMATIONWRAPPER_H
|
||||
#define GUI_ANIMATION_REPEATANIMATIONWRAPPER_H
|
||||
|
||||
#include "gui/animation/Animation.h"
|
||||
|
||||
namespace GUI {
|
||||
|
||||
class RepeatAnimationWrapper: public Animation {
|
||||
public:
|
||||
/**
|
||||
* Animation - animation to repeat
|
||||
*
|
||||
* timesToRepeat - 0 means infinite
|
||||
*/
|
||||
RepeatAnimationWrapper(AnimationPtr animation, uint16 timesToRepeat) :
|
||||
_animation(animation), _timesToRepeat(timesToRepeat) {}
|
||||
|
||||
virtual ~RepeatAnimationWrapper() {}
|
||||
|
||||
virtual void update(Drawable* drawable, long currentTime);
|
||||
|
||||
/**
|
||||
* Set start time in millis
|
||||
*/
|
||||
virtual void start(long currentTime);
|
||||
|
||||
private:
|
||||
uint16 _timesToRepeat;
|
||||
uint16 _repeatCount;
|
||||
|
||||
AnimationPtr _animation;
|
||||
|
||||
};
|
||||
|
||||
} // End of namespace GUI
|
||||
|
||||
#endif /* GUI_ANIMATION_REPEATANIMATIONWRAPPER_H */
|
69
gui/animation/ScaleAnimation.h
Normal file
69
gui/animation/ScaleAnimation.h
Normal file
|
@ -0,0 +1,69 @@
|
|||
/* ScummVM - Graphic Adventure Engine
|
||||
*
|
||||
* ScummVM is the legal property of its developers, whose names
|
||||
* are too numerous to list here. Please refer to the COPYRIGHT
|
||||
* file distributed with this source distribution.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; either version 2
|
||||
* of the License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
*
|
||||
*/
|
||||
|
||||
// Based on code by omergilad.
|
||||
|
||||
#ifndef GUI_ANIMATION_SCALEANIMATION_H
|
||||
#define GUI_ANIMATION_SCALEANIMATION_H
|
||||
|
||||
#include "gui/animation/Animation.h"
|
||||
|
||||
namespace GUI {
|
||||
|
||||
class ScaleAnimation: public Animation {
|
||||
public:
|
||||
ScaleAnimation() : _endWidth(0), _endWidthFactor(0) {}
|
||||
|
||||
virtual ~ScaleAnimation() {}
|
||||
|
||||
float getEndWidth() const { return _endWidth; }
|
||||
void setEndWidth(float endWidth) { _endWidth = endWidth; }
|
||||
float getEndWidthFactor() const { return _endWidthFactor; }
|
||||
void setEndWidthFactor(float endWidthFactor) { _endWidthFactor = endWidthFactor; }
|
||||
float getStartWidth() const { return _startWidth; }
|
||||
void setStartWidth(float startWidth) { _startWidth = startWidth; }
|
||||
|
||||
void updateInternal(Drawable *drawable, float interpolation) {
|
||||
// If start width was set as 0 -> use the current width as the start dimension
|
||||
if (_startWidth == 0)
|
||||
_startWidth = drawable->getWidth();
|
||||
|
||||
// If end width was set as 0 - multiply the start width by the given factor
|
||||
if (_endWidth == 0)
|
||||
_endWidth = _startWidth * _endWidthFactor;
|
||||
|
||||
// Calculate width based on interpolation
|
||||
float width = _startWidth * (1 - interpolation) + _endWidth * interpolation;
|
||||
drawable->setWidth(width);
|
||||
}
|
||||
|
||||
private:
|
||||
virtual void updateInternal(Drawable *drawable, float interpolation);
|
||||
float _startWidth;
|
||||
float _endWidth;
|
||||
float _endWidthFactor;
|
||||
};
|
||||
|
||||
} // End of namespace GUI
|
||||
|
||||
|
||||
#endif /* GUI_ANIMATION_SCALEANIMATION_H */
|
72
gui/animation/SequenceAnimationComposite.cpp
Normal file
72
gui/animation/SequenceAnimationComposite.cpp
Normal file
|
@ -0,0 +1,72 @@
|
|||
/* ScummVM - Graphic Adventure Engine
|
||||
*
|
||||
* ScummVM is the legal property of its developers, whose names
|
||||
* are too numerous to list here. Please refer to the COPYRIGHT
|
||||
* file distributed with this source distribution.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; either version 2
|
||||
* of the License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
*
|
||||
*/
|
||||
|
||||
// Based on code by omergilad.
|
||||
|
||||
#include "gui/animation/SequenceAnimationComposite.h"
|
||||
|
||||
namespace GUI {
|
||||
|
||||
void SequenceAnimationComposite::start(long currentTime) {
|
||||
Animation::start(currentTime);
|
||||
|
||||
// The first animation in the sequence should a start time equal to this sequence
|
||||
if (_sequence.size() >= 1)
|
||||
_sequence[0]->start(currentTime);
|
||||
|
||||
// Set the index to 0
|
||||
_index = 0;
|
||||
}
|
||||
|
||||
void SequenceAnimationComposite::addAnimation(AnimationPtr animation) {
|
||||
_sequence.push_back(animation);
|
||||
}
|
||||
|
||||
void SequenceAnimationComposite::update(Drawable *drawable, long currentTime) {
|
||||
uint16 sequenceSize = _sequence.size();
|
||||
|
||||
// Check index bounds
|
||||
if (_index >= sequenceSize)
|
||||
return;
|
||||
|
||||
// Get the current animation in the sequence
|
||||
AnimationPtr anim = _sequence[_index];
|
||||
|
||||
// Update the drawable
|
||||
anim->update(drawable, currentTime);
|
||||
|
||||
// Check if the current animation is finished
|
||||
if (anim->isFinished()) {
|
||||
// Increase the index - move to the next animation
|
||||
++_index;
|
||||
|
||||
if (_index >= sequenceSize) {
|
||||
// Finished the sequence
|
||||
finishAnimation();
|
||||
} else {
|
||||
// Set the start time for the next animation
|
||||
_sequence[_index]->start(currentTime);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
} // End of namespace GUI
|
51
gui/animation/SequenceAnimationComposite.h
Normal file
51
gui/animation/SequenceAnimationComposite.h
Normal file
|
@ -0,0 +1,51 @@
|
|||
/* ScummVM - Graphic Adventure Engine
|
||||
*
|
||||
* ScummVM is the legal property of its developers, whose names
|
||||
* are too numerous to list here. Please refer to the COPYRIGHT
|
||||
* file distributed with this source distribution.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; either version 2
|
||||
* of the License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
*
|
||||
*/
|
||||
|
||||
// Based on code by omergilad.
|
||||
|
||||
#ifndef GUI_ANIMATION_SEQUENCEANIMATION_H
|
||||
#define GUI_ANIMATION_SEQUENCEANIMATION_H
|
||||
|
||||
#include "gui/animation/Animation.h"
|
||||
#include "common/array.h"
|
||||
|
||||
namespace GUI {
|
||||
|
||||
class SequenceAnimationComposite: public Animation {
|
||||
public:
|
||||
SequenceAnimationComposite() {}
|
||||
virtual ~SequenceAnimationComposite() {}
|
||||
|
||||
virtual void addAnimation(AnimationPtr animation);
|
||||
|
||||
virtual void update(Drawable* drawable, long currentTime);
|
||||
|
||||
virtual void start(long currentTime);
|
||||
|
||||
private:
|
||||
uint16 _index;
|
||||
Common::Array<AnimationPtr> _sequence;
|
||||
};
|
||||
|
||||
} // End of namespace GUI
|
||||
|
||||
#endif /* GUI_ANIMATION_SEQUENCEANIMATION_H */
|
71
gui/animation/WaitForConditionAnimation.h
Normal file
71
gui/animation/WaitForConditionAnimation.h
Normal file
|
@ -0,0 +1,71 @@
|
|||
/* ScummVM - Graphic Adventure Engine
|
||||
*
|
||||
* ScummVM is the legal property of its developers, whose names
|
||||
* are too numerous to list here. Please refer to the COPYRIGHT
|
||||
* file distributed with this source distribution.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; either version 2
|
||||
* of the License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
*
|
||||
*/
|
||||
|
||||
// Based on code by omergilad.
|
||||
|
||||
#ifndef GUI_ANIMATION_WAITFORCONDITIONANIMATION_H
|
||||
#define GUI_ANIMATION_WAITFORCONDITIONANIMATION_H
|
||||
|
||||
#include "gui/animation/Animation.h"
|
||||
|
||||
namespace GUI {
|
||||
|
||||
class Condition {
|
||||
|
||||
public:
|
||||
virtual ~Condition() {}
|
||||
|
||||
virtual bool evaluate() = 0;
|
||||
};
|
||||
|
||||
typedef Common::SharedPtr<Condition> ConditionPtr;
|
||||
|
||||
/**
|
||||
* Used for delaying the animation sequence until a certain condition has been met
|
||||
*/
|
||||
class WaitForConditionAnimation: public Animation {
|
||||
public:
|
||||
WaitForConditionAnimation() {}
|
||||
virtual ~WaitForConditionAnimation() {}
|
||||
|
||||
virtual void update(Drawable *drawable, long currentTime) {
|
||||
// Check the condition - if it has been met, finish.
|
||||
if (_condition.get() != NULL && _condition->evaluate()) {
|
||||
finishAnimation();
|
||||
}
|
||||
}
|
||||
|
||||
ConditionPtr getCondition() const {
|
||||
return _condition;
|
||||
}
|
||||
|
||||
void setCondition(ConditionPtr condition) {
|
||||
_condition = condition;
|
||||
}
|
||||
|
||||
private:
|
||||
ConditionPtr _condition;
|
||||
};
|
||||
|
||||
} // End of namespace GUI
|
||||
|
||||
#endif /* GUI_ANIMATION_WAITFORCONDITIONANIMATION_H */
|
|
@ -24,6 +24,9 @@ MODULE_OBJS := \
|
|||
ThemeLayout.o \
|
||||
ThemeParser.o \
|
||||
Tooltip.o \
|
||||
animation/Animation.o \
|
||||
animation/RepeatAnimationWrapper.o \
|
||||
animation/SequenceAnimationComposite.o \
|
||||
widget.o \
|
||||
widgets/editable.o \
|
||||
widgets/edittext.o \
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue