copy morph animation weights

This commit is contained in:
Nick Fisher
2022-12-11 10:56:57 +08:00
parent 7469fc461b
commit f271c64432
3 changed files with 19 additions and 9 deletions

View File

@@ -66,6 +66,7 @@ namespace polyvox {
/// Accordingly:
/// length(data) = numWeights * numFrames
/// total_animation_duration_in_ms = number_of_frames * frameLengthInMs
/// [data] will be copied; you should ensure this is freed after invoking this function.
///
void animateWeights(float* data, int numWeights, int numFrames, float frameLengthInMs);

View File

@@ -3,6 +3,7 @@
#include <functional>
#include <memory>
#include <chrono>
#include <iostream>
#include "ResourceBuffer.hpp"
@@ -66,19 +67,26 @@ namespace polyvox {
//
struct MorphAnimationStatus {
MorphAnimationStatus(float* frameData,
MorphAnimationStatus(float* data,
int numWeights,
int numFrames,
float frameLength) : numFrames(numFrames), frameLengthInMs(frameLength), frameData(frameData), numWeights(numWeights) {
float frameLengthInMs) : numFrames(numFrames), frameLengthInMs(frameLengthInMs), numWeights(numWeights) {
size_t size = numWeights * numFrames * sizeof(float);
frameData = (float*)malloc(size);
memcpy(frameData, data, size);
}
~MorphAnimationStatus() {
delete(frameData);
}
int frameIndex = -1;
int numFrames;
float frameLengthInMs;
int numFrames = -1;
float frameLengthInMs = 0;
time_point_t startTime;
float* frameData;
int numWeights;
float* frameData = nullptr;
int numWeights = 0;
};
}

View File

@@ -95,8 +95,8 @@ void SceneAsset::updateMorphAnimation() {
_morphAnimationBuffer->frameIndex);
_morphAnimationBuffer = nullptr;
} else if (frameIndex != _morphAnimationBuffer->frameIndex) {
Log("Rendering frame %d (of a total %d)", frameIndex,
_morphAnimationBuffer->numFrames);
// Log("Rendering frame %d (of a total %d)", frameIndex,
// _morphAnimationBuffer->numFrames);
_morphAnimationBuffer->frameIndex = frameIndex;
auto framePtrOffset = frameIndex * _morphAnimationBuffer->numWeights;
applyWeights(_morphAnimationBuffer->frameData + framePtrOffset,
@@ -123,6 +123,7 @@ void SceneAsset::playAnimation(int index, bool loop, bool reverse) {
}
void SceneAsset::stopAnimation(int index) {
Log("Stopping animation %d", index);
// TODO - does this need to be threadsafe?
_embeddedAnimationStatus[index].play = false;
_embeddedAnimationStatus[index].started = false;
@@ -199,7 +200,7 @@ void SceneAsset::updateEmbeddedAnimations() {
auto now = high_resolution_clock::now();
int animationIndex = 0;
for (auto &status : _embeddedAnimationStatus) {
if (!status.play) {
if (status.play == false) {
continue;
}