pingus-cvs
[Top][All Lists]
Advanced

[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);





reply via email to

[Prev in Thread] Current Thread [Next in Thread]