forked from Kolyah35/minecraft-pe-0.6.1
76 lines
2.4 KiB
C++
Executable File
76 lines
2.4 KiB
C++
Executable File
#include "Controller.h"
|
|
|
|
static int _abs(int x) { return x>=0? x:-x; }
|
|
static float _abs(float x) { return x>=0? x:-x; }
|
|
|
|
/*static*/ float Controller::stickValuesX[NUM_STICKS] = {0};
|
|
/*static*/ float Controller::stickValuesY[NUM_STICKS] = {0};
|
|
/*static*/ bool Controller::isTouchedValues[NUM_STICKS] = {0};
|
|
|
|
bool Controller::isTouched( int stickIndex )
|
|
{
|
|
if (!isValidStick(stickIndex)) return false;
|
|
|
|
return isTouchedValues[stickIndex-1];
|
|
}
|
|
|
|
void Controller::feed( int stickIndex, int state, float dx, float dy )
|
|
{
|
|
if (!isValidStick(stickIndex)) return;
|
|
|
|
if (NUM_STICKS == 2)
|
|
stickIndex = dx<0? 1 : 2;
|
|
|
|
isTouchedValues[stickIndex-1] = (state != STATE_RELEASE);
|
|
|
|
// @note: Since I don't know where to put the Xperia Play specific
|
|
// calculations, I put them here! (normally I would probably have
|
|
// some kind of (XperiaPlay)ControllerReader but it doesn't make much
|
|
// more sense as long as we cant figure out (in code) whether or not
|
|
// we actually use an Xperia -> hardcode it here (Note#2, we CAN figure
|
|
// figure this out, at least by JNI/java-call but we arent doing it)
|
|
static float offsets[3] = {0, 0.64f, -0.64f};
|
|
dx = linearTransform(dx + offsets[stickIndex], 0, 2.78f, true);
|
|
|
|
stickValuesX[stickIndex-1] = dx;
|
|
stickValuesY[stickIndex-1] = dy;
|
|
}
|
|
|
|
float Controller::getX( int stickIndex )
|
|
{
|
|
if (!isValidStick(stickIndex)) return 0;
|
|
return stickValuesX[stickIndex-1];
|
|
}
|
|
|
|
float Controller::getY( int stickIndex )
|
|
{
|
|
if (!isValidStick(stickIndex)) return 0;
|
|
return stickValuesY[stickIndex-1];
|
|
}
|
|
|
|
float Controller::getTransformedX( int stickIndex, float deadZone, float scale/*=1.0f*/, bool limit1/*=false*/ )
|
|
{
|
|
if (!isValidStick(stickIndex)) return 0;
|
|
return linearTransform(stickValuesX[stickIndex-1], deadZone, scale, limit1);
|
|
}
|
|
|
|
float Controller::getTransformedY( int stickIndex, float deadZone, float scale/*=1.0f*/, bool limit1/*=false*/ )
|
|
{
|
|
if (!isValidStick(stickIndex)) return 0;
|
|
return linearTransform(stickValuesY[stickIndex-1], deadZone, scale, limit1);
|
|
}
|
|
|
|
float Controller::linearTransform( float value, float deadZone, float scale/*=1.0f*/, bool limit1/*=false*/ )
|
|
{
|
|
float deadSigned = value >= 0? deadZone : -deadZone;
|
|
if (_abs(deadSigned) >= _abs(value)) return 0;
|
|
float ret = (value - deadSigned) * scale;
|
|
if (limit1 && _abs(ret) > 1) ret = ret>0.0f? 1.0f : -1.0f;
|
|
return ret;
|
|
}
|
|
|
|
/*static*/
|
|
bool Controller::isValidStick(int stick) {
|
|
return stick > 0 && stick <= NUM_STICKS;
|
|
}
|