Panda3D
Loading...
Searching...
No Matches
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
17TypeHandle MouseSubregion::_type_handle;
18
19/**
20 *
21 */
22MouseSubregion::
23MouseSubregion(const std::string &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 */
45MouseSubregion::
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 */
57void MouseSubregion::
58do_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}
Records a set of button events that happened recently.
get_num_events
Returns the number of events in the list.
get_event
Returns the nth event in the list.
Records a button event of some kind.
Definition buttonEvent.h:49
This object supervises the traversal of the data graph and the moving of data from one DataNode to it...
Encapsulates the data generated from (or sent into) any particular DataNode.
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...
void set_data(int index, const EventParameter &data)
Sets the data for the indicated parameter.
bool has_data(int index) const
Returns true if the indicated parameter has been stored, false otherwise.
An optional parameter associated with an event.
TypedWritableReferenceCount * get_ptr() const
Retrieves a pointer to the actual value stored in the parameter.
This is the base class for some classes that monitor the mouse and keyboard input and perform some ac...
A handy class object for storing simple values (like integers or strings) passed along with an Event ...
Definition paramValue.h:103
get_value
Retrieves the value stored in the parameter.
Definition paramValue.h:115
TypeHandle is the identifier used to differentiate C++ class types.
Definition typeHandle.h:81
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.