00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015 #include "trackerNode.h"
00016 #include "config_device.h"
00017 #include "dataNodeTransmit.h"
00018
00019 TypeHandle TrackerNode::_type_handle;
00020
00021
00022
00023
00024
00025
00026 TrackerNode::
00027 TrackerNode(ClientBase *client, const string &device_name) :
00028 DataNode(device_name)
00029 {
00030 _transform_output = define_output("transform", TransformState::get_class_type());
00031
00032 _transform = TransformState::make_identity();
00033
00034 nassertv(client != (ClientBase *)NULL);
00035 set_tracker_coordinate_system(client->get_coordinate_system());
00036 set_graph_coordinate_system(CS_default);
00037
00038 PT(ClientDevice) device =
00039 client->get_device(ClientTrackerDevice::get_class_type(), device_name);
00040
00041 if (device == (ClientDevice *)NULL) {
00042 device_cat.warning()
00043 << "Unable to open tracker device " << device_name << "\n";
00044 return;
00045 }
00046
00047 if (!device->is_of_type(ClientTrackerDevice::get_class_type())) {
00048 device_cat.error()
00049 << "Inappropriate device type " << device->get_type()
00050 << " created; expected a ClientTrackerDevice.\n";
00051 return;
00052 }
00053
00054 _tracker = DCAST(ClientTrackerDevice, device);
00055 }
00056
00057
00058
00059
00060
00061
00062 TrackerNode::
00063 ~TrackerNode() {
00064
00065
00066
00067 }
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082 void TrackerNode::
00083 do_transmit_data(DataGraphTraverser *, const DataNodeTransmit &,
00084 DataNodeTransmit &output) {
00085 if (is_valid()) {
00086 _tracker->poll();
00087 _tracker->acquire();
00088 _data = _tracker->get_data();
00089 _tracker->unlock();
00090
00091 _data.get_orient().extract_to_matrix(_mat);
00092 if (_tracker_cs != _graph_cs) {
00093
00094 _mat = _mat * LMatrix4::convert_mat(_tracker_cs, _graph_cs);
00095 }
00096 _mat.set_row(3, _data.get_pos());
00097
00098
00099
00100 _transform = TransformState::make_mat(_mat);
00101 output.set_data(_transform_output, EventParameter(_transform));
00102 }
00103 }