DALI_LOG_INFO(gRiveAnimationLogFilter, Debug::Verbose, "RiveAnimationRenderer::SetSize: width = %d, height = %d [%p]\n", mWidth, mHeight, this);
}
-bool RiveAnimationRenderer::Render(uint32_t frameNumber)
+bool RiveAnimationRenderer::Render(double elapsed)
{
Dali::Mutex::ScopedLock lock(mMutex);
if(!mTbmQueue || !mTargetSurface || !mArtboard || mAnimations.empty())
mSwCanvas->clear();
mSwCanvas->target((uint32_t*)buffer, info.planes[0].stride / 4, info.width, info.height, tvg::SwCanvas::ARGB8888);
- // Render Rive Frame
- frameNumber = mStartFrameNumber + frameNumber;
-
- //FIXME: This should be changed to the time based rendering
- static float elapsed = 0.0f;
- elapsed = 1.0f / 60.0f;
-
+ // Render Rive animation by elapsed time
for(auto& animation : mAnimations)
{
if(animation.instance)
/**
* @brief Renders the content to the target buffer synchronously.
*
- * @param[in] frameNumber The frame number to be rendered
+ * @param[in] elapsed The elapsed time
* @return True if the rendering success, false otherwise.
*/
- bool Render(uint32_t frameNumber);
+ bool Render(double elapsed);
/**
* @brief Gets the total number of frames of the file.
bool renderSuccess = false;
if(mVectorRenderer)
{
- renderSuccess = mVectorRenderer->Render(currentFrame);
+ auto currentTime = std::chrono::system_clock::now();
+ std::chrono::duration<double> elapsed = currentTime - mEndTime;
+ mEndTime = currentTime;
+
+ renderSuccess = mVectorRenderer->Render(elapsed.count());
if(!renderSuccess)
{
DALI_LOG_INFO(gRiveAnimationLogFilter, Debug::Verbose, "RiveAnimationTask::Rasterize: Rendering failed. Try again later.[%d] [%p]\n", currentFrame, this);
PAUSED ///< The animation is paused
};
- std::string mUrl;
- RiveAnimationRendererPtr mVectorRenderer;
- AnimationData mAnimationData[2];
- RiveAnimationThread& mRiveAnimationThread;
- ConditionalWait mConditionalWait;
- std::unique_ptr<EventThreadCallback> mAnimationFinishedTrigger;
- PlayState mPlayState;
- TimePoint mNextFrameStartTime;
- int64_t mFrameDurationMicroSeconds;
- float mFrameRate;
- uint32_t mCurrentFrame;
- uint32_t mTotalFrame;
- uint32_t mStartFrame;
- uint32_t mEndFrame;
- uint32_t mDroppedFrames;
- uint32_t mWidth;
- uint32_t mHeight;
- uint32_t mAnimationDataIndex;
- bool mUpdateFrameNumber;
- bool mNeedAnimationFinishedTrigger;
- bool mAnimationDataUpdated;
- bool mDestroyTask;
+ std::string mUrl;
+ RiveAnimationRendererPtr mVectorRenderer;
+ AnimationData mAnimationData[2];
+ RiveAnimationThread& mRiveAnimationThread;
+ ConditionalWait mConditionalWait;
+ std::unique_ptr<EventThreadCallback> mAnimationFinishedTrigger;
+ PlayState mPlayState;
+ TimePoint mNextFrameStartTime;
+ std::chrono::system_clock::time_point mEndTime;
+ int64_t mFrameDurationMicroSeconds;
+ float mFrameRate;
+ uint32_t mCurrentFrame;
+ uint32_t mTotalFrame;
+ uint32_t mStartFrame;
+ uint32_t mEndFrame;
+ uint32_t mDroppedFrames;
+ uint32_t mWidth;
+ uint32_t mHeight;
+ uint32_t mAnimationDataIndex;
+ bool mUpdateFrameNumber;
+ bool mNeedAnimationFinishedTrigger;
+ bool mAnimationDataUpdated;
+ bool mDestroyTask;
};
} // namespace Internal