| Line | Branch | Decision | Call | Exec | Source |
|---|---|---|---|---|---|
| 1 | #ifndef CHRYSALIS_BASEANIMATEDRENDERER_H | ||||
| 2 | #define CHRYSALIS_BASEANIMATEDRENDERER_H | ||||
| 3 | |||||
| 4 | #include <chrono> | ||||
| 5 | |||||
| 6 | #include "BaseRenderer.h" | ||||
| 7 | |||||
| 8 | namespace Chrysalis { | ||||
| 9 | template<typename D> | ||||
| 10 | class BaseAnimatedRenderer: public BaseRenderer<D> { | ||||
| 11 | protected: | ||||
| 12 | ✗ | explicit BaseAnimatedRenderer(D* data): BaseRenderer<D>(data) {} | |||
| 13 | |||||
| 14 | ✗ | void complete() { | |||
| 15 | ✗ | isCompleted_ = true; | |||
| 16 | ✗ | } | |||
| 17 | virtual void prepareNextFrame(int64_t startTime, int64_t previousFrameTime, int64_t currentFrameTime) = 0; | ||||
| 18 | public: | ||||
| 19 | ✗ | bool animate() { | |||
| 20 | ✗ | const auto now = clock::now(); | |||
| 21 | ✗ | const int64_t currentTime = std::chrono::duration_cast<std::chrono::milliseconds>(now.time_since_epoch()).count(); | |||
| 22 | |||||
| 23 | ✗ | if (isCompleted_) { | |||
| 24 | ✗ | startTime_ = currentTime; | |||
| 25 | ✗ | isCompleted_ = false; | |||
| 26 | ✗ | time_ = currentTime; | |||
| 27 | } | ||||
| 28 | ✗ | prepareNextFrame(startTime_, time_, currentTime); | |||
| 29 | ✗ | time_ = currentTime; | |||
| 30 | ✗ | BaseRenderer<D>::upload(); | |||
| 31 | ✗ | return !isCompleted_; | |||
| 32 | } | ||||
| 33 | private: | ||||
| 34 | using clock = std::chrono::steady_clock; | ||||
| 35 | |||||
| 36 | int64_t time_ = 0; | ||||
| 37 | int64_t startTime_ = 0; | ||||
| 38 | bool isCompleted_ = true; | ||||
| 39 | }; | ||||
| 40 | } | ||||
| 41 | |||||
| 42 | #endif //CHRYSALIS_BASEANIMATEDRENDERER_H | ||||
| 43 |