Bläddra i källkod

win32: add an Xinput class for Xbox360 controllers, because they're not

properly detected using the generic SDL driver.
legacy
Sam Hocevar sam 12 år sedan
förälder
incheckning
70f992bb36
8 ändrade filer med 179 tillägg och 10 borttagningar
  1. +4
    -0
      src/Makefile.am
  2. +102
    -0
      src/platform/d3d9/d3d9input.cpp
  3. +43
    -0
      src/platform/d3d9/d3d9input.h
  4. +8
    -0
      src/platform/sdl/sdlapp.cpp
  5. +7
    -6
      src/platform/sdl/sdlinput.cpp
  6. +2
    -2
      win32/Lol.Vars.props
  7. +3
    -1
      win32/lolcore.vcxproj
  8. +10
    -1
      win32/lolcore.vcxproj.filters

+ 4
- 0
src/Makefile.am Visa fil

@@ -22,6 +22,7 @@ liblol_a_SOURCES = \
$(xbox_sources) \
$(nacl_sources) \
$(sdl_sources) \
$(d3d9_sources) \
$(android_sources) \
\
thread/threadbase.h thread/thread.h \
@@ -51,6 +52,9 @@ sdl_sources = \
platform/sdl/sdlapp.cpp platform/sdl/sdlapp.h \
platform/sdl/sdlinput.cpp platform/sdl/sdlinput.h

d3d9_sources = \
platform/xbox/xboxinput.cpp platform/xbox/xboxinput.h

if USE_NACL
nacl_sources = \
platform/nacl/naclapp.cpp platform/nacl/naclapp.h \


+ 102
- 0
src/platform/d3d9/d3d9input.cpp Visa fil

@@ -0,0 +1,102 @@
//
// Lol Engine
//
// Copyright: (c) 2010-2012 Sam Hocevar <sam@hocevar.net>
// This program is free software; you can redistribute it and/or
// modify it under the terms of the Do What The Fuck You Want To
// Public License, Version 2, as published by Sam Hocevar. See
// http://sam.zoy.org/projects/COPYING.WTFPL for more details.
//

#if defined HAVE_CONFIG_H
# include "config.h"
#endif

#if defined USE_D3D9
# include <d3d9.h>
# include <xinput.h>
#endif

#include "core.h"
#include "d3d9input.h"

namespace lol
{

/*
* D3d9 Input implementation class
*/

class D3d9InputData
{
friend class D3d9Input;

private:
#if defined USE_D3D9
Array<int, Stick *> m_joysticks;
#endif
};

/*
* Public D3d9Input class
*/

D3d9Input::D3d9Input()
: m_data(new D3d9InputData())
{
#if defined USE_D3D9
for (int i = 0; i < XUSER_MAX_COUNT; i++)
{
XINPUT_STATE state;
if (XInputGetState(i, &state) != ERROR_SUCCESS)
continue;

Stick *stick = Input::CreateStick();
stick->SetAxisCount(4);
stick->SetButtonCount(0);
m_data->m_joysticks.Push(i, stick);
}
#endif

m_gamegroup = GAMEGROUP_BEFORE;
}

D3d9Input::~D3d9Input()
{
#if defined USE_D3D9
/* Unregister all the joysticks we added */
while (m_data->m_joysticks.Count())
{
Input::DestroyStick(m_data->m_joysticks[0].m2);
m_data->m_joysticks.Remove(0);
}
#endif
delete m_data;
}

void D3d9Input::TickGame(float seconds)
{
Entity::TickGame(seconds);
}

void D3d9Input::TickDraw(float seconds)
{
Entity::TickDraw(seconds);

#if defined USE_D3D9
for (int i = 0; i < m_data->m_joysticks.Count(); i++)
{
XINPUT_STATE state;
if (XInputGetState(m_data->m_joysticks[i].m1, &state) != ERROR_SUCCESS)
continue;

m_data->m_joysticks[i].m2->SetAxis(0, (float)state.Gamepad.sThumbLX / 32768.f);
m_data->m_joysticks[i].m2->SetAxis(1, -(float)state.Gamepad.sThumbLY / 32768.f);
m_data->m_joysticks[i].m2->SetAxis(2, (float)state.Gamepad.sThumbRX / 32768.f);
m_data->m_joysticks[i].m2->SetAxis(3, -(float)state.Gamepad.sThumbRY / 32768.f);
}
#endif
}

} /* namespace lol */


+ 43
- 0
src/platform/d3d9/d3d9input.h Visa fil

@@ -0,0 +1,43 @@
//
// Lol Engine
//
// Copyright: (c) 2010-2012 Sam Hocevar <sam@hocevar.net>
// This program is free software; you can redistribute it and/or
// modify it under the terms of the Do What The Fuck You Want To
// Public License, Version 2, as published by Sam Hocevar. See
// http://sam.zoy.org/projects/COPYING.WTFPL for more details.
//

//
// The D3d9Input class
// -------------------
//

#if !defined __LOL_D3D9INPUT_H__
#define __LOL_D3D9INPUT_H__

#include "entity.h"

namespace lol
{

class D3d9InputData;

class D3d9Input : public Entity
{
public:
D3d9Input();
virtual ~D3d9Input();

protected:
virtual void TickGame(float seconds);
virtual void TickDraw(float seconds);

private:
D3d9InputData *m_data;
};

} /* namespace lol */

#endif // __LOL_D3D9INPUT_H__


+ 8
- 0
src/platform/sdl/sdlapp.cpp Visa fil

@@ -24,6 +24,9 @@
#include "lolgl.h"
#include "platform/sdl/sdlapp.h"
#include "platform/sdl/sdlinput.h"
#if defined USE_D3D9
# include "platform/d3d9/d3d9input.h"
#endif

#if defined USE_SDL && defined USE_D3D9
HWND g_hwnd = NULL;
@@ -86,6 +89,11 @@ SdlApp::SdlApp(char const *title, ivec2 res, float fps) :
Audio::Setup(2);

/* Autoreleased objects */
# if defined USE_D3D9
/* Prefer D3d9 for joysticks on Windows, because the X360 pads are not
* advertised with the proper number of axes. */
new D3d9Input();
# endif
new SdlInput();
#endif
}


+ 7
- 6
src/platform/sdl/sdlinput.cpp Visa fil

@@ -58,7 +58,11 @@ SdlInput::SdlInput()

/* Blacklist HDAPS, it's not a real joystick */
char const *name = SDL_JoystickName(i);
if (strstr(name, "HDAPS"))
if (strstr(name, "HDAPS")
# if !defined USE_D3D9
|| strstr(name, "XBOX 360 For Windows")
# endif
|| true)
{
SDL_JoystickClose(sdlstick);
continue;
@@ -69,11 +73,8 @@ SdlInput::SdlInput()
stick->SetButtonCount(SDL_JoystickNumButtons(sdlstick));

/* It's possible to remap axes */
if (strstr(name, "XBOX 360 For Windows"))
{
//stick->RemapAxis(4, 2);
//stick->RemapAxis(2, 4);
}
//stick->RemapAxis(4, 2);
//stick->RemapAxis(2, 4);

m_data->m_joysticks.Push(sdlstick, stick);
}


+ 2
- 2
win32/Lol.Vars.props Visa fil

@@ -35,8 +35,8 @@
<D3d9Includes>$(DXSDK_DIR)\Include</D3d9Includes>
<D3d9Libs Condition="'$(Platform)'=='Win32'">$(DXSDK_DIR)\Lib\x86</D3d9Libs>
<D3d9Libs Condition="'$(Platform)'=='x64'">$(DXSDK_DIR)\Lib\x64</D3d9Libs>
<D3d9Deps Condition="'$(Configuration)'=='Release'">d3d9.lib;d3dx9.lib</D3d9Deps>
<D3d9Deps Condition="'$(Configuration)'=='Debug'">d3d9.lib;d3dx9d.lib</D3d9Deps>
<D3d9Deps Condition="'$(Configuration)'=='Release'">d3d9.lib;d3dx9.lib;xinput.lib</D3d9Deps>
<D3d9Deps Condition="'$(Configuration)'=='Debug'">d3d9.lib;d3dx9d.lib;xinput.lib</D3d9Deps>
<Win32Defines>HAVE_SDL_H;USE_SDL;USE_GDIPLUS;USE_D3D9</Win32Defines>
<XboxDefines></XboxDefines>


+ 3
- 1
win32/lolcore.vcxproj Visa fil

@@ -108,6 +108,7 @@
<ClCompile Include="..\src\math\trig.cpp" />
<ClCompile Include="..\src\math\vector.cpp" />
<ClCompile Include="..\src\platform.cpp" />
<ClCompile Include="..\src\platform\d3d9\d3d9input.cpp" />
<ClCompile Include="..\src\platform\sdl\sdlapp.cpp" />
<ClCompile Include="..\src\platform\sdl\sdlinput.cpp" />
<ClCompile Include="..\src\platform\xbox\xboxapp.cpp" />
@@ -167,6 +168,7 @@
<ClInclude Include="..\src\math\trig.h" />
<ClInclude Include="..\src\numeric.h" />
<ClInclude Include="..\src\platform.h" />
<ClInclude Include="..\src\platform\d3d9\d3d9input.h" />
<ClInclude Include="..\src\platform\sdl\sdlapp.h" />
<ClInclude Include="..\src\platform\sdl\sdlinput.h" />
<ClInclude Include="..\src\platform\xbox\xboxapp.h" />
@@ -191,4 +193,4 @@
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
</ImportGroup>
</Project>
</Project>

+ 10
- 1
win32/lolcore.vcxproj.filters Visa fil

@@ -44,6 +44,9 @@
<Filter Include="src\input">
<UniqueIdentifier>{94992c0e-ebc5-4185-b766-323b06547dcf}</UniqueIdentifier>
</Filter>
<Filter Include="src\platform\d3d9">
<UniqueIdentifier>{a914e15d-3201-467a-a9c9-d7c5244b13ee}</UniqueIdentifier>
</Filter>
</ItemGroup>
<ItemGroup>
<ClCompile Include="..\src\image\image.cpp">
@@ -205,6 +208,9 @@
<ClCompile Include="..\src\input\stick.cpp">
<Filter>src\input</Filter>
</ClCompile>
<ClCompile Include="..\src\platform\d3d9\d3d9input.cpp">
<Filter>src\platform\d3d9</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="..\src\image\image.h">
@@ -387,5 +393,8 @@
<ClInclude Include="..\src\input\stick.h">
<Filter>src\input</Filter>
</ClInclude>
<ClInclude Include="..\src\platform\d3d9\d3d9input.h">
<Filter>src\platform\d3d9</Filter>
</ClInclude>
</ItemGroup>
</Project>
</Project>

Laddar…
Avbryt
Spara