00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015 #include "mouseRecorder.h"
00016 #include "recorderController.h"
00017 #include "dataNodeTransmit.h"
00018 #include "bamReader.h"
00019 #include "bamWriter.h"
00020
00021 TypeHandle MouseRecorder::_type_handle;
00022
00023
00024
00025
00026
00027
00028 MouseRecorder::
00029 MouseRecorder(const string &name) :
00030 DataNode(name)
00031 {
00032 _pixel_xy_input = define_input("pixel_xy", EventStoreVec2::get_class_type());
00033 _xy_input = define_input("xy", EventStoreVec2::get_class_type());
00034 _button_events_input = define_input("button_events", ButtonEventList::get_class_type());
00035
00036 _pixel_xy_output = define_output("pixel_xy", EventStoreVec2::get_class_type());
00037 _xy_output = define_output("xy", EventStoreVec2::get_class_type());
00038 _button_events_output = define_output("button_events", ButtonEventList::get_class_type());
00039
00040 _live_button_events = new ButtonEventList;
00041 _save_button_events = new ButtonEventList;
00042
00043 _pixel_xy = new EventStoreVec2(LPoint2(0.0f, 0.0f));
00044 _xy = new EventStoreVec2(LPoint2(0.0f, 0.0f));
00045 }
00046
00047
00048
00049
00050
00051
00052 MouseRecorder::
00053 ~MouseRecorder() {
00054 }
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064 void MouseRecorder::
00065 record_frame(BamWriter *manager, Datagram &dg) {
00066 nassertv(is_recording());
00067 dg.add_bool(_has_mouse);
00068 if (_has_mouse) {
00069 _mouse_xy.write_datagram(dg);
00070 _mouse_pixel_xy.write_datagram(dg);
00071 }
00072 _save_button_events->write_datagram(manager, dg);
00073 _save_button_events->clear();
00074 }
00075
00076
00077
00078
00079
00080
00081
00082
00083 void MouseRecorder::
00084 play_frame(DatagramIterator &scan, BamReader *manager) {
00085 nassertv(is_playing());
00086 _has_mouse = scan.get_bool();
00087 if (_has_mouse) {
00088 _mouse_xy.read_datagram(scan);
00089 _mouse_pixel_xy.read_datagram(scan);
00090 }
00091 ButtonEventList button_events;
00092 button_events.fillin(scan, manager);
00093 _save_button_events->add_events(button_events);
00094 }
00095
00096
00097
00098
00099
00100
00101 void MouseRecorder::
00102 output(ostream &out) const {
00103 DataNode::output(out);
00104 }
00105
00106
00107
00108
00109
00110
00111 void MouseRecorder::
00112 write(ostream &out, int indent_level) const {
00113 DataNode::write(out, indent_level);
00114 }
00115
00116
00117
00118
00119
00120
00121
00122
00123
00124
00125
00126
00127
00128
00129 void MouseRecorder::
00130 do_transmit_data(DataGraphTraverser *, const DataNodeTransmit &input,
00131 DataNodeTransmit &output) {
00132 bool has_mouse = false;
00133 LPoint2 mouse_xy;
00134 LPoint2 mouse_pixel_xy;
00135
00136 _live_button_events->clear();
00137
00138 if (is_playing()) {
00139
00140
00141 has_mouse = _has_mouse;
00142 mouse_xy = _mouse_xy;
00143 mouse_pixel_xy = _mouse_pixel_xy;
00144 _live_button_events->add_events(*_save_button_events);
00145 _save_button_events->clear();
00146
00147 } else {
00148
00149
00150
00151 if (input.has_data(_xy_input)) {
00152
00153 const EventStoreVec2 *xy;
00154 DCAST_INTO_V(xy, input.get_data(_xy_input).get_ptr());
00155 mouse_xy = xy->get_value();
00156 DCAST_INTO_V(xy, input.get_data(_pixel_xy_input).get_ptr());
00157 mouse_pixel_xy = xy->get_value();
00158 has_mouse = true;
00159 }
00160
00161
00162 if (input.has_data(_button_events_input)) {
00163 const ButtonEventList *button_events;
00164 DCAST_INTO_V(button_events, input.get_data(_button_events_input).get_ptr());
00165 _live_button_events->add_events(*button_events);
00166 }
00167 }
00168
00169
00170
00171 if (has_mouse) {
00172
00173 _pixel_xy->set_value(_mouse_pixel_xy);
00174 _xy->set_value(_mouse_xy);
00175 output.set_data(_xy_output, EventParameter(_xy));
00176 output.set_data(_pixel_xy_output, EventParameter(_pixel_xy));
00177 }
00178
00179 if (_live_button_events->get_num_events() != 0) {
00180 output.set_data(_button_events_output, EventParameter(_live_button_events));
00181 }
00182
00183 if (is_recording()) {
00184
00185 _has_mouse = has_mouse;
00186 _mouse_xy = mouse_xy;
00187 _mouse_pixel_xy = mouse_pixel_xy;
00188 _save_button_events->add_events(*_live_button_events);
00189 }
00190 }
00191
00192
00193
00194
00195
00196
00197
00198
00199 void MouseRecorder::
00200 register_with_read_factory() {
00201 BamReader::get_factory()->register_factory(get_class_type(), make_from_bam);
00202 RecorderController::get_factory()->register_factory(get_class_type(), make_recorder);
00203 }
00204
00205
00206
00207
00208
00209
00210
00211 void MouseRecorder::
00212 write_datagram(BamWriter *manager, Datagram &dg) {
00213 DataNode::write_datagram(manager, dg);
00214 }
00215
00216
00217
00218
00219
00220
00221
00222
00223
00224
00225
00226 void MouseRecorder::
00227 write_recorder(BamWriter *manager, Datagram &dg) {
00228 RecorderBase::write_recorder(manager, dg);
00229 DataNode::write_recorder(manager, dg);
00230 }
00231
00232
00233
00234
00235
00236
00237
00238
00239
00240 TypedWritable *MouseRecorder::
00241 make_from_bam(const FactoryParams ¶ms) {
00242 MouseRecorder *node = new MouseRecorder("");
00243 DatagramIterator scan;
00244 BamReader *manager;
00245
00246 parse_params(params, scan, manager);
00247 node->fillin(scan, manager);
00248
00249 return node;
00250 }
00251
00252
00253
00254
00255
00256
00257
00258
00259 RecorderBase *MouseRecorder::
00260 make_recorder(const FactoryParams ¶ms) {
00261 MouseRecorder *node = new MouseRecorder("");
00262 DatagramIterator scan;
00263 BamReader *manager;
00264
00265 parse_params(params, scan, manager);
00266 node->fillin_recorder(scan, manager);
00267
00268 return node;
00269 }
00270
00271
00272
00273
00274
00275
00276
00277
00278 void MouseRecorder::
00279 fillin(DatagramIterator &scan, BamReader *manager) {
00280 DataNode::fillin(scan, manager);
00281 }
00282
00283
00284
00285
00286
00287
00288
00289
00290 void MouseRecorder::
00291 fillin_recorder(DatagramIterator &scan, BamReader *manager) {
00292 RecorderBase::fillin_recorder(scan, manager);
00293 DataNode::fillin_recorder(scan, manager);
00294 }