Merge pull request #3876 from ZappoMan/bugFixes

fixes the stutter in animation when observer moves
This commit is contained in:
Philip Rosedale 2014-11-30 18:44:21 -08:00
commit e44ca5a7f7
4 changed files with 13 additions and 8 deletions

View file

@ -138,11 +138,9 @@ void AnimationHandle::simulate(float deltaTime) {
return; return;
} }
// TODO: When moving the loop/frame calculations to AnimationLoop class, we changed this behavior if (_animationLoop.getMaxFrameIndexHint() != animationGeometry.animationFrames.size()) {
// see AnimationLoop class for more details. Do we need to support clamping the endFrameIndex to _animationLoop.setMaxFrameIndexHint(animationGeometry.animationFrames.size());
// the max number of frames in the geometry??? }
//
// float endFrameIndex = qMin(_lastFrame, animationGeometry.animationFrames.size() - (_loop ? 0.0f : 1.0f));
// blend between the closest two frames // blend between the closest two frames
applyFrame(getFrameIndex()); applyFrame(getFrameIndex());

View file

@ -20,7 +20,8 @@ AnimationLoop::AnimationLoop() :
_firstFrame(0.0f), _firstFrame(0.0f),
_lastFrame(FLT_MAX), _lastFrame(FLT_MAX),
_running(false), _running(false),
_frameIndex(0.0f) _frameIndex(0.0f),
_maxFrameIndexHint(FLT_MAX)
{ {
} }
@ -55,7 +56,7 @@ void AnimationLoop::simulate(float deltaTime) {
// If we knew the number of frames from the animation, we'd consider using it here // If we knew the number of frames from the animation, we'd consider using it here
// animationGeometry.animationFrames.size() // animationGeometry.animationFrames.size()
float maxFrame = _lastFrame; float maxFrame = _maxFrameIndexHint;
float endFrameIndex = qMin(_lastFrame, maxFrame - (_loop ? 0.0f : 1.0f)); float endFrameIndex = qMin(_lastFrame, maxFrame - (_loop ? 0.0f : 1.0f));
float startFrameIndex = qMin(_firstFrame, endFrameIndex); float startFrameIndex = qMin(_firstFrame, endFrameIndex);
if ((!_loop && (_frameIndex < startFrameIndex || _frameIndex > endFrameIndex)) || startFrameIndex == endFrameIndex) { if ((!_loop && (_frameIndex < startFrameIndex || _frameIndex > endFrameIndex)) || startFrameIndex == endFrameIndex) {

View file

@ -45,6 +45,9 @@ public:
void setFrameIndex(float frameIndex) { _frameIndex = glm::clamp(frameIndex, _firstFrame, _lastFrame); } void setFrameIndex(float frameIndex) { _frameIndex = glm::clamp(frameIndex, _firstFrame, _lastFrame); }
float getFrameIndex() const { return _frameIndex; } float getFrameIndex() const { return _frameIndex; }
void setMaxFrameIndexHint(float value) { _maxFrameIndexHint = value; }
float getMaxFrameIndexHint() const { return _maxFrameIndexHint; }
void start() { setRunning(true); } void start() { setRunning(true); }
void stop() { setRunning(false); } void stop() { setRunning(false); }
void simulate(float deltaTime); void simulate(float deltaTime);
@ -58,6 +61,7 @@ private:
float _lastFrame; float _lastFrame;
bool _running; bool _running;
float _frameIndex; float _frameIndex;
float _maxFrameIndexHint;
}; };
#endif // hifi_AnimationLoop_h #endif // hifi_AnimationLoop_h

View file

@ -344,7 +344,9 @@ QVector<glm::quat> ModelEntityItem::getAnimationFrame() {
Animation* myAnimation = getAnimation(_animationURL); Animation* myAnimation = getAnimation(_animationURL);
QVector<FBXAnimationFrame> frames = myAnimation->getFrames(); QVector<FBXAnimationFrame> frames = myAnimation->getFrames();
int frameCount = frames.size(); int frameCount = frames.size();
if (_animationLoop.getMaxFrameIndexHint() != frameCount) {
_animationLoop.setMaxFrameIndexHint(frameCount);
}
if (frameCount > 0) { if (frameCount > 0) {
int animationFrameIndex = (int)(glm::floor(getAnimationFrameIndex())) % frameCount; int animationFrameIndex = (int)(glm::floor(getAnimationFrameIndex())) % frameCount;
if (animationFrameIndex < 0 || animationFrameIndex > frameCount) { if (animationFrameIndex < 0 || animationFrameIndex > frameCount) {