Files
kaizen/lib/source/gainput/touch/GainputInputDeviceTouchAndroid.h
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

100 lines
2.4 KiB
C++

#ifndef GAINPUTINPUTDEVICETOUCHANDROID_H_
#define GAINPUTINPUTDEVICETOUCHANDROID_H_
#include <android/native_activity.h>
#include "GainputInputDeviceTouchImpl.h"
#include "GainputTouchInfo.h"
#include <gainput/GainputHelpers.h>
namespace gainput
{
class InputDeviceTouchImplAndroid : public InputDeviceTouchImpl
{
public:
InputDeviceTouchImplAndroid(InputManager& manager, InputDevice& device, InputState& state, InputState& previousState) :
manager_(manager),
device_(device),
state_(&state),
previousState_(&previousState),
nextState_(manager.GetAllocator(), TouchPointCount*TouchDataElems),
delta_(0)
{
}
InputDevice::DeviceVariant GetVariant() const
{
return InputDevice::DV_STANDARD;
}
void Update(InputDeltaState* delta)
{
delta_ = delta;
*state_ = nextState_;
}
InputDevice::DeviceState GetState() const { return InputDevice::DS_OK; }
int32_t HandleInput(AInputEvent* event)
{
GAINPUT_ASSERT(state_);
GAINPUT_ASSERT(previousState_);
GAINPUT_ASSERT(event);
if (AInputEvent_getType(event) != AINPUT_EVENT_TYPE_MOTION)
{
return 0;
}
for (unsigned i = 0; i < AMotionEvent_getPointerCount(event) && i < TouchPointCount; ++i)
{
GAINPUT_ASSERT(i < TouchPointCount);
const float x = AMotionEvent_getX(event, i);
const float y = AMotionEvent_getY(event, i);
const int32_t w = manager_.GetDisplayWidth();
const int32_t h = manager_.GetDisplayHeight();
HandleFloat(Touch0X + i*TouchDataElems, x/float(w));
HandleFloat(Touch0Y + i*TouchDataElems, y/float(h));
const int motionAction = AMotionEvent_getAction(event);
const bool down = (motionAction == AMOTION_EVENT_ACTION_DOWN || motionAction == AMOTION_EVENT_ACTION_MOVE);
HandleBool(Touch0Down + i*TouchDataElems, down);
HandleFloat(Touch0Pressure + i*TouchDataElems, AMotionEvent_getPressure(event, i));
#ifdef GAINPUT_DEBUG
GAINPUT_LOG("Touch %i) x: %f, y: %f, w: %i, h: %i, action: %d\n", i, x, y, w, h, motionAction);
#endif
}
return 1;
}
InputState* GetNextInputState()
{
return &nextState_;
}
private:
InputManager& manager_;
InputDevice& device_;
InputState* state_;
InputState* previousState_;
InputState nextState_;
InputDeltaState* delta_;
void HandleBool(DeviceButtonId buttonId, bool value)
{
HandleButton(device_, nextState_, delta_, buttonId, value);
}
void HandleFloat(DeviceButtonId buttonId, float value)
{
HandleAxis(device_, nextState_, delta_, buttonId, value);
}
};
}
#endif