diff options
| author | JAROWMR <jarorutjes07@gmail.com> | 2024-12-13 20:50:22 +0100 | 
|---|---|---|
| committer | JAROWMR <jarorutjes07@gmail.com> | 2024-12-13 20:50:22 +0100 | 
| commit | 3d237aed79980e8703ca53df0549e0b48816e464 (patch) | |
| tree | d71ba23092fe48eb063fe2d5d23b5d03aecb06b7 | |
| parent | 512aa7f54b88994d3095971b2001930b4e612947 (diff) | |
| parent | 8f20aac54aed1a060d59d5169276ef3ed33a8dc9 (diff) | |
Merge branch 'master' of github.com:lonkaars/crepe into jaro/particle-system-improvement
| -rw-r--r-- | src/crepe/manager/LoopTimerManager.cpp | 2 | ||||
| -rw-r--r-- | src/crepe/manager/LoopTimerManager.h | 8 | ||||
| -rw-r--r-- | src/crepe/system/AnimatorSystem.cpp | 5 | ||||
| -rw-r--r-- | src/test/LoopTimerTest.cpp | 18 | 
4 files changed, 26 insertions, 7 deletions
| diff --git a/src/crepe/manager/LoopTimerManager.cpp b/src/crepe/manager/LoopTimerManager.cpp index 9819632..a6e4788 100644 --- a/src/crepe/manager/LoopTimerManager.cpp +++ b/src/crepe/manager/LoopTimerManager.cpp @@ -31,7 +31,7 @@ void LoopTimerManager::update() {  		this->delta_time = this->maximum_delta_time;  	}  	if (this->delta_time > 0s) { -		this->actual_fps = 1.0 / duration_cast<seconds>(this->delta_time).count(); +		this->actual_fps = static_cast<unsigned>(1.0 / this->delta_time.count());  	} else {  		this->actual_fps = 0;  	} diff --git a/src/crepe/manager/LoopTimerManager.h b/src/crepe/manager/LoopTimerManager.h index 91403e4..76b02d3 100644 --- a/src/crepe/manager/LoopTimerManager.h +++ b/src/crepe/manager/LoopTimerManager.h @@ -6,7 +6,7 @@  namespace crepe { -typedef std::chrono::duration<double> duration_t; +typedef std::chrono::duration<float> duration_t;  typedef std::chrono::duration<unsigned long long, std::micro> elapsed_time_t;  /** @@ -55,7 +55,7 @@ public:  	 *  	 * \return Current FPS.  	 */ -	unsigned get_fps() const; +	unsigned int get_fps() const;  	/**  	 * \brief Get the current time scale. @@ -149,9 +149,9 @@ private:  private:  	//! Target frames per second. -	unsigned target_fps = 60; +	unsigned int target_fps = 60;  	//! Actual frames per second. -	unsigned actual_fps = 0; +	unsigned int actual_fps = 0;  	//! Time scale for speeding up or slowing down the game (0 = pause, < 1 = slow down, 1 = normal speed, > 1 = speed up).  	float time_scale = 1;  	//! Maximum delta time in seconds to avoid large jumps. diff --git a/src/crepe/system/AnimatorSystem.cpp b/src/crepe/system/AnimatorSystem.cpp index 31eb85c..107b25d 100644 --- a/src/crepe/system/AnimatorSystem.cpp +++ b/src/crepe/system/AnimatorSystem.cpp @@ -3,20 +3,23 @@  #include "../api/Animator.h"  #include "../manager/ComponentManager.h"  #include "../manager/LoopTimerManager.h" +#include <chrono>  #include "AnimatorSystem.h"  using namespace crepe; +using namespace std::chrono;  void AnimatorSystem::update() {  	ComponentManager & mgr = this->mediator.component_manager;  	LoopTimerManager & timer = this->mediator.loop_timer;  	RefVector<Animator> animations = mgr.get_components_by_type<Animator>(); -	unsigned long long elapsed_time = timer.get_elapsed_time().count(); +	float elapsed_time = duration_cast<duration<float>>(timer.get_elapsed_time()).count();  	for (Animator & a : animations) {  		if (!a.active) continue; +		if (a.data.fps == 0) continue;  		Animator::Data & ctx = a.data;  		float frame_duration = 1.0f / ctx.fps; diff --git a/src/test/LoopTimerTest.cpp b/src/test/LoopTimerTest.cpp index d76bf45..7bd6305 100644 --- a/src/test/LoopTimerTest.cpp +++ b/src/test/LoopTimerTest.cpp @@ -30,7 +30,7 @@ TEST_F(LoopTimerTest, EnforcesTargetFrameRate) {  	auto elapsed_ms = duration_cast<milliseconds>(elapsed_time).count();  	// For 60 FPS, the target frame time is around 16.67ms -	ASSERT_NEAR(elapsed_ms, 16.7, 1); +	ASSERT_NEAR(elapsed_ms, 16.7, 5);  }  TEST_F(LoopTimerTest, SetTargetFps) { @@ -79,3 +79,19 @@ TEST_F(LoopTimerTest, DISABLED_getCurrentTime) {  	ASSERT_NEAR(loop_timer.get_elapsed_time().count(), elapsed_time, 5);  } +TEST_F(LoopTimerTest, getFPS) { +	// Set the target FPS to 60 (which gives a target time per frame of ~16.67 ms) +	loop_timer.set_target_framerate(60); + +	auto start_time = steady_clock::now(); +	loop_timer.enforce_frame_rate(); + +	auto elapsed_time = steady_clock::now() - start_time; +	loop_timer.update(); +	unsigned int fps = loop_timer.get_fps(); +	auto elapsed_ms = duration_cast<milliseconds>(elapsed_time).count(); + +	// For 60 FPS, the target frame time is around 16.67ms +	ASSERT_NEAR(elapsed_ms, 16.7, 1); +	ASSERT_NEAR(fps, 60, 2); +} |