From f271c6443221e6a88cc761f34b701db6cb7324ff Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Sun, 11 Dec 2022 10:56:57 +0800 Subject: [PATCH] copy morph animation weights --- ios/include/SceneAsset.hpp | 1 + ios/include/SceneResources.hpp | 20 ++++++++++++++------ ios/src/SceneAsset.cpp | 7 ++++--- 3 files changed, 19 insertions(+), 9 deletions(-) diff --git a/ios/include/SceneAsset.hpp b/ios/include/SceneAsset.hpp index 5ef4b602..35e30ae9 100644 --- a/ios/include/SceneAsset.hpp +++ b/ios/include/SceneAsset.hpp @@ -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); diff --git a/ios/include/SceneResources.hpp b/ios/include/SceneResources.hpp index 22bae2d2..9296575b 100644 --- a/ios/include/SceneResources.hpp +++ b/ios/include/SceneResources.hpp @@ -3,6 +3,7 @@ #include #include #include +#include #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; }; } diff --git a/ios/src/SceneAsset.cpp b/ios/src/SceneAsset.cpp index d223d73e..40fa7434 100644 --- a/ios/src/SceneAsset.cpp +++ b/ios/src/SceneAsset.cpp @@ -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; }