00001 #include "trackingmanipulator.h"
00002 #include "../../core/src/evtstructs.h"
00003 #include <fstream>
00004 using namespace VRUT;
00005
00006 wxString TrackingManipulator::GetDesc() const
00007 {
00008 return wxT("Tracking scene manipulator");
00009 }
00010
00011 TrackingManipulator::~TrackingManipulator()
00012 {
00013 }
00014 TrackingManipulator::TrackingManipulator(const MODULE_ID & _id, const wxString & _name, EventHandler * msgSink):
00015 SceneModule(_id, _name, 0, msgSink)
00016 {
00017 REGISTER_LISTENER(Event::EVT_INPUT_TRACKING);
00018 REGISTER_PARAM_GUI_TEXTCONTROL(sceneNodeIDParamID, wxT("sceneNodeID"), wxT("0"), wxT("ID of scene node to manipulate."));
00019 sceneNodeID = 0;
00020 REGISTER_PARAM_GUI_TEXTCONTROL(deviceIDParamID, wxT("deviceID"), wxT("0"), wxT("ID of tracking device."));
00021 deviceID = 0;
00022 REGISTER_PARAM_GUI_TEXTCONTROL(deviceTypeParamID, wxT("deviceType"), wxT("0"), wxT("Type of tracking device."));
00023 deviceType = 0;
00024 REGISTER_PARAM_GUI_TEXTCONTROL(transformationModeParamID, wxT("transformationMode"), wxT("0"), wxT("transformationMode"));
00025 transformationMode = 0;
00026 REGISTER_PARAM_GUI_TEXTCONTROL(pressedButtonsParamID, wxT("pressedButtons"), wxT("0"), wxT("pressedButtons"));
00027 pressedButtons = 0;
00028 REGISTER_PARAM_GUI_TEXTCONTROL(releasedButtonsParamID, wxT("releasedButtons"), wxT("0"), wxT("releasedButtons"));
00029 releasedButtons = 0;
00030 REGISTER_PARAM_GUI_TEXTCONTROL(control1ParamID, wxT("control1"), wxT("0.0"), wxT("control1"));
00031 control1 = 0;
00032 REGISTER_PARAM_GUI_TEXTCONTROL(control2ParamID, wxT("control2"), wxT("0.0"), wxT("control2"));
00033 control2 = 0;
00034 REGISTER_PARAM_GUI_TEXTCONTROL(scaleParamID, wxT("scale"), wxT("1.0"), wxT("scale"));
00035 scale = 1;
00036 REGISTER_PARAM_GUI_BUTTON(insertParamID, wxT("insert"), wxT("insert"));
00037 REGISTER_PARAM_GUI_BUTTON(removeParamID, wxT("remove"), wxT("remove"));
00038 REGISTER_PARAM_GUI_BUTTON(clearParamID, wxT("clear"), wxT("clear"));
00039 REGISTER_PARAM_GUI_BUTTON(dumpParamID, wxT("dump"), wxT("dump"));
00040 REGISTER_PARAM_GUI_BUTTON(loadParamID, wxT("load"), wxT("load"));
00041 REGISTER_PARAM_GUI_BUTTON(saveParamID, wxT("save"), wxT("save"));
00042
00043 insert = remove = dump = load = save = clear = 0 ;
00044 eventTimeout = 20;
00045 }
00046 void TrackingManipulator::processEvent(wxCommandEvent &evt)
00047 {
00048 SceneModule::processEvent(evt);
00049 switch (evt.GetEventType())
00050 {
00051
00052 case Event::EVT_PARAM_SET:
00053 {
00054 insert = remove = dump = load = save = clear = 0;
00055 UPDATE_PARAM_FROM_EVENT_INT(sceneNodeIDParamID, sceneNodeID, evt);
00056 UPDATE_PARAM_FROM_EVENT_INT(deviceIDParamID, deviceID, evt);
00057 UPDATE_PARAM_FROM_EVENT_INT(deviceTypeParamID, deviceType,evt);
00058 UPDATE_PARAM_FROM_EVENT_INT(transformationModeParamID, transformationMode,evt);
00059 UPDATE_PARAM_FROM_EVENT_INT(pressedButtonsParamID, pressedButtons, evt);
00060 UPDATE_PARAM_FROM_EVENT_INT(releasedButtonsParamID, releasedButtons,evt);
00061 UPDATE_PARAM_FROM_EVENT_FLOAT(control1ParamID, control1, evt);
00062 UPDATE_PARAM_FROM_EVENT_FLOAT(control2ParamID, control2, evt);
00063 UPDATE_PARAM_FROM_EVENT_FLOAT(scaleParamID, scale, evt);
00064 UPDATE_PARAM_FROM_EVENT_INT(insertParamID, insert, evt);
00065 UPDATE_PARAM_FROM_EVENT_INT(removeParamID, remove, evt);
00066 UPDATE_PARAM_FROM_EVENT_INT(dumpParamID, dump, evt);
00067 UPDATE_PARAM_FROM_EVENT_INT(loadParamID, load, evt);
00068 UPDATE_PARAM_FROM_EVENT_INT(saveParamID, save, evt);
00069 UPDATE_PARAM_FROM_EVENT_INT(clearParamID, clear, evt);
00070
00071 if (0 != insert)
00072 {
00073 if (!checkScene()) LOGWARNING(wxT("<TrackingManipulator> sceneID is not valid!"));
00074 if (!checkNodeInScene(sceneID)) LOGWARNING(wxT("<TrackingManipulator> sceneNodeID is not valid!"));
00075 bool added = mapTable.InsertLine(deviceID, (Body::BodyType)deviceType, sceneID, sceneNodeID, pressedButtons, releasedButtons, control1, control2, (TTableEntry::TransformMode)transformationMode, scale);
00076 if (added) LOG(wxT("<TrackingManipulator> Entry was inserted to table."));
00077 else LOG(wxT("<TrackingManipulator> Entry has been already added before."));
00078 }
00079 else if (0 != remove)
00080 {
00081 bool del = mapTable.EraseLine(deviceID, (Body::BodyType)deviceType, sceneID, sceneNodeID, pressedButtons, releasedButtons, control1, control2, (TTableEntry::TransformMode)transformationMode, scale);
00082 if(del)
00083 {
00084 LOG(wxT("<TrackingManipulator> Entry deleted from table."));
00085
00086 while(mapTable.EraseLine(deviceID, (Body::BodyType)deviceType, sceneID, sceneNodeID, pressedButtons, releasedButtons, control1, control2, (TTableEntry::TransformMode)transformationMode, scale))
00087 {
00088 LOG(wxT("<TrackingManipulator> Entry deleted from table."));
00089 }
00090 }
00091 else LOG(wxT("<TrackingManipulator> Entry is not in table."));
00092
00093 }
00094 else if ( 0 != dump)
00095 {
00096 mapTable.WriteToLog();
00097
00098 }
00099 else if (0 != clear)
00100 {
00101 mapTable.ClearTable();
00102 LOG(wxT("<TrackingManipulator> Table deleted!"));
00103 }
00104 else if (0 != save)
00105 {
00106 if (!saveTableToConfigFile())
00107 {
00108 LOGERROR(wxT("<TrackingManipulator>Can't write to configuration file!"));
00109 }
00110 else
00111 {
00112 LOG(wxT("<TrackingManipulator> Table configuration saved"));
00113 }
00114 }
00115 else if (0 != load)
00116 {
00117 int numberOfEntries;
00118 bool loaded =loadTableFromConfigFile(numberOfEntries);
00119 if (loaded)
00120 {
00121 LOG(wxString::Format(wxT("<TrackingManipulator> Successfuly loaded table configuration. Entries: %i"), numberOfEntries));
00122 }
00123 else
00124 {
00125 if (numberOfEntries < 0) LOGERROR(wxT("<TrackingManipulator> Table configuration file were not opened. No changes on table were done!"));
00126 else LOGWARNING(wxString::Format(wxT("<TrackingManipulator> Configuration file is corrupted! Entries successfuly load: "), numberOfEntries));
00127
00128 }
00129 }
00130 break;
00131 }
00132 case Event::EVT_INPUT_TRACKING:
00133 {
00134
00135 DeviceData * data = (DeviceData *)evt.GetClientData();
00136 mapTable.ProcessTable((Body::BodyType)data->type, data->id, data->matrix, data->buttons, data->control1, data->control2, this);
00137 break;
00138 }
00139 }
00140 }
00141 bool TrackingManipulator::checkNodeInScene(int idScene)
00142 {
00143 Scene * scen = GetSceneMgr()->GetScene(idScene);
00144 if (scen == NULL) return false;
00145 const SceneNode * nod = scen->GetNode(sceneNodeID);
00146 return (!(nod == NULL));
00147 }
00148 bool TrackingManipulator::checkScene()
00149 {
00150 Scene * scen = GetSceneMgr()->GetScene(sceneID);
00151 if (scen == NULL) return false;
00152 else return true;
00153 }
00154 bool TrackingManipulator::loadTableFromConfigFile(int & entries)
00155 {
00156 wxFileInputStream * input = new wxFileInputStream(wxT("trackingmanipulator.cfg"));
00157 if (!input->IsOk())
00158 {
00159 LOG(wxT("not opened"));
00160 entries = -1;
00161 delete input;
00162 return false;
00163 }
00164
00165
00166
00167
00168
00169
00170
00171
00172
00173
00174 mapTable.ClearTable();
00175 entries = 0;
00176 TextParser * parser = new TextParser(input, 10000,1000);
00177 while(1)
00178 {
00179 int sc;
00180 if(!parser->ParseInt(&sc))
00181 {
00182 delete parser;
00183 delete input;
00184 return true;
00185 }
00186 sceneID = sc;
00187
00188 if(!parser->ParseInt(&sceneNodeID)) break;
00189
00190 if(!parser->ParseInt(&deviceID)) break;
00191
00192 if(!parser->ParseInt(&deviceType)) break;
00193
00194 if(!parser->ParseInt(&transformationMode)) break;
00195
00196 if(!parser->ParseInt(&pressedButtons)) break;
00197
00198 if(!parser->ParseInt(&releasedButtons)) break;
00199
00200 if(!parser->ParseFloat(&control1)) break;
00201
00202 if(!parser->ParseFloat(&control2)) break;
00203
00204 if(!parser->ParseFloat(&scale)) break;
00205
00206 if (mapTable.InsertLine(deviceID, (Body::BodyType)deviceType, sceneID, sceneNodeID, pressedButtons, releasedButtons, control1, control2, (TTableEntry::TransformMode)transformationMode, scale))
00207 {
00208 entries++;
00209 }
00210 }
00211 delete parser;
00212 delete input;
00213 return false;
00214
00215
00216
00217
00218
00219
00220
00221
00222
00223
00224
00225
00226
00227
00228
00229
00230
00231
00232
00233
00234
00235
00236 }
00237 bool TrackingManipulator::saveTableToConfigFile()
00238 {
00239 wxFileOutputStream * output = new wxFileOutputStream(wxT("trackingmanipulator.cfg"));
00240 wxString dump = mapTable.GetAsString();
00241 if(!output->IsOk()) return false;
00242 size_t length = strlen(dump.mb_str(wxConvISO8859_1));
00243 char * string = new char[length + 1];
00244 strcpy(string, dump.mb_str(wxConvISO8859_1));
00245 for (char * index = string ; index < (string + length); index++)
00246 {
00247 if (',' == *index) *index = '.';
00248 }
00249 output->Write(string,length);
00250 bool all = (output->LastWrite() == length);
00251 output->Close();
00252 delete string;
00253 delete output;
00254
00255
00256
00257
00258
00259
00260
00261
00262
00263
00264
00265
00266
00267
00268 return all;
00269 }