From 1ff0a5775ed2631945897507cea374ba9bb9ce92 Mon Sep 17 00:00:00 2001
From: Joseph Walton-Rivers <joseph@walton-rivers.uk>
Date: Sat, 11 Jun 2022 15:01:24 +0100
Subject: [PATCH] explicily pass delta time for util functions

---
 demo/demo/rollball.cpp                    | 111 +++++++++++++---------
 demo/include/rollball.hpp                 |   2 +-
 include/fggl/debug/impl/logging_std20.hpp |   2 +-
 3 files changed, 66 insertions(+), 49 deletions(-)

diff --git a/demo/demo/rollball.cpp b/demo/demo/rollball.cpp
index 580c965..dfbd3cd 100644
--- a/demo/demo/rollball.cpp
+++ b/demo/demo/rollball.cpp
@@ -80,35 +80,35 @@ static void setup_camera(fggl::ecs3::World& world) {
 	world.add<fggl::gfx::Camera>(prototype);
 }
 
-static fggl::ecs3::entity_t setup_environment(fggl::ecs3::World& world, fggl::math::vec2& size, demo::RollState& state) {
+static fggl::ecs3::entity_t setup_environment(fggl::ecs3::World& world, const fggl::math::vec2& size, demo::RollState& state) {
 	{
 		auto northWall = world.createFromPrototype("wallX");
 		auto* transform = world.get<fggl::math::Transform>(northWall);
-		transform->origin({size.x/2, 0.0f, 0.0f});
+		transform->origin({size.x/2, 0.0F, 0.0F});
 	}
 
 	{
 		auto southWall = world.createFromPrototype("wallX");
 		auto* transform = world.get<fggl::math::Transform>(southWall);
-		transform->origin({-size.x/2, 0.0f, 0.0f});
+		transform->origin({-size.x/2, 0.0F, 0.0F});
 	}
 
 	{
 		auto westWall = world.createFromPrototype("wallZ");
 		auto* transform = world.get<fggl::math::Transform>(westWall);
-		transform->origin({0.0f, 0.0f, -size.y/2});
+		transform->origin({0.0F, 0.0F, -size.y/2});
 	}
 
 	{
 		auto eastWall = world.createFromPrototype("wallZ");
 		auto* transform = world.get<fggl::math::Transform>(eastWall);
-		transform->origin({0.0f, 0.0f, size.y/2});
+		transform->origin({0.0F, 0.0F, size.y/2});
 	}
 
 	{
 		auto floor = world.createFromPrototype("floor");
 		auto *transform = world.get<fggl::math::Transform>(floor);
-		transform->origin({0.0f, -2.5f, 0.0f});
+		transform->origin({0.0F, -2.5F, 0.0F});
 	}
 
 	{
@@ -135,12 +135,22 @@ static fggl::ecs3::entity_t setup_environment(fggl::ecs3::World& world, fggl::ma
 		}
 	}
 
+	// ensure the state is clean
+	state.closestPickup = fggl::ecs::NULL_ENTITY;
+	state.mode = demo::DebugMode::NORMAL;
+	state.time = 0.0F;
+
 	return state.player;
 }
 
 
 namespace demo {
 
+	constexpr fggl::math::vec2 WORLD_SIZE{40.0F, 40.0F };
+	constexpr fggl::math::vec3 COLOUR_WHITE{1.0F, 1.0F, 1.0F};
+	constexpr fggl::math::vec3 COLOUR_BLUE{0.0F, 0.0F, 1.0F};
+	constexpr float MOVE_FORCE{3.0F};
+
 	RollBall::RollBall(fggl::App &app) : Game(app) {
 	}
 
@@ -152,9 +162,13 @@ namespace demo {
 
 		// collectable callbacks
 		auto* collectableCallbacks = world().get<fggl::phys::CollisionCallbacks>(prefabs.collectable);
-		collectableCallbacks->onEnter = [this](auto ourID, auto theirID) {
-			if ( theirID == state.player) {
-				this->world().destroy(ourID);
+		collectableCallbacks->onEnter = [this](auto ourEntity, auto theirEntity) {
+			if ( theirEntity == state.player) {
+				//if ( ourEntity == state.closestPickup ) {
+				//	// we're the closest pickup and we're about to get killed, so need to not be.
+				//	state.closestPickup = fggl::ecs::NULL_ENTITY;
+				//}
+				this->world().destroy(ourEntity);
 			}
 		};
 
@@ -162,55 +176,57 @@ namespace demo {
 		setup_camera(world());
 
 		// create a 20x20 grid
-		fggl::math::vec2 size{40.0f, 40.0f};
-		setup_environment(world(), size, state);
+		setup_environment(world(), WORLD_SIZE, state);
+	}
+
+	fggl::math::vec3 calc_move_vector(const fggl::input::Input& input) {
+		constexpr fggl::math::vec3 forward = fggl::math::FORWARD;
+		constexpr fggl::math::vec3 right = fggl::math::RIGHT;
+		fggl::math::vec3 force = fggl::math::VEC3_ZERO;
+
+		if (input.keyboard.down(glfwGetKeyScancode(GLFW_KEY_W))) {
+			force += forward;
+		}
+
+		if (input.keyboard.down(glfwGetKeyScancode(GLFW_KEY_S))) {
+			force -= forward;
+		}
+
+		if (input.keyboard.down(glfwGetKeyScancode(GLFW_KEY_A))) {
+			force -= right;
+		}
+
+		if (input.keyboard.down(glfwGetKeyScancode(GLFW_KEY_D))) {
+			force += right;
+		}
 
+		return force;
 	}
 
 	void RollBall::update() {
 		Game::update();
+
+		const float deltaTime = 1 / 60.0F;
+
 		auto& input = this->input();
 
 			if ( state.player != fggl::ecs3::NULL_ENTITY ) {
 				auto &world = this->world();
 
-				const fggl::math::vec3 forward = fggl::math::FORWARD;
-				const fggl::math::vec3 right = fggl::math::RIGHT;
-				fggl::math::vec3 force = fggl::math::VEC3_ZERO;
-				bool moved = false;
-
-				if (input.keyboard.down(glfwGetKeyScancode(GLFW_KEY_W))) {
-					force += forward;
-					moved = true;
-				}
-
-				if (input.keyboard.down(glfwGetKeyScancode(GLFW_KEY_S))) {
-					force -= forward;
-					moved = true;
-				}
-
-				if (input.keyboard.down(glfwGetKeyScancode(GLFW_KEY_A))) {
-					force -= right;
-					moved = true;
-				}
-
-				if (input.keyboard.down(glfwGetKeyScancode(GLFW_KEY_D))) {
-					force += right;
-					moved = true;
-				}
-
+				// mode selection
 				if (input.keyboard.pressed(glfwGetKeyScancode(GLFW_KEY_SPACE))) {
 					state.mode = (DebugMode)( ((int)state.mode + 1) % 3 );
 				}
 
 				// setup dynamic force
-				if ( moved ) {
-					float forceFactor = 3.0F;
-					force = glm::normalize(force) * forceFactor;
+				auto force = calc_move_vector(input);
+				if ( force != fggl::math::VEC3_ZERO ) {
+					force = glm::normalize(force) * MOVE_FORCE;
 					auto *dynamics = world.get<fggl::phys::Dynamics>(state.player);
 					dynamics->force += force;
 				}
 
+				// track player position with camera
 				{
 					auto cameras = world.findMatching<fggl::gfx::Camera>();
 					fggl::ecs3::entity_t cam = cameras[0];
@@ -229,7 +245,7 @@ namespace demo {
 						if ( world.alive(state.closestPickup) ){
 							auto *renderer = world.tryGet<fggl::gfx::PhongMaterial>(state.closestPickup);
 							if (renderer != nullptr) {
-								renderer->diffuse = {1.0f, 1.0f, 1.0f};
+								renderer->diffuse = COLOUR_WHITE;
 							}
 						}
 
@@ -237,8 +253,9 @@ namespace demo {
 					}
 				}
 
-				spinCubes(world);
-				state.time += (60.0f / 1000);
+				// make the cubes spin
+				spinCubes(world, deltaTime);
+				state.time += deltaTime;
 		}
 	}
 
@@ -261,11 +278,11 @@ namespace demo {
 		}
 
 		if ( state.closestPickup != closestEntity ) {
-			if ( state.closestPickup != fggl::ecs::NULL_ENTITY ){
+			if ( world.alive(state.closestPickup) ){
 				// deal with the previous closest pickup
 				auto *renderer = world.tryGet<fggl::gfx::PhongMaterial>(state.closestPickup);
 				if (renderer != nullptr) {
-					renderer->diffuse = {1.0f, 1.0f, 1.0f};
+					renderer->diffuse = COLOUR_WHITE;
 				}
 			}
 
@@ -274,7 +291,7 @@ namespace demo {
 			if (closestEntity != fggl::ecs::NULL_ENTITY) {
 				auto *renderer = world.tryGet<fggl::gfx::PhongMaterial>(state.closestPickup);
 				if (renderer != nullptr) {
-					renderer->diffuse = {0.0f, 0.0f, 1.0f};
+					renderer->diffuse = COLOUR_BLUE;
 				}
 			}
 		}
@@ -291,7 +308,7 @@ namespace demo {
 
 	}
 
-	void RollBall::spinCubes(fggl::ecs3::World& world) {
+	void RollBall::spinCubes(fggl::ecs3::World& world, float deltaTime) {
 		// rotation
 		for ( const auto& entity : state.collectables ) {
 			if ( !world.alive(entity) || entity == state.closestPickup ) {
@@ -302,7 +319,7 @@ namespace demo {
 
 			// rotate the cubes
 			fggl::math::vec3 angles{15, 30, 45};
-			transform->rotateEuler( angles * (60.0F / 1000) );
+			transform->rotateEuler( angles * deltaTime );
 
 
 			//auto* renderer = world.get<fggl::data::StaticMesh>( entity );
diff --git a/demo/include/rollball.hpp b/demo/include/rollball.hpp
index adda4f1..1934a67 100644
--- a/demo/include/rollball.hpp
+++ b/demo/include/rollball.hpp
@@ -64,7 +64,7 @@ namespace demo {
 			fggl::math::vec3 cameraOffset = {-15.0F, 15.0F, 0.0F};
 
 			void closestPickup(fggl::ecs3::World& world);
-			void spinCubes(fggl::ecs3::World& world);
+			void spinCubes(fggl::ecs3::World& world, float dt);
 	};
 
 }
diff --git a/include/fggl/debug/impl/logging_std20.hpp b/include/fggl/debug/impl/logging_std20.hpp
index b82d852..14a75ad 100644
--- a/include/fggl/debug/impl/logging_std20.hpp
+++ b/include/fggl/debug/impl/logging_std20.hpp
@@ -51,7 +51,7 @@ namespace fggl::debug {
 	constexpr std::string_view level_to_string(Level level) {
 		switch (level) {
 			case Level::critical:
-				return "CRITITAL";
+				return "CRITICAL";
 			case Level::error:
 				return "ERROR";
 			case Level::warning:
-- 
GitLab