Start to make possible use of "full analog surface". (useful for triggers on some silly physical gamepads)

This commit is contained in:
Jordan Woyak 2013-01-17 15:40:44 -06:00
parent 69c91a20ea
commit 38b01d176a
2 changed files with 33 additions and 3 deletions

View File

@ -461,7 +461,7 @@ ControllerInterface::Device::Control* ControllerInterface::InputReference::Detec
i = device->Inputs().begin(),
e = device->Inputs().end();
for (std::vector<bool>::iterator state = states.begin(); i != e; ++i)
*state++ = ((*i)->GetState() > INPUT_DETECT_THRESHOLD);
*state++ = ((*i)->GetState() > (1 - INPUT_DETECT_THRESHOLD));
while (time < ms)
{
@ -477,7 +477,7 @@ ControllerInterface::Device::Control* ControllerInterface::InputReference::Detec
if (false == *state)
return *i;
}
else
else if ((*i)->GetState() < (1 - INPUT_DETECT_THRESHOLD))
*state = false;
}
Common::SleepCurrentThread(10); time += 10;

View File

@ -87,7 +87,7 @@ public:
Input* ToInput() { return this; }
};
//
// Output
//
@ -122,6 +122,36 @@ public:
protected:
void AddInput(Input* const i);
void AddOutput(Output* const o);
class FullAnalogSurface : public Input
{
public:
FullAnalogSurface(Input* low, Input* high)
: m_low(*low), m_high(*high)
{}
ControlState GetState() const
{
return (1 + m_high.GetState() - m_low.GetState()) / 2;
}
std::string GetName() const
{
return m_low.GetName() + *m_high.GetName().rbegin();
}
private:
Input& m_low;
Input& m_high;
};
void AddAnalogInputs(Input* low, Input* high)
{
AddInput(low);
AddInput(high);
AddInput(new FullAnalogSurface(low, high));
AddInput(new FullAnalogSurface(high, low));
}
private:
std::vector<Input*> m_inputs;