[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Pingus-CVS] r3049 - trunk/pingus/src/input2
From: |
grumbel at BerliOS |
Subject: |
[Pingus-CVS] r3049 - trunk/pingus/src/input2 |
Date: |
Sat, 1 Sep 2007 19:44:01 +0200 |
Author: grumbel
Date: 2007-09-01 19:43:59 +0200 (Sat, 01 Sep 2007)
New Revision: 3049
Modified:
trunk/pingus/src/input2/SConstruct
trunk/pingus/src/input2/control.hpp
trunk/pingus/src/input2/controller.hpp
trunk/pingus/src/input2/controller_description.cpp
trunk/pingus/src/input2/controller_description.hpp
trunk/pingus/src/input2/event.hpp
trunk/pingus/src/input2/main.cpp
trunk/pingus/src/input2/manager.cpp
trunk/pingus/src/input2/manager.hpp
trunk/pingus/src/input2/sdl_driver.cpp
trunk/pingus/src/input2/sdl_driver.hpp
Log:
- pointer, scroller, buttons and axis working
Modified: trunk/pingus/src/input2/SConstruct
===================================================================
--- trunk/pingus/src/input2/SConstruct 2007-09-01 03:58:03 UTC (rev 3048)
+++ trunk/pingus/src/input2/SConstruct 2007-09-01 17:43:59 UTC (rev 3049)
@@ -1,6 +1,6 @@
## -*- python -*-
-env = Environment(CCFLAGS = ['-O2', '-Wall', '-Werror', '-g'],
+env = Environment(CCFLAGS = ['-O0', '-Wall', '-Werror', '-g'],
CPPPATH = ['..', '../..'])
env.ParseConfig('sdl-config --cflags --libs')
Modified: trunk/pingus/src/input2/control.hpp
===================================================================
--- trunk/pingus/src/input2/control.hpp 2007-09-01 03:58:03 UTC (rev 3048)
+++ trunk/pingus/src/input2/control.hpp 2007-09-01 17:43:59 UTC (rev 3049)
@@ -55,8 +55,8 @@
}
}
- virtual void update(Control* ctrl)
- {
+ virtual void update(Control* ctrl) {
+ std::cout << "Warning: Control:update() not handled" << std::endl;
}
};
@@ -128,7 +128,7 @@
{}
virtual void notify_parent() {
- std::cout << "Button " << id << " was " << (state == BUTTON_PRESSED
+ std::cout << "ControlButton: id=" << id << " was " << (state ==
BUTTON_PRESSED
? "pressed" : "released") <<
std::endl;
}
};
@@ -157,7 +157,7 @@
class Pointer : public Control
{
-private:
+protected:
Vector2f pos;
public:
@@ -165,6 +165,8 @@
: Control(parent)
{}
+ Vector2f get_pos() const { return pos; }
+
void set_pos(const Vector2f& new_pos) {
if (pos != new_pos)
{
@@ -176,7 +178,7 @@
class Scroller : public Control
{
-private:
+protected:
Vector2f delta;
public:
@@ -185,6 +187,8 @@
delta(0.0f, 0.0f)
{}
+ Vector2f get_delta() const { return delta; }
+
void set_delta(const Vector2f& new_delta) {
if (delta != new_delta)
{
@@ -203,9 +207,13 @@
: Axis(parent)
{}
+ void add_axis(Axis* axis) {
+ axes.push_back(axis);
+ }
+
void update(Control* ctrl)
{
- float new_pos;
+ float new_pos = 0;
for(std::vector<Axis*>::iterator i = axes.begin(); i != axes.end(); ++i)
{
@@ -222,6 +230,22 @@
}
};
+class ControllerAxis : public AxisGroup
+{
+private:
+ int id;
+
+public:
+ ControllerAxis(int id_)
+ : AxisGroup(0),
+ id(id_)
+ {}
+
+ virtual void notify_parent() {
+ std::cout << "ControlAxis moved id=" << id << " " << pos << std::endl;
+ }
+};
+
class PointerGroup : public Pointer
{
private:
@@ -231,8 +255,39 @@
PointerGroup(Control* parent)
: Pointer(parent)
{}
+
+ void update(Control* p) {
+ Pointer* pointer = dynamic_cast<Pointer*>(p);
+ assert(pointer);
+ Vector2f new_pos = pointer->get_pos();
+ if (new_pos != pos)
+ {
+ pos = new_pos;
+ notify_parent();
+ }
+ }
+
+ void add_pointer(Pointer* p) {
+ pointer.push_back(p);
+ }
};
+class ControllerPointer : public PointerGroup
+{
+private:
+ int id;
+
+public:
+ ControllerPointer(int id_)
+ : PointerGroup(0),
+ id(id_)
+ {}
+
+ virtual void notify_parent() {
+ std::cout << "ControlPointer moved id=" << id << " " << pos.x << ", " <<
pos.y << std::endl;
+ }
+};
+
class ScrollerGroup : public Scroller
{
private:
@@ -242,8 +297,34 @@
ScrollerGroup(Control* parent)
: Scroller(parent)
{}
+
+ void update(Control* p) {
+ Scroller* scroller = dynamic_cast<Scroller*>(p);
+ assert(scroller);
+ delta = scroller->get_delta();
+ notify_parent();
+ }
+
+ void add_scroller(Scroller* p) {
+ scrollers.push_back(p);
+ }
};
+class ControllerScroller : public ScrollerGroup
+{
+private:
+ int id;
+public:
+ ControllerScroller(int id_)
+ : ScrollerGroup(0),
+ id(id_)
+ {}
+
+ virtual void notify_parent() {
+ std::cout << "ControlScroller: moved id=" << id << " " << delta.x << ", "
<< delta.y << std::endl;
+ }
+};
+
} // namespace Input
#endif
Modified: trunk/pingus/src/input2/controller.hpp
===================================================================
--- trunk/pingus/src/input2/controller.hpp 2007-09-01 03:58:03 UTC (rev
3048)
+++ trunk/pingus/src/input2/controller.hpp 2007-09-01 17:43:59 UTC (rev
3049)
@@ -1,7 +1,7 @@
// $Id$
//
// Pingus - A free Lemmings clone
-// Copyright (C) 2000 Ingo Ruhnke <address@hidden>
+// Copyright (C) 2007 Ingo Ruhnke <address@hidden>
//
// This program is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License
@@ -22,6 +22,7 @@
#include <assert.h>
#include "control.hpp"
+#include "controller_description.hpp"
#include "event.hpp"
namespace Input {
@@ -31,9 +32,9 @@
private:
// State Stuff
std::vector<ControllerButton*> buttons;
- std::vector<Axis*> axis;
- std::vector<Pointer*> pointer;
- std::vector<Scroller*> scroller;
+ std::vector<ControllerAxis*> axes;
+ std::vector<ControllerPointer*> pointers;
+ std::vector<ControllerScroller*> scrollers;
public:
// Events
@@ -41,14 +42,55 @@
Controller() {}
~Controller() {}
+
+ ControllerScroller* get_scroller(int id) {
+ if (id >= 0 && id < int(scrollers.size()))
+ return scrollers[id];
+ else
+ return 0;
+ }
- ControllerButton* get_button(int id) {
- if (id >= 0 && id < int(buttons.size()))
- return buttons[id];
+ void add_scroller(int id, ControllerScroller* scroller) {
+ if (int(scrollers.size())-1 < id)
+ scrollers.resize(id+1);
+
+ assert(scrollers[id] == 0);
+ scrollers[id] = scroller;
+ }
+
+ ControllerPointer* get_pointer(int id) {
+ if (id >= 0 && id < int(pointers.size()))
+ return pointers[id];
else
return 0;
}
+ void add_pointer(int id, ControllerPointer* pointer) {
+ if (int(pointers.size())-1 < id)
+ pointers.resize(id+1);
+
+ assert(pointers[id] == 0);
+ pointers[id] = pointer;
+ }
+
+ ControllerAxis* get_axis(int id) {
+ assert(id >= 0 && id < int(axes.size()));
+ return axes[id];
+ }
+
+ void add_axis(int id, ControllerAxis* axis) {
+ if (int(axes.size())-1 < id)
+ axes.resize(id+1);
+
+ assert(axes[id] == 0);
+ axes[id] = axis;
+ }
+
+ ControllerButton* get_button(int id) {
+ assert(id >= 0 && id < int(buttons.size()));
+ return buttons[id];
+ }
+
void add_button(int id, ControllerButton* button) {
if (int(buttons.size())-1 < id)
buttons.resize(id+1);
@@ -57,6 +99,33 @@
buttons[id] = button;
}
+ void load(ControllerDescription desc)
+ {
+ const std::vector<int>& button_lst = desc.get_buttons();
+ for(std::vector<int>::const_iterator i = button_lst.begin(); i !=
button_lst.end(); ++i)
+ {
+ add_button(*i, new ControllerButton(*i));
+ }
+
+ const std::vector<int>& axis_lst = desc.get_axes();
+ for(std::vector<int>::const_iterator i = axis_lst.begin(); i !=
axis_lst.end(); ++i)
+ {
+ add_axis(*i, new ControllerAxis(*i));
+ }
+
+ const std::vector<int>& pointer_lst = desc.get_pointers();
+ for(std::vector<int>::const_iterator i = pointer_lst.begin(); i !=
pointer_lst.end(); ++i)
+ {
+ add_pointer(*i, new ControllerPointer(*i));
+ }
+
+ const std::vector<int>& scroller_lst = desc.get_scrollers();
+ for(std::vector<int>::const_iterator i = scroller_lst.begin(); i !=
scroller_lst.end(); ++i)
+ {
+ add_scroller(*i, new ControllerScroller(*i));
+ }
+ }
+
private:
Controller(const Controller&);
Controller& operator= (const Controller&);
Modified: trunk/pingus/src/input2/controller_description.cpp
===================================================================
--- trunk/pingus/src/input2/controller_description.cpp 2007-09-01 03:58:03 UTC
(rev 3048)
+++ trunk/pingus/src/input2/controller_description.cpp 2007-09-01 17:43:59 UTC
(rev 3049)
@@ -110,6 +110,43 @@
}
+static std::vector<int> map2vector(const std::map<int, InputEventDefinition>&
map,
+ EventType type)
+{
+ std::vector<int> lst;
+ for(std::map<int, InputEventDefinition>::const_iterator i = map.begin();
+ i != map.end(); ++i)
+ {
+ if (i->second.type == type)
+ lst.push_back(i->second.id);
+ }
+ return lst;
+}
+
+std::vector<int>
+ControllerDescription::get_buttons() const
+{
+ return map2vector(id_to_event, BUTTON_EVENT_TYPE);
+}
+
+std::vector<int>
+ControllerDescription::get_axes() const
+{
+ return map2vector(id_to_event, AXIS_EVENT_TYPE);
+}
+
+std::vector<int>
+ControllerDescription::get_pointers() const
+{
+ return map2vector(id_to_event, POINTER_EVENT_TYPE);
+}
+
+std::vector<int>
+ControllerDescription::get_scrollers() const
+{
+ return map2vector(id_to_event, SCROLLER_EVENT_TYPE);
+}
+
} // namespace Input
/* EOF */
Modified: trunk/pingus/src/input2/controller_description.hpp
===================================================================
--- trunk/pingus/src/input2/controller_description.hpp 2007-09-01 03:58:03 UTC
(rev 3048)
+++ trunk/pingus/src/input2/controller_description.hpp 2007-09-01 17:43:59 UTC
(rev 3049)
@@ -56,6 +56,11 @@
const InputEventDefinition& get_definition(int id) const;
const InputEventDefinition& get_definition(const std::string& name) const;
+
+ std::vector<int> get_buttons() const;
+ std::vector<int> get_axes() const;
+ std::vector<int> get_pointers() const;
+ std::vector<int> get_scrollers() const;
};
} // namespace Input
Modified: trunk/pingus/src/input2/event.hpp
===================================================================
--- trunk/pingus/src/input2/event.hpp 2007-09-01 03:58:03 UTC (rev 3048)
+++ trunk/pingus/src/input2/event.hpp 2007-09-01 17:43:59 UTC (rev 3049)
@@ -32,57 +32,65 @@
SCROLLER_EVENT_TYPE,
KEYBOARD_EVENT_TYPE };
-enum ButtonName { PRIMARY_BUTTON,
- SECONDARY_BUTTON,
- PAUSE_BUTTON,
- FAST_FORWARD_BUTTON,
- ARMAGEDDON_BUTTON,
- ESCAPE_BUTTON,
+enum EventName {
+ // Buttons
+ PRIMARY_BUTTON,
+ SECONDARY_BUTTON,
+ PAUSE_BUTTON,
+ FAST_FORWARD_BUTTON,
+ ARMAGEDDON_BUTTON,
+ ESCAPE_BUTTON,
- ACTION_1_BUTTON,
- ACTION_2_BUTTON,
- ACTION_3_BUTTON,
- ACTION_4_BUTTON,
- ACTION_5_BUTTON,
- ACTION_6_BUTTON,
- ACTION_7_BUTTON,
- ACTION_8_BUTTON,
- ACTION_9_BUTTON,
- ACTION_10_BUTTON,
+ ACTION_1_BUTTON,
+ ACTION_2_BUTTON,
+ ACTION_3_BUTTON,
+ ACTION_4_BUTTON,
+ ACTION_5_BUTTON,
+ ACTION_6_BUTTON,
+ ACTION_7_BUTTON,
+ ACTION_8_BUTTON,
+ ACTION_9_BUTTON,
+ ACTION_10_BUTTON,
- ACTION_UP_BUTTON,
- ACTION_DOWN_BUTTON,
+ ACTION_UP_BUTTON,
+ ACTION_DOWN_BUTTON,
+
+ // Pointer
+ STANDARD_POINTER,
+
+ // Scroller
+ STANDARD_SCROLLER,
- MAX_BUTTON };
+ // Axis
+ TEST_AXIS,
+};
enum ButtonState { BUTTON_RELEASED, BUTTON_PRESSED };
struct ButtonEvent
{
- ButtonName name;
+ EventName name;
ButtonState state;
};
-enum PointerName { standard };
struct PointerEvent
{
- PointerName name;
+ EventName name;
float x;
float y;
};
-enum AxisName { action };
-
struct AxisEvent
{
+ EventName name;
float dir;
- AxisName name;
};
struct ScrollEvent
{
+ EventName name;
float x_delta;
float y_delta;
};
@@ -107,7 +115,7 @@
typedef std::vector<Event> EventLst;
-inline Event makeButtonEvent(ButtonName name, ButtonState state)
+inline Event makeButtonEvent(EventName name, ButtonState state)
{
Event event;
@@ -118,7 +126,7 @@
return event;
}
-inline Event makePointerEvent(PointerName name, float x, float y)
+inline Event makePointerEvent(EventName name, float x, float y)
{
Event event;
@@ -130,7 +138,7 @@
return event;
}
-inline Event makeAxisEvent(float dir, AxisName name = action)
+inline Event makeAxisEvent(EventName name, float dir)
{
Event event;
@@ -141,11 +149,12 @@
return event;
}
-inline Event makeScrollEvent(float x_delta, float y_delta)
+inline Event makeScrollEvent(EventName name, float x_delta, float y_delta)
{
Event event;
event.type = SCROLLER_EVENT_TYPE;
+ event.scroll.name = name;
event.scroll.x_delta = x_delta;
event.scroll.y_delta = y_delta;
Modified: trunk/pingus/src/input2/main.cpp
===================================================================
--- trunk/pingus/src/input2/main.cpp 2007-09-01 03:58:03 UTC (rev 3048)
+++ trunk/pingus/src/input2/main.cpp 2007-09-01 17:43:59 UTC (rev 3049)
@@ -5,7 +5,7 @@
int main()
{
try {
- if(SDL_Init(SDL_INIT_VIDEO) < 0) {
+ if(SDL_Init(SDL_INIT_VIDEO | SDL_INIT_JOYSTICK) < 0) {
std::cerr << "Unable to init SDL: " << SDL_GetError() << std::endl;
exit(1);
}
Modified: trunk/pingus/src/input2/manager.cpp
===================================================================
--- trunk/pingus/src/input2/manager.cpp 2007-09-01 03:58:03 UTC (rev 3048)
+++ trunk/pingus/src/input2/manager.cpp 2007-09-01 17:43:59 UTC (rev 3049)
@@ -30,6 +30,11 @@
Manager::Manager()
{
+ desc.add_axis("test-axis", TEST_AXIS);
+
+ desc.add_pointer("standard-pointer", STANDARD_POINTER);
+ desc.add_scroller("standard-scroller", STANDARD_SCROLLER);
+
desc.add_button("primary-button", PRIMARY_BUTTON);
desc.add_button("secondary-button", SECONDARY_BUTTON);
desc.add_button("fast-forward-button", FAST_FORWARD_BUTTON);
@@ -79,6 +84,8 @@
void
Manager::load(const std::string& filename)
{
+ controller.load(desc);
+
FileReader reader = FileReader::parse(filename);
if (reader.get_name() != "pingus-controller")
@@ -93,51 +100,61 @@
{
if (StringUtil::has_suffix(i->get_name(), "pointer"))
{
- std::cout << "Pointer: '" << i->get_name() << "'" << std::endl;
+ const std::vector<FileReader>& pointers = i->get_sections();
+ for(std::vector<FileReader>::const_iterator j =
pointers.begin(); j != pointers.end(); ++j)
+ {
+ int id = desc.get_definition(i->get_name()).id;
+ ControllerPointer* ctrl_pointer = controller.get_pointer(id);
+ Pointer* pointer = create_pointer(*j, ctrl_pointer);
+ if (pointer)
+ ctrl_pointer->add_pointer(pointer);
+ else
+ std::cout << "Manager: pointer: Couldn't create pointer"
<< j->get_name() << std::endl;
+ }
+
}
else if (StringUtil::has_suffix(i->get_name(), "scroller"))
{
- std::cout << "Scroller: '" << i->get_name() << "'" << std::endl;
+ const std::vector<FileReader>& scrollers = i->get_sections();
+ for(std::vector<FileReader>::const_iterator j =
scrollers.begin(); j != scrollers.end(); ++j)
+ {
+ int id = desc.get_definition(i->get_name()).id;
+ ControllerScroller* ctrl_scroller =
controller.get_scroller(id);
+ Scroller* scroller = create_scroller(*j, ctrl_scroller);
+ if (scroller)
+ ctrl_scroller->add_scroller(scroller);
+ else
+ std::cout << "Manager: scroller: Couldn't create scroller"
<< j->get_name() << std::endl;
+ }
+
}
else if (StringUtil::has_suffix(i->get_name(), "button"))
{
const std::vector<FileReader>& buttons = i->get_sections();
for(std::vector<FileReader>::const_iterator j = buttons.begin();
j != buttons.end(); ++j)
{
- std::string driver = get_driver_part(j->get_name());
-
- Driver* drv = load_driver(driver);
- if (drv)
- {
- int id = desc.get_definition(i->get_name()).id;
- ControllerButton* ctrl_button =
controller.get_button(id);
- if (!ctrl_button)
- {
- ctrl_button = new ControllerButton(id);
- controller.add_button(id, ctrl_button);
- }
-
- Button* button = drv->create_button(*j, ctrl_button);
- if (!button)
- {
- std::cout << "Driver '" << driver << "' couldn't
create button '"
- << i->get_name() << "' => '"
- << j->get_name() << "'" << std::endl;
- }
- else
- {
- ctrl_button->add_button(button);
- }
- }
+ int id = desc.get_definition(i->get_name()).id;
+ ControllerButton* ctrl_button = controller.get_button(id);
+ Button* button = create_button(*j, ctrl_button);
+ if (button)
+ ctrl_button->add_button(button);
else
- {
- std::cout << "Manager: Error: Couldn't find driver: '"
<< driver << "'" << std::endl;
- }
+ std::cout << "Manager: button: Couldn't create button" <<
j->get_name() << std::endl;
}
}
else if (StringUtil::has_suffix(i->get_name(), "axis"))
{
- std::cout << "Axis: '" << i->get_name() << "'" << std::endl;
+ const std::vector<FileReader>& axes = i->get_sections();
+ for(std::vector<FileReader>::const_iterator j = axes.begin(); j
!= axes.end(); ++j)
+ {
+ int id = desc.get_definition(i->get_name()).id;
+ ControllerAxis* ctrl_axis = controller.get_axis(id);
+ Axis* axis = create_axis(*j, ctrl_axis);
+ if (axis)
+ ctrl_axis->add_axis(axis);
+ else
+ std::cout << "Manager: axis: Couldn't create axis" <<
j->get_name() << std::endl;
+ }
}
else
{
@@ -197,6 +214,74 @@
}
}
+Button*
+Manager::create_button(const FileReader& reader, Button* parent)
+{
+ std::string driver = get_driver_part(reader.get_name());
+
+ Driver* drv = load_driver(driver);
+ if (drv)
+ {
+ return drv->create_button(reader, parent);
+ }
+ else
+ {
+ std::cout << "Manager: Error: Couldn't find driver: '" << driver << "'"
<< std::endl;
+ return 0;
+ }
+}
+
+Axis*
+Manager::create_axis(const FileReader& reader, Axis* parent)
+{
+ std::string driver = get_driver_part(reader.get_name());
+
+ Driver* drv = load_driver(driver);
+ if (drv)
+ {
+ return drv->create_axis(reader, parent);
+ }
+ else
+ {
+ std::cout << "Manager: Error: Couldn't find driver: '" << driver << "'"
<< std::endl;
+ return 0;
+ }
+}
+
+Pointer*
+Manager::create_pointer(const FileReader& reader, Pointer* parent)
+{
+ std::string driver = get_driver_part(reader.get_name());
+
+ Driver* drv = load_driver(driver);
+ if (drv)
+ {
+ return drv->create_pointer(reader, parent);
+ }
+ else
+ {
+ std::cout << "Manager: Error: Couldn't find driver: '" << driver << "'"
<< std::endl;
+ return 0;
+ }
+}
+
+Scroller*
+Manager::create_scroller(const FileReader& reader, Scroller* parent)
+{
+ std::string driver = get_driver_part(reader.get_name());
+
+ Driver* drv = load_driver(driver);
+ if (drv)
+ {
+ return drv->create_scroller(reader, parent);
+ }
+ else
+ {
+ std::cout << "Manager: Error: Couldn't find driver: '" << driver << "'"
<< std::endl;
+ return 0;
+ }
+}
+
} // namespace Input
/* EOF */
Modified: trunk/pingus/src/input2/manager.hpp
===================================================================
--- trunk/pingus/src/input2/manager.hpp 2007-09-01 03:58:03 UTC (rev 3048)
+++ trunk/pingus/src/input2/manager.hpp 2007-09-01 17:43:59 UTC (rev 3049)
@@ -43,6 +43,12 @@
Driver* load_driver(const std::string& name);
Driver* get_driver(const std::string& name);
+
+private:
+ Button* create_button (const FileReader& reader, Button* parent);
+ Axis* create_axis (const FileReader& reader, Axis* parent);
+ Pointer* create_pointer (const FileReader& reader, Pointer* parent);
+ Scroller* create_scroller(const FileReader& reader, Scroller* parent);
};
} // namespace Input
Modified: trunk/pingus/src/input2/sdl_driver.cpp
===================================================================
--- trunk/pingus/src/input2/sdl_driver.cpp 2007-09-01 03:58:03 UTC (rev
3048)
+++ trunk/pingus/src/input2/sdl_driver.cpp 2007-09-01 17:43:59 UTC (rev
3049)
@@ -35,19 +35,43 @@
}
}
+SDLDriver::~SDLDriver()
+{
+
+}
+
Button*
SDLDriver::create_button(const FileReader& reader, Control* parent)
{
//std::cout << "SDL: " << reader.get_name() << std::endl;
if (reader.get_name() == "sdl:joystick-button")
{
- return 0;
+ JoystickButtonBinding binding;
+
+ reader.read_int("device", binding.device);
+ reader.read_int("button", binding.button);
+
+ if (open_joystick(binding.device))
+ {
+ binding.binding = new Button(parent);
+ joystick_button_bindings.push_back(binding);
+
+ return binding.binding;
+ }
+ else
+ {
+ return 0;
+ }
}
else if (reader.get_name() == "sdl:mouse-button")
{
- //MouseButtonBinding binding;
- //reader.read_int("button", binding.button);
- return 0;
+ MouseButtonBinding binding;
+
+ reader.read_int("button", binding.button);
+ binding.binding = new Button(parent);
+ mouse_button_bindings.push_back(binding);
+
+ return binding.binding;
}
else if (reader.get_name() == "sdl:keyboard-button")
{
@@ -61,7 +85,6 @@
binding.key = i->second;
binding.binding = new Button(parent);
-
keyboard_button_bindings.push_back(binding);
return binding.binding;
@@ -71,7 +94,7 @@
std::cout << "SDLDriver: Couldn't find keysym for key '" << key
<< "'" << std::endl;
return 0;
}
- }
+ }
else
{
std::cout << "SDLDriver: 'key' missing" << std::endl;
@@ -87,27 +110,94 @@
Axis*
SDLDriver::create_axis(const FileReader& reader, Control* parent)
{
- return 0;
+ if (reader.get_name() == "sdl:joystick-axis")
+ {
+ JoystickAxisBinding binding;
+
+ reader.read_int("device", binding.device);
+ reader.read_int("axis", binding.axis);
+
+ if (open_joystick(binding.device))
+ {
+ binding.binding = new Axis(parent);
+ joystick_axis_bindings.push_back(binding);
+
+ return binding.binding;
+ }
+ else
+ {
+ return 0;
+ }
+ }
+ else
+ {
+ return 0;
+ }
}
Scroller*
SDLDriver::create_scroller(const FileReader& reader, Control* parent)
{
- return 0;
+ if (reader.get_name() == "sdl:mouse-scroller")
+ {
+ ScrollerBinding binding;
+
+ binding.binding = new Scroller(parent);
+ scroller_bindings.push_back(binding);
+
+ return binding.binding;
+ }
+ else
+ {
+ return 0;
+ }
}
Pointer*
SDLDriver::create_pointer(const FileReader& reader, Control* parent)
{
- return 0;
+ if (reader.get_name() == "sdl:mouse-pointer")
+ {
+ PointerBinding binding;
+
+ binding.binding = new Pointer(parent);
+ pointer_bindings.push_back(binding);
+
+ return binding.binding;
+ }
+ else
+ {
+ return 0;
+ }
}
+bool
+SDLDriver::open_joystick(int device)
+{
+ JoystickHandles::iterator i = joystick_handles.find(device);
+ if (i == joystick_handles.end())
+ {
+ SDL_Joystick* joy = SDL_JoystickOpen(device);
+ if (joy)
+ {
+ joystick_handles[device] = joy;
+ return true;
+ }
+ else
+ {
+ std::cout << "SDLDriver: Couldn't open joystick number " << device
<< std::endl;
+ return false;
+ }
+ }
+ else
+ {
+ return true;
+ }
+}
+
void
SDLDriver::update(float delta)
{
- //std::cout << "SDLEvent fetching" << std::endl;
-
- // Let SDL fetch events
SDL_Event event;
while (SDL_PollEvent(&event))
{
@@ -123,6 +213,12 @@
{
i->binding->set_pos(Vector2f(event.motion.x, event.motion.y));
}
+
+ for(std::vector<ScrollerBinding>::iterator i =
scroller_bindings.begin();
+ i != scroller_bindings.end(); ++i)
+ {
+ i->binding->set_delta(Vector2f(event.motion.xrel,
event.motion.yrel));
+ }
break;
case SDL_MOUSEBUTTONDOWN:
@@ -161,7 +257,7 @@
{
if (event.jaxis.which == i->device &&
event.jaxis.axis == i->axis)
- i->binding->set_state(event.jaxis.value);
+ i->binding->set_state(event.jaxis.value / 32767.0);
}
break;
Modified: trunk/pingus/src/input2/sdl_driver.hpp
===================================================================
--- trunk/pingus/src/input2/sdl_driver.hpp 2007-09-01 03:58:03 UTC (rev
3048)
+++ trunk/pingus/src/input2/sdl_driver.hpp 2007-09-01 17:43:59 UTC (rev
3049)
@@ -64,10 +64,15 @@
SDLKey key;
};
+ struct ScrollerBinding {
+ Scroller* binding;
+ };
+
struct PointerBinding {
Pointer* binding;
};
+ std::vector<ScrollerBinding> scroller_bindings;
std::vector<PointerBinding> pointer_bindings;
std::vector<KeyboardButtonBinding> keyboard_button_bindings;
std::vector<MouseButtonBinding> mouse_button_bindings;
@@ -76,9 +81,15 @@
typedef std::map<std::string, SDLKey> String2Key;
String2Key string2key;
+
+ typedef std::map<int, SDL_Joystick*> JoystickHandles;
+ JoystickHandles joystick_handles;
+
+ bool open_joystick(int device);
public:
SDLDriver();
+ ~SDLDriver();
Button* create_button (const FileReader& reader, Control* parent);
Axis* create_axis (const FileReader& reader, Control* parent);
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Pingus-CVS] r3049 - trunk/pingus/src/input2,
grumbel at BerliOS <=