فهرست منبع

add virtual mouse

David Rose 24 سال پیش
والد
کامیت
058b835d1b

+ 3 - 3
panda/src/device/Sources.pp

@@ -16,14 +16,14 @@
      clientDialDevice.h clientTrackerDevice.I  \
      clientTrackerDevice.h config_device.h dialNode.I dialNode.h  \
      mouse.h trackerData.I trackerData.h trackerNode.I  \
-     trackerNode.h
+     trackerNode.h virtualMouse.h
 
   #define INCLUDED_SOURCES \
      analogNode.cxx buttonNode.cxx clientAnalogDevice.cxx  \
      clientBase.cxx clientButtonDevice.cxx clientDevice.cxx  \
      clientDialDevice.cxx clientTrackerDevice.cxx  \
      config_device.cxx dialNode.cxx mouse.cxx trackerData.cxx  \
-     trackerNode.cxx
+     trackerNode.cxx virtualMouse.cxx
 
   #define INSTALL_HEADERS \
     analogNode.I analogNode.h \
@@ -37,7 +37,7 @@
     config_device.h mouse.h \
     dialNode.I dialNode.h \
     trackerData.I trackerData.h \
-    trackerNode.I trackerNode.h
+    trackerNode.I trackerNode.h virtualMouse.h
 
   #define IGATESCAN all
 

+ 2 - 0
panda/src/device/config_device.cxx

@@ -29,6 +29,7 @@
 #include "dialNode.h"
 #include "mouse.h"
 #include "trackerNode.h"
+#include "virtualMouse.h"
 
 #include <dconfig.h>
 
@@ -68,4 +69,5 @@ init_libdevice() {
   DialNode::init_type();
   MouseAndKeyboard::init_type();
   TrackerNode::init_type();
+  VirtualMouse::init_type();
 }

+ 1 - 0
panda/src/device/device_composite2.cxx

@@ -6,4 +6,5 @@
 #include "mouse.cxx"
 #include "trackerData.cxx"
 #include "trackerNode.cxx"
+#include "virtualMouse.cxx"
 

+ 1 - 8
panda/src/device/mouse.h

@@ -17,10 +17,7 @@
 ////////////////////////////////////////////////////////////////////
 #ifndef MOUSE_H
 #define MOUSE_H
-//
-////////////////////////////////////////////////////////////////////
-// Includes
-////////////////////////////////////////////////////////////////////
+
 #include "pandabase.h"
 
 #include "dataNode.h"
@@ -30,10 +27,6 @@
 #include "pointerTo.h"
 #include "allTransitionsWrapper.h"
 
-////////////////////////////////////////////////////////////////////
-// Defines
-////////////////////////////////////////////////////////////////////
-const int MIN_MOVE = 2;
 
 ////////////////////////////////////////////////////////////////////
 //       Class : MouseAndKeyboard

+ 164 - 0
panda/src/device/virtualMouse.cxx

@@ -0,0 +1,164 @@
+// Filename: virtualMouse.cxx
+// Created by:  drose (13Dec01)
+//
+////////////////////////////////////////////////////////////////////
+//
+// PANDA 3D SOFTWARE
+// Copyright (c) 2001, Disney Enterprises, Inc.  All rights reserved
+//
+// All use of this software is subject to the terms of the Panda 3d
+// Software license.  You should have received a copy of this license
+// along with this source code; you will also find a current copy of
+// the license at http://www.panda3d.org/license.txt .
+//
+// To contact the maintainers of this program write to
+// [email protected] .
+//
+////////////////////////////////////////////////////////////////////
+
+#include "virtualMouse.h"
+
+TypeHandle VirtualMouse::_type_handle;
+
+TypeHandle VirtualMouse::_pixel_xyz_type;
+TypeHandle VirtualMouse::_xyz_type;
+TypeHandle VirtualMouse::_button_events_type;
+
+
+////////////////////////////////////////////////////////////////////
+//     Function: VirtualMouse::Constructor
+//       Access: Published
+//  Description:
+////////////////////////////////////////////////////////////////////
+VirtualMouse::
+VirtualMouse(const string &name) :
+  DataNode(name)
+{
+  _pixel_xyz = new Vec3DataTransition(LPoint3f(0.0f, 0.0f, 0.0f));
+  _xyz = new Vec3DataTransition(LPoint3f(0.0f, 0.0f, 0.0f));
+  _button_events = new ButtonEventDataTransition();
+
+  _got_mouse_attrib.set_transition(_pixel_xyz_type, _pixel_xyz);
+  _got_mouse_attrib.set_transition(_xyz_type, _xyz);
+  _got_mouse_attrib.set_transition(_button_events_type, _button_events);
+
+  _no_mouse_attrib.set_transition(_button_events_type, _button_events);
+
+  _mouse_x = 0;
+  _mouse_y = 0;
+  _win_width = 100;
+  _win_height = 100;
+  _mouse_on = false;
+  _next_button_events = new ButtonEventDataTransition();
+}
+
+////////////////////////////////////////////////////////////////////
+//     Function: VirtualMouse::set_mouse_pos
+//       Access: Published
+//  Description: Sets the current mouse pixel location, where (0,0) is
+//               the upper left, and (width-1, height-1) is the lower
+//               right pixel of the virtual window.
+////////////////////////////////////////////////////////////////////
+void VirtualMouse::
+set_mouse_pos(int x, int y) {
+  _mouse_x = x;
+  _mouse_y = y;
+}
+
+////////////////////////////////////////////////////////////////////
+//     Function: VirtualMouse::set_window_size
+//       Access: Published
+//  Description: Sets the size of the "window" in which the mouse
+//               rolls.  This changes the meaning of the values passed
+//               to set_mouse_pos().
+////////////////////////////////////////////////////////////////////
+void VirtualMouse::
+set_window_size(int width, int height) {
+  _win_width = width;
+  _win_height = height;
+}
+
+////////////////////////////////////////////////////////////////////
+//     Function: VirtualMouse::set_mouse_on
+//       Access: Published
+//  Description: Sets whether the mouse should appear to be within the
+//               window or not.  If this is true, the mouse is within
+//               the window; if false, the mouse is not within the
+//               window (and set_mouse_pos() means nothing).
+////////////////////////////////////////////////////////////////////
+void VirtualMouse::
+set_mouse_on(bool flag) {
+  _mouse_on = flag;
+}
+  
+////////////////////////////////////////////////////////////////////
+//     Function: VirtualMouse::press_button
+//       Access: Published
+//  Description: Simulates a mouse or keyboard button being depressed.
+//               This should be followed up by a call to
+//               release_button() sometime later (possibly
+//               immediately).
+////////////////////////////////////////////////////////////////////
+void VirtualMouse::
+press_button(ButtonHandle button) {
+  _next_button_events->push_back(ButtonEvent(button, true));
+}
+  
+////////////////////////////////////////////////////////////////////
+//     Function: VirtualMouse::release_button
+//       Access: Published
+//  Description: Simulates the button being released.  This should
+//               follow a previous call to press_button().
+////////////////////////////////////////////////////////////////////
+void VirtualMouse::
+release_button(ButtonHandle button) {
+  _next_button_events->push_back(ButtonEvent(button, false));
+}
+
+////////////////////////////////////////////////////////////////////
+//     Function: VirtualMouse::transmit_data
+//       Access: Public, Virtual
+//  Description:
+////////////////////////////////////////////////////////////////////
+void VirtualMouse::
+transmit_data(AllTransitionsWrapper &data) {
+  // Swap in the button events, and clear them for next time.
+  _button_events->swap(_next_button_events);
+  _next_button_events->clear();
+
+  if (_mouse_on) {
+    // The mouse is within the window.
+    _pixel_xyz->set_value(LPoint3f(_mouse_x, _mouse_y, 0.0f));
+
+    // Scale to range [-1,1]
+    float xf = (2.0f * (float)_mouse_x) / (float)_win_width - 1.0f;
+    float yf = 1.0f - (2.0f * (float)_mouse_y) / (float)_win_height;
+    _xyz->set_value(LPoint3f(xf, yf, 0.0f));
+    data = _got_mouse_attrib;
+
+  } else {
+    // The mouse isn't within the window.
+    data = _no_mouse_attrib;
+  }
+}
+
+////////////////////////////////////////////////////////////////////
+//     Function: VirtualMouse::init_type
+//       Access: Public
+//  Description:
+////////////////////////////////////////////////////////////////////
+void VirtualMouse::
+init_type() {
+  DataNode::init_type();
+  register_type(_type_handle, "VirtualMouse",
+                DataNode::get_class_type());
+
+  Vec3DataTransition::init_type();
+  register_data_transition(_pixel_xyz_type, "PixelXYZ",
+                           Vec3DataTransition::get_class_type());
+  register_data_transition(_xyz_type, "XYZ",
+                           Vec3DataTransition::get_class_type());
+  ButtonEventDataTransition::init_type();
+  register_data_transition(_button_events_type, "ButtonEvents",
+                           ButtonEventDataTransition::get_class_type());
+}

+ 87 - 0
panda/src/device/virtualMouse.h

@@ -0,0 +1,87 @@
+// Filename: virtualMouse.h
+// Created by:  drose (13Dec01)
+//
+////////////////////////////////////////////////////////////////////
+//
+// PANDA 3D SOFTWARE
+// Copyright (c) 2001, Disney Enterprises, Inc.  All rights reserved
+//
+// All use of this software is subject to the terms of the Panda 3d
+// Software license.  You should have received a copy of this license
+// along with this source code; you will also find a current copy of
+// the license at http://www.panda3d.org/license.txt .
+//
+// To contact the maintainers of this program write to
+// [email protected] .
+//
+////////////////////////////////////////////////////////////////////
+
+#ifndef VIRTUALMOUSE_H
+#define VIRTUALMOUSE_H
+
+#include "pandabase.h"
+
+#include "dataNode.h"
+#include "buttonHandle.h"
+#include "buttonEvent.h"
+#include "vec3DataTransition.h"
+#include "buttonEventDataTransition.h"
+#include "pointerTo.h"
+#include "allTransitionsWrapper.h"
+
+////////////////////////////////////////////////////////////////////
+//       Class : VirtualMouse
+// Description : Poses as a MouseAndKeyboard object in the datagraph,
+//               but accepts input from user calls, rather than
+//               reading the actual mouse and keyboard from an input
+//               device.  The user can write high-level code to put
+//               the mouse wherever he/she wants, and to insert
+//               keypresses on demand.
+////////////////////////////////////////////////////////////////////
+class EXPCL_PANDA VirtualMouse : public DataNode {
+PUBLISHED:
+  VirtualMouse(const string &name = "");
+
+  void set_mouse_pos(int x, int y);
+  void set_window_size(int width, int height);
+  void set_mouse_on(bool flag);
+  
+  void press_button(ButtonHandle button);
+  void release_button(ButtonHandle button);
+
+public:
+  virtual void transmit_data(AllTransitionsWrapper &data);
+
+public:
+  AllTransitionsWrapper _got_mouse_attrib;
+  AllTransitionsWrapper _no_mouse_attrib;
+  PT(Vec3DataTransition) _pixel_xyz;
+  PT(Vec3DataTransition) _xyz;
+  PT(ButtonEventDataTransition) _button_events;
+
+  static TypeHandle _mods_type;
+  static TypeHandle _pixel_xyz_type;
+  static TypeHandle _xyz_type;
+  static TypeHandle _button_events_type;
+
+private:
+  int _mouse_x, _mouse_y;
+  int _win_width, _win_height;
+  bool _mouse_on;
+  PT(ButtonEventDataTransition) _next_button_events;
+
+public:
+  virtual TypeHandle get_type() const {
+    return get_class_type();
+  }
+  virtual TypeHandle force_init_type() {init_type(); return get_class_type();}
+  static TypeHandle get_class_type() {
+    return _type_handle;
+  }
+  static void init_type();
+
+private:
+  static TypeHandle _type_handle;
+};
+
+#endif

+ 10 - 0
panda/src/dgraph/buttonEventDataTransition.cxx

@@ -29,6 +29,16 @@
 TypeHandle ButtonEventDataTransition::_type_handle;
 
 
+////////////////////////////////////////////////////////////////////
+//     Function: ButtonEventDataTransition::swap
+//       Access: Public
+//  Description: Swaps the data in the queue with that in the other.
+////////////////////////////////////////////////////////////////////
+void ButtonEventDataTransition::
+swap(ButtonEventDataTransition *other) {
+  _buttons.swap(other->_buttons);
+}
+
 ////////////////////////////////////////////////////////////////////
 //     Function: ButtonEventDataTransition::update_mods
 //       Access: Public

+ 1 - 0
panda/src/dgraph/buttonEventDataTransition.h

@@ -54,6 +54,7 @@ public:
 
   INLINE void clear();
   INLINE void push_back(const ButtonEvent &event);
+  void swap(ButtonEventDataTransition *other);
 
   void update_mods(ModifierButtons &mods) const;