00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015 #include "mouseSubregion.h"
00016 #include "dataNodeTransmit.h"
00017
00018 TypeHandle MouseSubregion::_type_handle;
00019
00020
00021
00022
00023
00024
00025 MouseSubregion::
00026 MouseSubregion(const string &name) :
00027 MouseInterfaceNode(name)
00028 {
00029 _pixel_xy_input = define_input("pixel_xy", EventStoreVec2::get_class_type());
00030 _pixel_size_input = define_input("pixel_size", EventStoreVec2::get_class_type());
00031 _xy_input = define_input("xy", EventStoreVec2::get_class_type());
00032 _button_events_input = define_input("button_events", ButtonEventList::get_class_type());
00033
00034 _pixel_xy_output = define_output("pixel_xy", EventStoreVec2::get_class_type());
00035 _pixel_size_output = define_output("pixel_size", EventStoreVec2::get_class_type());
00036 _xy_output = define_output("xy", EventStoreVec2::get_class_type());
00037 _button_events_output = define_output("button_events", ButtonEventList::get_class_type());
00038
00039 _pixel_xy = new EventStoreVec2(LPoint2(0.0f, 0.0f));
00040 _pixel_size = new EventStoreVec2(LPoint2(0.0f, 0.0f));
00041 _xy = new EventStoreVec2(LPoint2(0.0f, 0.0f));
00042 _button_events = new ButtonEventList;
00043 }
00044
00045
00046
00047
00048
00049
00050 MouseSubregion::
00051 ~MouseSubregion() {
00052 }
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067 void MouseSubregion::
00068 do_transmit_data(DataGraphTraverser *, const DataNodeTransmit &input,
00069 DataNodeTransmit &output) {
00070 bool has_mouse = false;
00071
00072 if (input.has_data(_xy_input)) {
00073 const EventStoreVec2 *xy;
00074 DCAST_INTO_V(xy, input.get_data(_xy_input).get_ptr());
00075 const LVecBase2 &p = xy->get_value();
00076
00077
00078 LVecBase2 n((p[0] - _minx) * _scalex - 1.0f, (p[1] - _miny) * _scaley - 1.0f);
00079
00080
00081 if (n[0] >= -1.0f && n[0] <= 1.0f &&
00082 n[1] >= -1.0f && n[1] <= 1.0f) {
00083 _xy->set_value(n);
00084 output.set_data(_xy_output, EventParameter(_xy));
00085
00086
00087
00088 if (input.has_data(_pixel_size_input)) {
00089 const EventStoreVec2 *pixel_size;
00090 DCAST_INTO_V(pixel_size, input.get_data(_pixel_size_input).get_ptr());
00091 const LVecBase2 &s = pixel_size->get_value();
00092
00093 PN_stdfloat xf = (1.0f + n[0]) * 0.5f * s[0];
00094 PN_stdfloat yf = (1.0f - n[1]) * 0.5f * s[1];
00095
00096 _pixel_xy->set_value(LPoint2(xf, yf));
00097 output.set_data(_pixel_xy_output, EventParameter(_pixel_xy));
00098 }
00099
00100 has_mouse = true;
00101 }
00102 }
00103
00104 if (has_mouse) {
00105
00106 output.set_data(_button_events_output, input.get_data(_button_events_input));
00107 } else {
00108
00109 _button_events->clear();
00110
00111 if (input.has_data(_button_events_input)) {
00112 const ButtonEventList *button_events;
00113 DCAST_INTO_V(button_events, input.get_data(_button_events_input).get_ptr());
00114 int num_events = button_events->get_num_events();
00115 for (int i = 0; i < num_events; i++) {
00116 const ButtonEvent &be = button_events->get_event(i);
00117 if (be._type == ButtonEvent::T_up) {
00118
00119 _button_events->add_event(be);
00120 }
00121 }
00122 }
00123
00124 if (_button_events->get_num_events() != 0) {
00125 output.set_data(_button_events_output, EventParameter(_button_events));
00126 }
00127 }
00128
00129
00130
00131 if (input.has_data(_pixel_size_input)) {
00132 const EventStoreVec2 *pixel_size;
00133 DCAST_INTO_V(pixel_size, input.get_data(_pixel_size_input).get_ptr());
00134 const LVecBase2 &s = pixel_size->get_value();
00135
00136 LVecBase2 n(s[0] * (_r - _l), s[1] * (_t - _b));
00137 _pixel_size->set_value(n);
00138 output.set_data(_pixel_size_output, EventParameter(_pixel_size));
00139 }
00140 }