Files
kaizen/lib/source/gainput/recorder/GainputInputRecorder.cpp
Simone 4e42229bdd Squashed 'external/gainput/' content from commit 2be0a50
git-subtree-dir: external/gainput
git-subtree-split: 2be0a50089eafcc6fccb66142180082e48f27f4c
2024-01-22 08:51:55 +01:00

147 lines
3.0 KiB
C++

#include <gainput/gainput.h>
#ifdef GAINPUT_ENABLE_RECORDER
namespace gainput
{
namespace
{
class RecordingListener : public InputListener
{
public:
RecordingListener(InputManager& manager, InputRecorder& recorder) :
manager_(manager),
recorder_(recorder)
{ }
bool OnDeviceButtonBool(gainput::DeviceId deviceId, gainput::DeviceButtonId deviceButton, bool /*oldValue*/, bool newValue)
{
if (!recorder_.IsDeviceToRecord(deviceId))
{
return true;
}
InputRecording* recording = recorder_.GetRecording();
GAINPUT_ASSERT(recording);
GAINPUT_ASSERT(manager_.GetTime() >= recorder_.GetStartTime());
const uint64_t time = manager_.GetTime() - recorder_.GetStartTime();
recording->AddChange(time, deviceId, deviceButton, newValue);
return true;
}
bool OnDeviceButtonFloat(gainput::DeviceId deviceId, gainput::DeviceButtonId deviceButton, float /*oldValue*/, float newValue)
{
if (!recorder_.IsDeviceToRecord(deviceId))
{
return true;
}
InputRecording* recording = recorder_.GetRecording();
GAINPUT_ASSERT(recording);
GAINPUT_ASSERT(manager_.GetTime() >= recorder_.GetStartTime());
const uint64_t time = manager_.GetTime() - recorder_.GetStartTime();
recording->AddChange(time, deviceId, deviceButton, newValue);
return true;
}
private:
InputManager& manager_;
InputRecorder& recorder_;
};
}
InputRecorder::InputRecorder(InputManager& manager) :
manager_(manager),
isRecording_(false),
recordingListener_(0),
recording_(0),
startTime_(0),
recordedDevices_(manager.GetAllocator())
{
}
InputRecorder::~InputRecorder()
{
Stop();
if (recording_)
{
manager_.GetAllocator().Delete(recording_);
}
}
void
InputRecorder::Start()
{
isRecording_ = true;
if (recording_)
{
recording_->Clear();
}
else
{
recording_ = manager_.GetAllocator().New<InputRecording>(manager_.GetAllocator());
}
startTime_ = manager_.GetTime();
recordingListener_ = manager_.GetAllocator().New<RecordingListener>(manager_, *this);
recordingListenerId_ = manager_.AddListener(recordingListener_);
// Record the initial state
for (InputManager::iterator it = manager_.begin();
it != manager_.end();
++it)
{
InputDevice* device = it->second;
const DeviceId deviceId = device->GetDeviceId();
if (!IsDeviceToRecord(deviceId))
{
continue;
}
GAINPUT_ASSERT(device->GetInputState());
for (DeviceButtonId buttonId = 0; buttonId < device->GetInputState()->GetButtonCount(); ++buttonId)
{
if (device->IsValidButtonId(buttonId))
{
if (device->GetButtonType(buttonId) == BT_BOOL)
{
recording_->AddChange(0, deviceId, buttonId, device->GetBool(buttonId));
}
else
{
recording_->AddChange(0, deviceId, buttonId, device->GetFloat(buttonId));
}
}
}
}
}
void
InputRecorder::Stop()
{
if (!isRecording_)
{
return;
}
isRecording_ = false;
manager_.RemoveListener(recordingListenerId_);
manager_.GetAllocator().Delete(recordingListener_);
recordingListener_ = 0;
}
}
#endif