Improve input time scale handling
This commit is contained in:
@@ -61,7 +61,7 @@ namespace OpenVulkano
|
|||||||
Math::Vector3f_SIMD vec(input->GetAxis(m_actionSide), input->GetAxis(m_actionUp), -input->GetAxis(m_actionForward));
|
Math::Vector3f_SIMD vec(input->GetAxis(m_actionSide), input->GetAxis(m_actionUp), -input->GetAxis(m_actionForward));
|
||||||
if (vec != Math::Vector3f_SIMD (0))
|
if (vec != Math::Vector3f_SIMD (0))
|
||||||
{
|
{
|
||||||
const float timeScale = CURRENT_FRAME.frameTime; //TODO
|
const float timeScale = input->GetTimeScale(); //TODO
|
||||||
vec = vec * timeScale * m_movementSpeedModifier; // scale vector
|
vec = vec * timeScale * m_movementSpeedModifier; // scale vector
|
||||||
vec = GetCamera()->GetRotationMatrix() * Math::Vector3f(vec);
|
vec = GetCamera()->GetRotationMatrix() * Math::Vector3f(vec);
|
||||||
const Math::Vector4f_SIMD movement(vec, 0);
|
const Math::Vector4f_SIMD movement(vec, 0);
|
||||||
|
|||||||
@@ -32,7 +32,7 @@ namespace OpenVulkano
|
|||||||
vec = Math::Utils::normalize(vec);
|
vec = Math::Utils::normalize(vec);
|
||||||
}
|
}
|
||||||
|
|
||||||
float timeScale = 3 * CURRENT_FRAME.frameTime; //TODO
|
float timeScale = 3 * input->GetTimeScale(); //TODO
|
||||||
vec = vec * timeScale * 3.0f; // scale vector
|
vec = vec * timeScale * 3.0f; // scale vector
|
||||||
if (input->GetButton(m_actionBoost))
|
if (input->GetButton(m_actionBoost))
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -193,7 +193,7 @@ namespace OpenVulkano
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
auto start = clock::now();
|
auto start = clock::now();
|
||||||
inputManager->Tick();
|
inputManager->Tick(CURRENT_FRAME.frameTime);
|
||||||
mainThreadTaskPool.Tick();
|
mainThreadTaskPool.Tick();
|
||||||
app->Tick();
|
app->Tick();
|
||||||
if (CURRENT_FRAME.needsRedraw)
|
if (CURRENT_FRAME.needsRedraw)
|
||||||
|
|||||||
@@ -136,8 +136,9 @@ namespace OpenVulkano::Input
|
|||||||
return devices;
|
return devices;
|
||||||
}
|
}
|
||||||
|
|
||||||
void InputManager::Tick()
|
void InputManager::Tick(double time)
|
||||||
{
|
{
|
||||||
|
timescale = inputTimeRange.Clamp(time);
|
||||||
for(InputDevice* device : devices)
|
for(InputDevice* device : devices)
|
||||||
{
|
{
|
||||||
device->Tick();
|
device->Tick();
|
||||||
|
|||||||
@@ -9,6 +9,7 @@
|
|||||||
#include "InputDevice.hpp"
|
#include "InputDevice.hpp"
|
||||||
#include "InputAction.hpp"
|
#include "InputAction.hpp"
|
||||||
#include "InputShortcut.hpp"
|
#include "InputShortcut.hpp"
|
||||||
|
#include "Math/Range.hpp"
|
||||||
|
|
||||||
#include <memory>
|
#include <memory>
|
||||||
#include <unordered_map>
|
#include <unordered_map>
|
||||||
@@ -22,7 +23,7 @@ namespace OpenVulkano::Input
|
|||||||
public:
|
public:
|
||||||
static InputManager* GetInstance();
|
static InputManager* GetInstance();
|
||||||
|
|
||||||
void Tick();
|
void Tick(double time);
|
||||||
|
|
||||||
void RegisterInputDevice(InputDevice* device)
|
void RegisterInputDevice(InputDevice* device)
|
||||||
{
|
{
|
||||||
@@ -53,9 +54,13 @@ namespace OpenVulkano::Input
|
|||||||
return lastActiveDevice;
|
return lastActiveDevice;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[[nodiscard]] float GetTimeScale() const { return timescale; }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
std::unordered_map<std::string, std::unique_ptr<InputAction>> actionNameMapping;
|
std::unordered_map<std::string, std::unique_ptr<InputAction>> actionNameMapping;
|
||||||
std::vector<InputDevice*> devices;
|
std::vector<InputDevice*> devices;
|
||||||
InputDevice* lastActiveDevice = nullptr;
|
InputDevice* lastActiveDevice = nullptr;
|
||||||
|
const Math::Range<float> inputTimeRange = { 1.0f / 10000, 1.0f / 30 }; // Limit input time range from 1/10k FPS to 1/30fps
|
||||||
|
float timescale = 1.0f / 60;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,6 +6,7 @@
|
|||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include "Math.hpp"
|
||||||
#ifdef _MSC_VER
|
#ifdef _MSC_VER
|
||||||
#undef min
|
#undef min
|
||||||
#undef max
|
#undef max
|
||||||
@@ -32,5 +33,7 @@ namespace OpenVulkano::Math
|
|||||||
[[nodiscard]] T& GetMax() { return max; }
|
[[nodiscard]] T& GetMax() { return max; }
|
||||||
|
|
||||||
[[nodiscard]] T GetSize() const { return max - min; }
|
[[nodiscard]] T GetSize() const { return max - min; }
|
||||||
|
|
||||||
|
[[nodiscard]] T Clamp(const T& value) const { return Math::Utils::clamp(value, min, max); }
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -44,7 +44,7 @@ namespace OpenVulkano::Scene
|
|||||||
|
|
||||||
if (m_isMorphing)
|
if (m_isMorphing)
|
||||||
{
|
{
|
||||||
m_currentTime += CURRENT_FRAME.frameTime;
|
m_currentTime += input->GetTimeScale();
|
||||||
if (m_currentTime > m_animationDuration) m_currentTime = m_animationDuration;
|
if (m_currentTime > m_animationDuration) m_currentTime = m_animationDuration;
|
||||||
float t = m_currentTime / m_animationDuration;
|
float t = m_currentTime / m_animationDuration;
|
||||||
if (t >= 1.0f)
|
if (t >= 1.0f)
|
||||||
|
|||||||
@@ -55,7 +55,7 @@ namespace OpenVulkano::Scene
|
|||||||
|
|
||||||
if (Math::Utils::length2(direction) > 0.0f) { direction = Math::Utils::normalize(direction); }
|
if (Math::Utils::length2(direction) > 0.0f) { direction = Math::Utils::normalize(direction); }
|
||||||
|
|
||||||
float timeScale = CURRENT_FRAME.frameTime;
|
float timeScale = input->GetTimeScale();
|
||||||
float speed = 3.0f;
|
float speed = 3.0f;
|
||||||
direction *= timeScale * speed;
|
direction *= timeScale * speed;
|
||||||
direction = direction - Math::Utils::dot(direction, m_planeNormal) * m_planeNormal;
|
direction = direction - Math::Utils::dot(direction, m_planeNormal) * m_planeNormal;
|
||||||
|
|||||||
Reference in New Issue
Block a user