Files
kaizen/lib/source/gainput/builtin/GainputInputDeviceBuiltInIos.mm
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

83 lines
3.0 KiB
Plaintext

#include <gainput/gainput.h>
#ifdef GAINPUT_PLATFORM_IOS
#include "GainputInputDeviceBuiltInImpl.h"
#include <gainput/GainputInputDeltaState.h>
#include <gainput/GainputHelpers.h>
#include <gainput/GainputLog.h>
#include "GainputInputDeviceBuiltInIos.h"
#import <CoreMotion/CoreMotion.h>
namespace gainput
{
InputDeviceBuiltInImplIos::InputDeviceBuiltInImplIos(InputManager& manager, InputDevice& device, unsigned index, InputState& state, InputState& previousState)
: pausePressed_(false),
manager_(manager),
device_(device),
index_(index),
padFound_(false),
state_(state),
previousState_(previousState),
deviceState_(InputDevice::DS_UNAVAILABLE),
motionManager_(0)
{
CMMotionManager* motionManager = [[CMMotionManager alloc] init];
[motionManager startDeviceMotionUpdates];
motionManager_ = motionManager;
deviceState_ = InputDevice::DS_OK;
}
InputDeviceBuiltInImplIos::~InputDeviceBuiltInImplIos()
{
CMMotionManager* motionManager = reinterpret_cast<CMMotionManager*>(motionManager_);
[motionManager stopDeviceMotionUpdates];
[motionManager release];
}
void InputDeviceBuiltInImplIos::Update(InputDeltaState* delta)
{
GAINPUT_ASSERT(motionManager_);
@autoreleasepool {
CMMotionManager* motionManager = reinterpret_cast<CMMotionManager*>(motionManager_);
CMDeviceMotion* motion = motionManager.deviceMotion;
if (!motion)
{
return;
}
HandleAxis(device_, state_, delta, BuiltInButtonAccelerationX, motion.userAcceleration.x);
HandleAxis(device_, state_, delta, BuiltInButtonAccelerationY, motion.userAcceleration.y);
HandleAxis(device_, state_, delta, BuiltInButtonAccelerationZ, motion.userAcceleration.z);
HandleAxis(device_, state_, delta, BuiltInButtonGravityX, motion.gravity.x);
HandleAxis(device_, state_, delta, BuiltInButtonGravityY, motion.gravity.y);
HandleAxis(device_, state_, delta, BuiltInButtonGravityZ, motion.gravity.z);
const float gyroX = 2.0f * (motion.attitude.quaternion.x * motion.attitude.quaternion.z + motion.attitude.quaternion.w * motion.attitude.quaternion.y);
const float gyroY = 2.0f * (motion.attitude.quaternion.y * motion.attitude.quaternion.z - motion.attitude.quaternion.w * motion.attitude.quaternion.x);
const float gyroZ = 1.0f - 2.0f * (motion.attitude.quaternion.x * motion.attitude.quaternion.x + motion.attitude.quaternion.y * motion.attitude.quaternion.y);
HandleAxis(device_, state_, delta, BuiltInButtonGyroscopeX, gyroX);
HandleAxis(device_, state_, delta, BuiltInButtonGyroscopeY, gyroY);
HandleAxis(device_, state_, delta, BuiltInButtonGyroscopeZ, gyroZ);
HandleAxis(device_, state_, delta, BuiltInButtonMagneticFieldX, motion.magneticField.field.x);
HandleAxis(device_, state_, delta, BuiltInButtonMagneticFieldY, motion.magneticField.field.y);
HandleAxis(device_, state_, delta, BuiltInButtonMagneticFieldZ, motion.magneticField.field.z);
}
}
bool InputDeviceBuiltInImplIos::IsValidButton(DeviceButtonId deviceButton) const
{
return deviceButton >= BuiltInButtonAccelerationX && deviceButton <= BuiltInButtonMagneticFieldZ;
}
}
#endif