RiveAnimationView: apply time based rendering 31/263531/1
authorTaehyub Kim <taehyub.kim@samsung.com>
Mon, 6 Sep 2021 04:47:47 +0000 (13:47 +0900)
committerTaehyub Kim <taehyub.kim@samsung.com>
Mon, 6 Sep 2021 04:47:47 +0000 (13:47 +0900)
Change-Id: I7f0480fe43129770a9f2cdeb36e084560ad2a5be

dali-extension/internal/rive-animation-view/animation-renderer/rive-animation-renderer.cpp
dali-extension/internal/rive-animation-view/animation-renderer/rive-animation-renderer.h
dali-extension/internal/rive-animation-view/rive-animation-task.cpp
dali-extension/internal/rive-animation-view/rive-animation-task.h

index de59872..433cb4c 100644 (file)
@@ -233,7 +233,7 @@ void RiveAnimationRenderer::SetSize(uint32_t width, uint32_t height)
   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())
@@ -292,13 +292,7 @@ bool RiveAnimationRenderer::Render(uint32_t frameNumber)
   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)
index 2e7c673..64f4214 100755 (executable)
@@ -97,10 +97,10 @@ public:
   /**
    * @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.
index abd9ce0..cbaf880 100644 (file)
@@ -304,7 +304,11 @@ bool RiveAnimationTask::Rasterize()
   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);
index d714863..ac798a3 100644 (file)
@@ -303,28 +303,29 @@ private:
     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