Skip to content
Snippets Groups Projects
Commit 1ff0a577 authored by Joseph Walton-Rivers's avatar Joseph Walton-Rivers
Browse files

explicily pass delta time for util functions

parent fd114acb
No related branches found
No related tags found
No related merge requests found
...@@ -80,35 +80,35 @@ static void setup_camera(fggl::ecs3::World& world) { ...@@ -80,35 +80,35 @@ static void setup_camera(fggl::ecs3::World& world) {
world.add<fggl::gfx::Camera>(prototype); 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 northWall = world.createFromPrototype("wallX");
auto* transform = world.get<fggl::math::Transform>(northWall); 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 southWall = world.createFromPrototype("wallX");
auto* transform = world.get<fggl::math::Transform>(southWall); 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 westWall = world.createFromPrototype("wallZ");
auto* transform = world.get<fggl::math::Transform>(westWall); 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 eastWall = world.createFromPrototype("wallZ");
auto* transform = world.get<fggl::math::Transform>(eastWall); 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 floor = world.createFromPrototype("floor");
auto *transform = world.get<fggl::math::Transform>(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 ...@@ -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; return state.player;
} }
namespace demo { 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) { RollBall::RollBall(fggl::App &app) : Game(app) {
} }
...@@ -152,9 +162,13 @@ namespace demo { ...@@ -152,9 +162,13 @@ namespace demo {
// collectable callbacks // collectable callbacks
auto* collectableCallbacks = world().get<fggl::phys::CollisionCallbacks>(prefabs.collectable); auto* collectableCallbacks = world().get<fggl::phys::CollisionCallbacks>(prefabs.collectable);
collectableCallbacks->onEnter = [this](auto ourID, auto theirID) { collectableCallbacks->onEnter = [this](auto ourEntity, auto theirEntity) {
if ( theirID == state.player) { if ( theirEntity == state.player) {
this->world().destroy(ourID); //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 { ...@@ -162,55 +176,57 @@ namespace demo {
setup_camera(world()); setup_camera(world());
// create a 20x20 grid // create a 20x20 grid
fggl::math::vec2 size{40.0f, 40.0f}; setup_environment(world(), WORLD_SIZE, state);
setup_environment(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() { void RollBall::update() {
Game::update(); Game::update();
const float deltaTime = 1 / 60.0F;
auto& input = this->input(); auto& input = this->input();
if ( state.player != fggl::ecs3::NULL_ENTITY ) { if ( state.player != fggl::ecs3::NULL_ENTITY ) {
auto &world = this->world(); auto &world = this->world();
const fggl::math::vec3 forward = fggl::math::FORWARD; // mode selection
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;
}
if (input.keyboard.pressed(glfwGetKeyScancode(GLFW_KEY_SPACE))) { if (input.keyboard.pressed(glfwGetKeyScancode(GLFW_KEY_SPACE))) {
state.mode = (DebugMode)( ((int)state.mode + 1) % 3 ); state.mode = (DebugMode)( ((int)state.mode + 1) % 3 );
} }
// setup dynamic force // setup dynamic force
if ( moved ) { auto force = calc_move_vector(input);
float forceFactor = 3.0F; if ( force != fggl::math::VEC3_ZERO ) {
force = glm::normalize(force) * forceFactor; force = glm::normalize(force) * MOVE_FORCE;
auto *dynamics = world.get<fggl::phys::Dynamics>(state.player); auto *dynamics = world.get<fggl::phys::Dynamics>(state.player);
dynamics->force += force; dynamics->force += force;
} }
// track player position with camera
{ {
auto cameras = world.findMatching<fggl::gfx::Camera>(); auto cameras = world.findMatching<fggl::gfx::Camera>();
fggl::ecs3::entity_t cam = cameras[0]; fggl::ecs3::entity_t cam = cameras[0];
...@@ -229,7 +245,7 @@ namespace demo { ...@@ -229,7 +245,7 @@ namespace demo {
if ( world.alive(state.closestPickup) ){ if ( world.alive(state.closestPickup) ){
auto *renderer = world.tryGet<fggl::gfx::PhongMaterial>(state.closestPickup); auto *renderer = world.tryGet<fggl::gfx::PhongMaterial>(state.closestPickup);
if (renderer != nullptr) { if (renderer != nullptr) {
renderer->diffuse = {1.0f, 1.0f, 1.0f}; renderer->diffuse = COLOUR_WHITE;
} }
} }
...@@ -237,8 +253,9 @@ namespace demo { ...@@ -237,8 +253,9 @@ namespace demo {
} }
} }
spinCubes(world); // make the cubes spin
state.time += (60.0f / 1000); spinCubes(world, deltaTime);
state.time += deltaTime;
} }
} }
...@@ -261,11 +278,11 @@ namespace demo { ...@@ -261,11 +278,11 @@ namespace demo {
} }
if ( state.closestPickup != closestEntity ) { if ( state.closestPickup != closestEntity ) {
if ( state.closestPickup != fggl::ecs::NULL_ENTITY ){ if ( world.alive(state.closestPickup) ){
// deal with the previous closest pickup // deal with the previous closest pickup
auto *renderer = world.tryGet<fggl::gfx::PhongMaterial>(state.closestPickup); auto *renderer = world.tryGet<fggl::gfx::PhongMaterial>(state.closestPickup);
if (renderer != nullptr) { if (renderer != nullptr) {
renderer->diffuse = {1.0f, 1.0f, 1.0f}; renderer->diffuse = COLOUR_WHITE;
} }
} }
...@@ -274,7 +291,7 @@ namespace demo { ...@@ -274,7 +291,7 @@ namespace demo {
if (closestEntity != fggl::ecs::NULL_ENTITY) { if (closestEntity != fggl::ecs::NULL_ENTITY) {
auto *renderer = world.tryGet<fggl::gfx::PhongMaterial>(state.closestPickup); auto *renderer = world.tryGet<fggl::gfx::PhongMaterial>(state.closestPickup);
if (renderer != nullptr) { if (renderer != nullptr) {
renderer->diffuse = {0.0f, 0.0f, 1.0f}; renderer->diffuse = COLOUR_BLUE;
} }
} }
} }
...@@ -291,7 +308,7 @@ namespace demo { ...@@ -291,7 +308,7 @@ namespace demo {
} }
void RollBall::spinCubes(fggl::ecs3::World& world) { void RollBall::spinCubes(fggl::ecs3::World& world, float deltaTime) {
// rotation // rotation
for ( const auto& entity : state.collectables ) { for ( const auto& entity : state.collectables ) {
if ( !world.alive(entity) || entity == state.closestPickup ) { if ( !world.alive(entity) || entity == state.closestPickup ) {
...@@ -302,7 +319,7 @@ namespace demo { ...@@ -302,7 +319,7 @@ namespace demo {
// rotate the cubes // rotate the cubes
fggl::math::vec3 angles{15, 30, 45}; 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 ); //auto* renderer = world.get<fggl::data::StaticMesh>( entity );
......
...@@ -64,7 +64,7 @@ namespace demo { ...@@ -64,7 +64,7 @@ namespace demo {
fggl::math::vec3 cameraOffset = {-15.0F, 15.0F, 0.0F}; fggl::math::vec3 cameraOffset = {-15.0F, 15.0F, 0.0F};
void closestPickup(fggl::ecs3::World& world); void closestPickup(fggl::ecs3::World& world);
void spinCubes(fggl::ecs3::World& world); void spinCubes(fggl::ecs3::World& world, float dt);
}; };
} }
......
...@@ -51,7 +51,7 @@ namespace fggl::debug { ...@@ -51,7 +51,7 @@ namespace fggl::debug {
constexpr std::string_view level_to_string(Level level) { constexpr std::string_view level_to_string(Level level) {
switch (level) { switch (level) {
case Level::critical: case Level::critical:
return "CRITITAL"; return "CRITICAL";
case Level::error: case Level::error:
return "ERROR"; return "ERROR";
case Level::warning: case Level::warning:
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment