Panda3D

mouseSubregion.cxx
Go to the documentation of this file.
1 /**
2 * PANDA 3D SOFTWARE
3 * Copyright (c) Carnegie Mellon University. All rights reserved.
4 *
5 * All use of this software is subject to the terms of the revised BSD
6 * license. You should have received a copy of this license along
7 * with this source code in a file named "LICENSE."
8 *
9 * @file mouseSubregion.cxx
10 * @author drose
11 * @date 2005-05-13
12 */
13
14 #include "mouseSubregion.h"
15 #include "dataNodeTransmit.h"
16
17 TypeHandle MouseSubregion::_type_handle;
18
19 /**
20 *
21 */
22 MouseSubregion::
23 MouseSubregion(const std::string &name) :
24 MouseInterfaceNode(name)
25 {
26 _pixel_xy_input = define_input("pixel_xy", EventStoreVec2::get_class_type());
27 _pixel_size_input = define_input("pixel_size", EventStoreVec2::get_class_type());
28 _xy_input = define_input("xy", EventStoreVec2::get_class_type());
29 _button_events_input = define_input("button_events", ButtonEventList::get_class_type());
30
31 _pixel_xy_output = define_output("pixel_xy", EventStoreVec2::get_class_type());
32 _pixel_size_output = define_output("pixel_size", EventStoreVec2::get_class_type());
33 _xy_output = define_output("xy", EventStoreVec2::get_class_type());
34 _button_events_output = define_output("button_events", ButtonEventList::get_class_type());
35
36 _pixel_xy = new EventStoreVec2(LPoint2(0.0f, 0.0f));
37 _pixel_size = new EventStoreVec2(LPoint2(0.0f, 0.0f));
38 _xy = new EventStoreVec2(LPoint2(0.0f, 0.0f));
39 _button_events = new ButtonEventList;
40 }
41
42 /**
43 *
44 */
45 MouseSubregion::
46 ~MouseSubregion() {
47 }
48
49 /**
50 * The virtual implementation of transmit_data(). This function receives an
51 * array of input parameters and should generate an array of output
52 * parameters. The input parameters may be accessed with the index numbers
53 * returned by the define_input() calls that were made earlier (presumably in
54 * the constructor); likewise, the output parameters should be set with the
55 * index numbers returned by the define_output() calls.
56 */
57 void MouseSubregion::
58 do_transmit_data(DataGraphTraverser *, const DataNodeTransmit &input,
59 DataNodeTransmit &output) {
60 bool has_mouse = false;
61
62 if (input.has_data(_xy_input)) {
63 const EventStoreVec2 *xy;
64 DCAST_INTO_V(xy, input.get_data(_xy_input).get_ptr());
65 const LVecBase2 &p = xy->get_value();
66
67 // Scale the old value into the new range.
68 LVecBase2 n((p[0] - _minx) * _scalex - 1.0f, (p[1] - _miny) * _scaley - 1.0f);
69
70 // If the mouse is indeed within the display region, pass it down.
71 if (n[0] >= -1.0f && n[0] <= 1.0f &&
72 n[1] >= -1.0f && n[1] <= 1.0f) {
73 _xy->set_value(n);
74 output.set_data(_xy_output, EventParameter(_xy));
75
76 // Also compute the pixel coordinates, based on the supplied pixel_size.
77 if (input.has_data(_pixel_size_input)) {
78 const EventStoreVec2 *pixel_size;
79 DCAST_INTO_V(pixel_size, input.get_data(_pixel_size_input).get_ptr());
80 const LVecBase2 &s = pixel_size->get_value();
81
82 PN_stdfloat xf = (1.0f + n[0]) * 0.5f * s[0];
83 PN_stdfloat yf = (1.0f - n[1]) * 0.5f * s[1];
84
85 _pixel_xy->set_value(LPoint2(xf, yf));
86 output.set_data(_pixel_xy_output, EventParameter(_pixel_xy));
87 }
88
89 has_mouse = true;
90 }
91 }
92
93 if (has_mouse) {
94 // If we have the mouse, send all of the mouse buttons.
95 output.set_data(_button_events_output, input.get_data(_button_events_input));
96 } else {
97 // Otherwise, send only the button-up events.
98 _button_events->clear();
99
100 if (input.has_data(_button_events_input)) {
101 const ButtonEventList *button_events;
102 DCAST_INTO_V(button_events, input.get_data(_button_events_input).get_ptr());
103 int num_events = button_events->get_num_events();
104 for (int i = 0; i < num_events; i++) {
105 const ButtonEvent &be = button_events->get_event(i);
106 if (be._type == ButtonEvent::T_up) {
107 // Don't suppress this button event; pass it through.
108 _button_events->add_event(be);
109 }
110 }
111 }
112
113 if (_button_events->get_num_events() != 0) {
114 output.set_data(_button_events_output, EventParameter(_button_events));
115 }
116 }
117
118
119 // Now scale the window size.
120 if (input.has_data(_pixel_size_input)) {
121 const EventStoreVec2 *pixel_size;
122 DCAST_INTO_V(pixel_size, input.get_data(_pixel_size_input).get_ptr());
123 const LVecBase2 &s = pixel_size->get_value();
124
125 LVecBase2 n(s[0] * (_r - _l), s[1] * (_t - _b));
126 _pixel_size->set_value(n);
127 output.set_data(_pixel_size_output, EventParameter(_pixel_size));
128 }
129 }
ButtonEventList
Records a set of button events that happened recently.
Definition: buttonEventList.h:33
ButtonEventList::get_event
const ButtonEvent & get_event(int n) const
Returns the nth event in the list.
Definition: buttonEventList.I:60
ButtonEventList::get_num_events
int get_num_events() const
Returns the number of events in the list.
Definition: buttonEventList.I:50
ButtonEvent
Records a button event of some kind.
Definition: buttonEvent.h:46
DataGraphTraverser
This object supervises the traversal of the data graph and the moving of data from one DataNode to it...
Definition: dataGraphTraverser.h:32
DataNodeTransmit
Encapsulates the data generated from (or sent into) any particular DataNode.
Definition: dataNodeTransmit.h:32
DataNodeTransmit::get_data
const EventParameter & get_data(int index) const
Extracts the data for the indicated index, if it has been stored, or the empty parameter if it has no...
Definition: dataNodeTransmit.I:52
DataNodeTransmit::set_data
void set_data(int index, const EventParameter &data)
Sets the data for the indicated parameter.
Definition: dataNodeTransmit.I:75
DataNodeTransmit::has_data
bool has_data(int index) const
Returns true if the indicated parameter has been stored, false otherwise.
Definition: dataNodeTransmit.I:64
EventParameter
An optional parameter associated with an event.
Definition: eventParameter.h:35
EventParameter::get_ptr
TypedWritableReferenceCount * get_ptr() const
Retrieves a pointer to the actual value stored in the parameter.
Definition: eventParameter.I:219
MouseInterfaceNode
This is the base class for some classes that monitor the mouse and keyboard input and perform some ac...
Definition: mouseInterfaceNode.h:31
ParamValue
A handy class object for storing simple values (like integers or strings) passed along with an Event ...
Definition: paramValue.h:103
ParamValue::get_value
get_value
Retrieves the value stored in the parameter.
Definition: paramValue.h:115
TypeHandle
TypeHandle is the identifier used to differentiate C++ class types.
Definition: typeHandle.h:81
dataNodeTransmit.h
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
mouseSubregion.h
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.