add loop option to playAnimation

This commit is contained in:
Nick Fisher
2022-03-29 15:49:03 +08:00
parent 0944a8df66
commit b00fe3af1e
2 changed files with 16 additions and 7 deletions

View File

@@ -594,7 +594,7 @@ namespace polyvox
{
if (!_view || !_mainCamera || !_swapChain)
{
Log("Not ready for rendering");
// Log("Not ready for rendering");
return;
}
@@ -668,8 +668,12 @@ namespace polyvox
}
}
void FilamentViewer::playAnimation(int index) {
embeddedAnimationBuffer = make_unique<EmbeddedAnimationBuffer>(index, _animator->getAnimationDuration(index));
void FilamentViewer::playAnimation(int index, bool loop) {
if(index > _animator->getAnimationCount() - 1) {
Log("Asset does not contain an animation at index %d", index);
} else {
embeddedAnimationBuffer = make_unique<EmbeddedAnimationBuffer>(index, _animator->getAnimationDuration(index), loop);
}
}
void FilamentViewer::updateEmbeddedAnimation() {
@@ -679,8 +683,12 @@ namespace polyvox
embeddedAnimationBuffer->hasStarted = true;
embeddedAnimationBuffer->lastTime = std::chrono::high_resolution_clock::now();
} else if(dur.count() >= embeddedAnimationBuffer->duration) {
embeddedAnimationBuffer = nullptr;
return;
if(embeddedAnimationBuffer->loop) {
embeddedAnimationBuffer->lastTime = std::chrono::high_resolution_clock::now();
} else {
embeddedAnimationBuffer = nullptr;
return;
}
} else {
startTime = dur.count();
}

View File

@@ -55,11 +55,12 @@ namespace polyvox {
};
struct EmbeddedAnimationBuffer {
EmbeddedAnimationBuffer(int animationIndex, float duration) : animationIndex(animationIndex), duration(duration) {}
EmbeddedAnimationBuffer(int animationIndex, float duration, bool loop) : animationIndex(animationIndex), duration(duration), loop(loop) {}
bool hasStarted = false;
int animationIndex;
float duration = 0;
time_point_t lastTime;
bool loop;
};
@@ -117,7 +118,7 @@ namespace polyvox {
void applyWeights(float* weights, int count);
void animateWeights(float* data, int numWeights, int length, float frameRate);
// void animateBones();
void playAnimation(int index);
void playAnimation(int index, bool loop);
bool setCamera(const char* nodeName);
void destroySwapChain();
void createSwapChain(void* surface);