@@ -22,26 +22,43 @@ namespace lol
void KeyBinding::Bind(const char* device_name, const char* key_name)
void KeyBinding::Bind(const char* device_name, const char* key_name)
{
{
ClearBinding( );
const InputDevice* device = InputDevice::Get(device_name );
m_device = InputDevice::Get(device_name);
if (!m_device)
if (!device)
{
{
Log::Warn("Trying to bind controller to device %s which doesn't exist", device_name);
Log::Warn("Trying to bind controller to device %s which doesn't exist", device_name);
return;
return;
}
}
m_keyindex = m_device->GetKeyIndex(key_name);
if (m_keyindex < 0)
int keyindex = device->GetKeyIndex(key_name);
if (keyindex < 0)
{
{
Log::Warn("Trying to bind controller to key %s.%s which doesn't exist", device_name, key_name);
Log::Warn("Trying to bind controller to key %s.%s which doesn't exist", device_name, key_name);
return;
}
m_keybindings.Push(device, keyindex);
}
bool KeyBinding::Unbind(const char* device_name, const char* key_name)
{
for (int i = 0; i < m_keybindings.Count(); ++i)
{
if (m_keybindings[i].m1->GetName() == device_name)
{
if (m_keybindings[i].m2 == m_keybindings[i].m1->GetKeyIndex(key_name))
{
m_keybindings.Remove(i);
return true;
}
}
}
}
return false;
}
}
void KeyBinding::ClearBinding()
void KeyBinding::ClearBindings ()
{
{
m_keyindex = -1;
m_keybindings.Empty() ;
}
}
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
@@ -49,89 +66,153 @@ void KeyBinding::ClearBinding()
void AxisBinding::Bind(const char* device_name, const char* axis_name)
void AxisBinding::Bind(const char* device_name, const char* axis_name)
{
{
ClearBinding();
m_device = InputDevice::Get(device_name);
if (!m_device)
const InputDevice* device = InputDevice::Get(device_name);
if (!device)
{
{
Log::Warn("Trying to bind controller to device %s which doesn't exist", device_name);
Log::Warn("Trying to bind controller to device %s which doesn't exist", device_name);
return;
return;
}
}
m_axisindex = m_device->GetAxisIndex(axis_name);
if (m_axisindex < 0)
int axisindex = device->GetAxisIndex(axis_name);
if (axisindex < 0)
{
{
Log::Warn("Trying to bind controller to axis %s.%s which doesn't exist", device_name, axis_name);
Log::Warn("Trying to bind controller to axis %s.%s which doesn't exist", device_name, axis_name);
return;
}
}
m_axisbindings.Push(device, axisindex);
}
}
void AxisBinding::BindKey(const char* device_name, const char* key_name)
void AxisBinding::BindKey(const char* device_name, const char* key_name)
{
{
ClearBinding();
m_device = InputDevice::Get(device_name);
if (!m_device)
const InputDevice* device = InputDevice::Get(device_name);
if (!device)
{
{
Log::Warn("Trying to bind controller to device %s which doesn't exist", device_name);
Log::Warn("Trying to bind controller to device %s which doesn't exist", device_name);
return;
return;
}
}
m_maxkeyindex = m_device->GetKeyIndex(key_name);
if (m_maxkeyindex < 0)
int keyindex = device->GetKeyIndex(key_name);
if (keyindex < 0)
{
{
Log::Warn("Trying to bind controller to key %s.%s which doesn't exist", device_name, key_name);
Log::Warn("Trying to bind controller to key %s.%s which doesn't exist", device_name, key_name);
return;
}
}
m_keybindings.Push(device, -1, keyindex);
}
}
void AxisBinding::BindKeys(const char* device_name, const char* min_key_name, const char* max_key_name)
void AxisBinding::BindKeys(const char* device_name, const char* min_key_name, const char* max_key_name)
{
{
ClearBinding();
m_device = InputDevice::Get(device_name);
if (!m_device)
const InputDevice* device = InputDevice::Get(device_name);
if (!device)
{
{
Log::Warn("Trying to bind controller to device %s which doesn't exist", device_name);
Log::Warn("Trying to bind controller to device %s which doesn't exist", device_name);
return;
return;
}
}
m_minkeyindex = m_device->GetKeyIndex(min_key_name);
m_maxkeyindex = m_device->GetKeyIndex(max_key_name);
if (m_minkeyindex < 0)
int minkeyindex = device->GetKeyIndex(min_key_name);
if (minkeyindex < 0)
{
{
Log::Warn("Trying to bind controller to key %s.%s which doesn't exist", device_name, min_key_name);
Log::Warn("Trying to bind controller to key %s.%s which doesn't exist", device_name, min_key_name);
ClearBinding() ;
return ;
}
}
if (m_maxkeyindex < 0)
int maxkeyindex = device->GetKeyIndex(max_key_name);
if (maxkeyindex < 0)
{
{
Log::Warn("Trying to bind controller to key %s.%s which doesn't exist", device_name, max_key_name);
Log::Warn("Trying to bind controller to key %s.%s which doesn't exist", device_name, max_key_name);
ClearBinding() ;
return ;
}
}
m_keybindings.Push(device, minkeyindex, maxkeyindex);
}
}
void AxisBinding::ClearBinding( )
bool AxisBinding::Unbind(const char* device_name, const char* axis_name )
{
{
m_axisindex = -1;
m_minkeyindex = -1;
m_maxkeyindex = -1;
for (int i = 0; i < m_keybindings.Count(); ++i)
{
if (m_axisbindings[i].m1->GetName() == device_name)
{
if (m_axisbindings[i].m2 == m_axisbindings[i].m1->GetAxisIndex(axis_name))
{
m_axisbindings.Remove(i);
return true;
}
}
}
return false;
}
bool AxisBinding::UnbindKey(const char* device_name, const char* key_name)
{
for (int i = 0; i < m_keybindings.Count(); ++i)
{
if (m_keybindings[i].m1->GetName() == device_name)
{
if (m_keybindings[i].m2 == -1 && m_keybindings[i].m3 == m_keybindings[i].m1->GetKeyIndex(key_name))
{
m_keybindings.Remove(i);
return true;
}
}
}
return false;
}
bool AxisBinding::UnbindKeys(const char* device_name, const char* min_key_name, const char* max_key_name)
{
for (int i = 0; i < m_keybindings.Count(); ++i)
{
if (m_keybindings[i].m1->GetName() == device_name)
{
if (m_keybindings[i].m2 == m_keybindings[i].m1->GetKeyIndex(min_key_name)
&& m_keybindings[i].m3 == m_keybindings[i].m1->GetKeyIndex(max_key_name))
{
m_keybindings.Remove(i);
return true;
}
}
}
return false;
}
void AxisBinding::ClearBindings()
{
m_axisbindings.Empty();
m_keybindings.Empty();
}
}
float AxisBinding::RetrieveCurrentValue()
float AxisBinding::RetrieveCurrentValue()
{
{
if (m_axisindex != -1)
float max_positive = 0.0f;
float max_negative = 0.0f;
for (int i = 0; i < m_axisbindings.Count(); ++i)
{
{
return m_device->GetAxis(m_axisindex);
float value = m_axisbindings[i].m1->GetAxis(m_axisbindings[i].m2);
if (value > max_positive)
max_positive = value;
if (value < max_negative)
max_negative = value;
}
}
float value = 0.0f;
if (m_minkeyindex != -1)
value += m_device->GetKey(m_minkeyindex) ? -1.0f : 0.0f;
if (m_maxkeyindex != -1)
value += m_device->GetKey(m_maxkeyindex) ? 1.0f : 0.0f;
for (int i = 0; i < m_keybindings.Count(); ++i)
{
float value = 0.0f;
m_keybindings[i].m1->GetKey(m_keybindings[i].m2);
value += m_keybindings[i].m1->GetKey(m_keybindings[i].m3) ? 1.0f : 0.0f;
if (m_keybindings[i].m2 != -1)
value += m_keybindings[i].m1->GetKey(m_keybindings[i].m2) ? -1.0f : 0.0f;
if (value > max_positive)
max_positive = value;
if (value < max_negative)
max_negative = value;
}
return value;
return max_negative + max_positiv e;
}
}
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////