00001 #include "ttable.h"
00002
00003 using namespace VRUT;
00004
00005 Condition::Condition(int pressed, int released, float ctrl1, float ctrl2)
00006 {
00007 Reset(pressed, released, ctrl1, ctrl2);
00008 }
00009 Condition::~Condition()
00010 {}
00011 bool Condition::Evaluate(int buttons, float ctr1, float ctr2)
00012 {
00013 if (((buttons & pressedButtonsMask) == pressedButtonsMask) && (releasedButtonsMask & buttons) == 0)
00014 {
00015
00016 if (((control1 < 0) && (ctr1 > control1)) || ((control1 >= 0) && (ctr1 < control1)))
00017 {
00018
00019 return false;
00020 }
00021 if (((control2 < 0) && (ctr2 > control2)) || ((control2 >= 0) && (ctr2 < control2)))
00022 {
00023 return false;
00024 }
00025 return true;
00026 }
00027 else
00028 {
00029
00030 return false;
00031 }
00032 }
00033 void Condition::Reset(int pressed, int released, float ctrl1, float ctrl2)
00034 {
00035 pressedButtonsMask = pressed;
00036 releasedButtonsMask = released;
00037 control1 = ctrl1;
00038 control2 = ctrl2;
00039 }
00040 int Condition::PressedMask(){return pressedButtonsMask;}
00041 int Condition::ReleasedMask(){return releasedButtonsMask;}
00042 float Condition::Control1(){return control1;}
00043 float Condition::Control2(){return control2;}
00044
00045 TTableEntry::TTableEntry(int BodyID, Body::BodyType type, int IDscene, int IDsceneNode, Condition condition, TTableEntry::TransformMode mod, float scale)
00046 {
00047 this->bodyType = type;
00048 this->idBody = BodyID;
00049 this->idScene = IDscene;
00050 this->idSceneNode= IDsceneNode;
00051 transformCondition = condition;
00052 this->scale = scale;
00053 mode = mod;
00054 changed = false;
00055 }
00056 TTableEntry::~TTableEntry()
00057 {
00058 }
00059 void TTableEntry::SetScale(float scale)
00060 {
00061 changed = true;
00062 this->scale = scale;
00063 }
00064 void TTableEntry::SetTransformMode(TTableEntry::TransformMode mod)
00065 {
00066 changed = true;
00067 mode = mod;
00068 }
00069 void TTableEntry::SetSceneNode(int scene, int node)
00070 {
00071 changed = true;
00072 idScene = scene;
00073 idSceneNode = node;
00074 }
00075 void TTableEntry::SetCondition(Condition condition)
00076 {
00077 changed = true;
00078 transformCondition = condition;
00079 }
00080 float TTableEntry::GetScale()
00081 {
00082 return scale;
00083 }
00084 TTableEntry::TransformMode TTableEntry::GetTransformationMode()
00085 {
00086 return mode;
00087 }
00088
00089 int TTableEntry::GetSceneID()
00090 {
00091 return idScene;
00092 }
00093 int TTableEntry::GetSceneNodeID()
00094 {
00095 return idSceneNode;
00096 }
00097 void TTableEntry::GetSceneNode(int &scene, int &node)
00098 {
00099 scene = idScene;
00100 node = idSceneNode;
00101 }
00102 Condition TTableEntry::GetCondition()
00103 {
00104 return transformCondition;
00105 }
00106 int TTableEntry::GetBodyID()
00107 {
00108 return idBody;
00109 }
00110 Body::BodyType TTableEntry::GetBodyType()
00111 {
00112 return bodyType;
00113 }
00114 bool TTableEntry::EvaluateCondition(int buttons, float c1, float c2)
00115 {
00116 return this->transformCondition.Evaluate(buttons, c1, c2);
00117 }
00118 void TTableEntry::relativeMatrix(MATRIX & prev, MATRIX & curr)
00119 {
00120 float cy2 = cosf(asinf(curr._m13));
00121 float cy1 = cosf(asinf(prev._m13));
00122 float sinX = ((curr._m23 / (-1 * cy2)) * (prev._m33 / cy1)) - ((curr._m33 / cy2) * (prev._m23 / (-1 * cy1)));
00123 float cosX = (curr._m33 / cy2)*(prev._m33 / cy1) + (curr._m23 / (-1 * cy2)) * (prev._m23 / (-1 * cy1));
00124 float sinY = (curr._m13 * cy1) - (cy2 * prev._m13);
00125 float cosY = (cy2 * cy1) + (curr._m13 * prev._m13);
00126 float sinZ = ((curr._m12 / (-1 * cy2)) * (prev._m11 / cy1)) - ((curr._m11 / cy2) * (prev._m12 / (-1 * cy1)));
00127 float cosZ = ((curr._m11 / cy2) * (prev._m11 / cy1)) + ((curr._m12 / (-1 * cy2)) * (prev._m12 / (-1 * cy1)));
00128
00129
00130 curr._m11 = cosZ * cosY;
00131 curr._m12 = (-1 * sinZ) * cosY;
00132 curr._m13 = sinY;
00133
00134 curr._m21 = (sinZ * cosX) + (cosZ * sinY * sinX);
00135 curr._m22 = (cosZ * cosX) - (sinZ * sinY * sinX);
00136 curr._m23 = (-1 * cosY) * sinX;
00137
00138 curr._m31 = (sinZ * sinX) - (cosZ * sinY * cosX);
00139 curr._m32 = (cosZ * sinX) + (sinZ * sinY * cosX);
00140 curr._m33 = cosY * cosX;
00141
00142 curr._m41 -= prev._m41; curr._m42 -= prev._m42; curr._m43 -= prev._m43;
00143 }
00144 void TTableEntry::generateEvent(MATRIX bodyMatrix,int buttons, float c1, float c2, VRUT::SceneModule * module)
00145 {
00146
00147
00148
00149
00150 if (changed && EvaluateCondition(buttons, c1,c2))
00151 {
00152 MATRIX tempMatrix = bodyMatrix;
00153 MATRIX scaleMatrix; scaleMatrix._m11 = scaleMatrix._m22 = scaleMatrix._m33 = scale;
00154 scaleMatrix._m44=1;
00155 Scene * scene = module->GetSceneMgr()->GetScene(this->idScene);
00156 const SceneNode * node =scene->GetNode(this->idSceneNode);
00157 scene->UpdateTransformation(this->idSceneNode);
00158 switch(mode)
00159 {
00160 case TRANSFORM_RELATIVE:
00161 {
00162 relativeMatrix(prevMatrix, tempMatrix);
00163 const MATRIX * curr = node->GetLocalTransMatrix();
00164 tempMatrix._m41 *= scale;
00165 tempMatrix._m42 *= scale;
00166 tempMatrix._m43 *= scale;
00167 MATRIX transform = this->transformMatrix(&tempMatrix, curr);
00168 wxCommandEvent evt = Event::GET_EVT_SCENE_NODE_TRANSFORM(idScene,idSceneNode,transform);
00169 wxCommandEvent ev = Event::GET_EVT_RENDER_UPDATE(idScene);
00170 module->PostToKernel(evt);
00171 module->PostToKernel(ev);
00172 break;
00173 }
00174 case TRANSFORM_TRANSLATION:
00175 {
00176 relativeMatrix(prevMatrix, tempMatrix);
00177 tempMatrix._m11 = tempMatrix._m22 = tempMatrix._m33 = tempMatrix._m44 = 1;
00178 tempMatrix._m12 = tempMatrix._m13 = tempMatrix._m14 = tempMatrix._m21 = tempMatrix._m23 = tempMatrix._m24 = tempMatrix._m31 = tempMatrix._m32 = tempMatrix._m34 = 0;
00179 tempMatrix._m41 *= scale;
00180 tempMatrix._m42 *= scale;
00181 tempMatrix._m43 *= scale;
00182 wxCommandEvent evt = Event::GET_EVT_SCENE_NODE_TRANSFORM(idScene,idSceneNode,tempMatrix);
00183 wxCommandEvent ev = Event::GET_EVT_RENDER_UPDATE(idScene);
00184 module->PostToKernel(evt);
00185 module->PostToKernel(ev);
00186 break;
00187 }
00188 case TRANSFORM_ABSOLUTE:
00189 {
00190 tempMatrix._m41 *= scale;
00191 tempMatrix._m42 *= scale;
00192 tempMatrix._m43 *= scale;
00193 wxCommandEvent evt = VRUT::Event::GET_EVT_SCENE_NODE_TRANSFORM_SET(this->idScene, this->idSceneNode, tempMatrix);
00194 wxCommandEvent ev = Event::GET_EVT_RENDER_UPDATE(idScene);
00195 module->PostToKernel(evt);
00196 module->PostToKernel(ev);
00197 break;
00198 }
00199 case TRANSFORM_ROTATION:
00200 {
00201 relativeMatrix(prevMatrix, tempMatrix);
00202 tempMatrix = tempMatrix.ExtractRotation();
00203 const MATRIX * curr = node->GetLocalTransMatrix();
00204 MATRIX transform = this->transformMatrix(&tempMatrix, curr);
00205 wxCommandEvent evt = VRUT::Event::GET_EVT_SCENE_NODE_TRANSFORM(this->idScene, this->idSceneNode, transform);
00206 wxCommandEvent ev = Event::GET_EVT_RENDER_UPDATE(idScene);
00207 module->PostToKernel(evt);
00208 module->PostToKernel(ev);
00209 break;
00210 }
00211 case TRANSFORM_USE_RELATIVE:
00212 {
00213 tempMatrix._m41 *= scale;
00214 tempMatrix._m42 *= scale;
00215 tempMatrix._m43 *= scale;
00216 const MATRIX * curr = node->GetLocalTransMatrix();
00217 MATRIX transform = this->transformMatrix(&tempMatrix, curr);
00218 wxCommandEvent evt = Event::GET_EVT_SCENE_NODE_TRANSFORM(idScene,idSceneNode,transform);
00219 wxCommandEvent ev = Event::GET_EVT_RENDER_UPDATE(idScene);
00220 module->PostToKernel(evt);
00221 module->PostToKernel(ev);
00222 break;
00223 }
00224 case TRANSFORM_USE_ROTATION:
00225 {
00226 tempMatrix = tempMatrix.ExtractRotation();
00227 const MATRIX * curr = node->GetLocalTransMatrix();
00228 MATRIX transform = this->transformMatrix(&tempMatrix, curr);
00229 wxCommandEvent evt = VRUT::Event::GET_EVT_SCENE_NODE_TRANSFORM(this->idScene, this->idSceneNode, transform);
00230 wxCommandEvent ev = Event::GET_EVT_RENDER_UPDATE(idScene);
00231 module->PostToKernel(evt);
00232 module->PostToKernel(ev);
00233 break;
00234 }
00235 case TRANSFORM_USE_TRANSLATION:
00236 {
00237 tempMatrix._m11 = tempMatrix._m22 = tempMatrix._m33 = tempMatrix._m44 = 1;
00238 tempMatrix._m12 = tempMatrix._m13 = tempMatrix._m14 = tempMatrix._m21 = tempMatrix._m23 = tempMatrix._m24 = tempMatrix._m31 = tempMatrix._m32 = tempMatrix._m34 = 0;
00239 tempMatrix._m41 *= scale;
00240 tempMatrix._m42 *= scale;
00241 tempMatrix._m43 *= scale;
00242 wxCommandEvent evt = Event::GET_EVT_SCENE_NODE_TRANSFORM(idScene,idSceneNode,tempMatrix);
00243 wxCommandEvent ev = Event::GET_EVT_RENDER_UPDATE(idScene);
00244 module->PostToKernel(evt);
00245 module->PostToKernel(ev);
00246 break;
00247 }
00248 case WORLD_TRANSFORM_RELATIVE:
00249 {
00250 relativeMatrix(prevMatrix, tempMatrix);
00251 const MATRIX * curr = node->GetLocalTransMatrix();
00252 const MATRIX * w = node->GetWorldTransMatrix();
00253 tempMatrix._m41 *= scale;
00254 tempMatrix._m42 *= scale;
00255 tempMatrix._m43 *= scale;
00256 MATRIX transform = this->transformMatrixRegardWorld(&tempMatrix,curr, w);
00257 wxCommandEvent evt = Event::GET_EVT_SCENE_NODE_TRANSFORM(idScene,idSceneNode,transform);
00258 wxCommandEvent ev = Event::GET_EVT_RENDER_UPDATE(idScene);
00259 module->PostToKernel(evt);
00260 module->PostToKernel(ev);
00261 break;
00262 }
00263 case WORLD_TRANSFORM_ROTATION:
00264 {
00265 relativeMatrix(prevMatrix, tempMatrix);
00266 tempMatrix = tempMatrix.ExtractRotation();
00267 const MATRIX * curr = node->GetLocalTransMatrix();
00268 const MATRIX * w = node->GetWorldTransMatrix();
00269 MATRIX transform = this->transformMatrixRegardWorld(&tempMatrix,curr, w);
00270 wxCommandEvent evt = VRUT::Event::GET_EVT_SCENE_NODE_TRANSFORM(this->idScene, this->idSceneNode, transform);
00271 wxCommandEvent ev = Event::GET_EVT_RENDER_UPDATE(idScene);
00272 module->PostToKernel(evt);
00273 module->PostToKernel(ev);
00274 break;
00275 }
00276 case WORLD_TRANSFORM_TRANSLATION:
00277 {
00278 relativeMatrix(prevMatrix, tempMatrix);
00279 tempMatrix._m11 = tempMatrix._m22 = tempMatrix._m33 = tempMatrix._m44 = 1;
00280 tempMatrix._m12 = tempMatrix._m13 = tempMatrix._m14 = tempMatrix._m21 = tempMatrix._m23 = tempMatrix._m24 = tempMatrix._m31 = tempMatrix._m32 = tempMatrix._m34 = 0;
00281 tempMatrix._m41 *= scale;
00282 tempMatrix._m42 *= scale;
00283 tempMatrix._m43 *= scale;
00284 const MATRIX * curr = node->GetLocalTransMatrix();
00285 const MATRIX * w = node->GetWorldTransMatrix();
00286 MATRIX transform = this->transformMatrixRegardWorld(&tempMatrix,curr, w);
00287 wxCommandEvent evt = Event::GET_EVT_SCENE_NODE_TRANSFORM(idScene,idSceneNode,transform);
00288 wxCommandEvent ev = Event::GET_EVT_RENDER_UPDATE(idScene);
00289 module->PostToKernel(evt);
00290 module->PostToKernel(ev);
00291 break;
00292 }
00293 case WORLD_TRANSFORM_USE_RELATIVE:
00294 {
00295 tempMatrix._m41 *= scale;
00296 tempMatrix._m42 *= scale;
00297 tempMatrix._m43 *= scale;
00298 const MATRIX * curr = node->GetLocalTransMatrix();
00299 const MATRIX * w = node->GetWorldTransMatrix();
00300 MATRIX transform = this->transformMatrixRegardWorld(&tempMatrix,curr, w);
00301 wxCommandEvent evt = Event::GET_EVT_SCENE_NODE_TRANSFORM(idScene,idSceneNode,transform);
00302 wxCommandEvent ev = Event::GET_EVT_RENDER_UPDATE(idScene);
00303 module->PostToKernel(evt);
00304 module->PostToKernel(ev);
00305 break;
00306 }
00307 case WORLD_TRANSFORM_USE_ROTATION:
00308 {
00309 tempMatrix = tempMatrix.ExtractRotation();
00310 const MATRIX * curr = node->GetLocalTransMatrix();
00311 const MATRIX * w = node->GetWorldTransMatrix();
00312 MATRIX transform = this->transformMatrixRegardWorld(&tempMatrix,curr, w);
00313 wxCommandEvent evt = VRUT::Event::GET_EVT_SCENE_NODE_TRANSFORM(this->idScene, this->idSceneNode, transform);
00314 wxCommandEvent ev = Event::GET_EVT_RENDER_UPDATE(idScene);
00315 module->PostToKernel(evt);
00316 module->PostToKernel(ev);
00317 break;
00318 }
00319 case WORLD_TRANSFORM_USE_TRANSLATION:
00320 {
00321 tempMatrix._m11 = tempMatrix._m22 = tempMatrix._m33 = tempMatrix._m44 = 1;
00322 tempMatrix._m12 = tempMatrix._m13 = tempMatrix._m14 = tempMatrix._m21 = tempMatrix._m23 = tempMatrix._m24 = tempMatrix._m31 = tempMatrix._m32 = tempMatrix._m34 = 0;
00323 tempMatrix._m41 *= scale;
00324 tempMatrix._m42 *= scale;
00325 tempMatrix._m43 *= scale;
00326 const MATRIX * curr = node->GetLocalTransMatrix();
00327 const MATRIX * w = node->GetWorldTransMatrix();
00328 MATRIX transform = this->transformMatrixRegardWorld(&tempMatrix,curr, w);
00329 wxCommandEvent evt = Event::GET_EVT_SCENE_NODE_TRANSFORM(idScene,idSceneNode,transform);
00330 wxCommandEvent ev = Event::GET_EVT_RENDER_UPDATE(idScene);
00331 module->PostToKernel(evt);
00332 module->PostToKernel(ev);
00333 break;
00334 }
00335 default:
00336 {
00337 LOGWARNING(wxString::Format(wxT("<TrackingManipulator> Bad TransformMode used: %i"), mode));
00338
00339 }
00340 break;
00341 }
00342 }
00343 prevMatrix = bodyMatrix;
00344 changed = true;
00345 return;
00346 }
00347 wxString TTableEntry::GetAsString()
00348 {
00349 wxString dump = wxT("");
00350 dump << idScene << wxT(" ") << idSceneNode << wxT(" ") << idBody << wxT(" ") << bodyType
00351 << wxT(" ") << mode << wxT(" ") << transformCondition.PressedMask()<< wxT(" ")
00352 << transformCondition.ReleasedMask() << wxT(" ") << transformCondition.Control1()
00353 << wxT(" ") << transformCondition.Control2() << wxT(" ") << scale;
00354 return dump;
00355 }
00356
00357 TrackingTable::TrackingTable()
00358 {
00359 iterator = -1;
00360 idBody = -1;
00361 SceneId = -1;
00362 SceneNodeID = -1;
00363 }
00364 TrackingTable::~TrackingTable()
00365 {}
00366 void TrackingTable::AddRow(int bodyID, Body::BodyType type, int sceneId, int SceneNode, Condition condition, TTableEntry::TransformMode mode, float scale)
00367 {
00368 TTableEntry entry(bodyID, type, sceneId, SceneNode, condition, mode,scale);
00369 table.push_back(entry);
00370 }
00371 void TrackingTable::AddRow(int bodyID, Body::BodyType type, int sceneId, int SceneNode, int pressed, int released, float ctrl1, float ctrl2, TTableEntry::TransformMode mode, float scale)
00372 {
00373 Condition condition(pressed,released,ctrl1, ctrl2);
00374 TTableEntry entry(bodyID, type, sceneId, SceneNode, condition, mode,scale);
00375 table.push_back(entry);
00376 }
00377 void TrackingTable::UpdateRow(int bodyID, Body::BodyType type, int sceneID, int sceneNode, Condition condition, TTableEntry::TransformMode mode, float scale)
00378 {
00379 int iter = this->GetFirstRow(bodyID, type, sceneID, sceneNode);
00380 if (iter == -1)
00381 {
00382 AddRow(bodyID, type, sceneID, sceneNode, condition, mode, scale);
00383 }
00384 else
00385 {
00386 UpdateRow(iter, condition, mode, scale);
00387 }
00388 }
00389 void TrackingTable::UpdateRow(int row, Condition condition, TTableEntry::TransformMode mode, float scale)
00390 {
00391 if (row >= (int)table.size()) return;
00392 table[row].SetCondition(condition);
00393 table[row].SetTransformMode(mode);
00394 table[row].SetScale(scale);
00395 }
00396
00397 int TrackingTable::GetFirstRow(int idBody, Body::BodyType type, int scene, int sceneNode)
00398 {
00399 iterator = -1;
00400 this->idBody = idBody;
00401 this->type = type;
00402 this->SceneId = scene;
00403 this->SceneNodeID = sceneNode;
00404 for (size_t i = 0; i < table.size(); i++)
00405 {
00406 if (table[i].GetBodyID() == idBody && table[i].GetBodyType() == type && table[i].GetSceneID() == scene && table[i].GetSceneNodeID() == sceneNode)
00407 {
00408 iterator = (int)i;
00409 return iterator;
00410 }
00411 }
00412 return iterator;
00413 }
00414 int TrackingTable::GetNextRow()
00415 {
00416 if (iterator == -1) iterator = 0;
00417 for (size_t i = iterator; i < table.size(); i++)
00418 {
00419 if (table[i].GetBodyID() == idBody && table[i].GetBodyType() == type && table[i].GetSceneID() == SceneId && table[i].GetSceneNodeID() == SceneNodeID)
00420 {
00421 iterator = (int)i;
00422 return iterator;
00423 }
00424 }
00425 iterator = -1;
00426 return iterator;
00427 }
00428 void TrackingTable::SetScale(int row, float scale)
00429 {
00430 if (row >= (int)table.size()) return;
00431 table[row].SetScale(scale);
00432 }
00433 void TrackingTable::SetTransformMode(int row, TTableEntry::TransformMode mod)
00434 {
00435 if (row >= (int)table.size()) return;
00436 table[row].SetTransformMode(mod);
00437 }
00438 void TrackingTable::SetCondition(int row,Condition cond)
00439 {
00440 if (row >= (int)table.size()) return;
00441 table[row].SetCondition(cond);
00442 }
00443 float TrackingTable::GetScale(int row)
00444 {
00445
00446 return table[row].GetScale();
00447 }
00448 TTableEntry::TransformMode TrackingTable::GetTransformationMode(int row)
00449 {
00450
00451 return table[row].GetTransformationMode();
00452 }
00453 int TrackingTable::GetSceneID(int row)
00454 {
00455
00456 return table[row].GetSceneID();
00457 }
00458 int TrackingTable::GetSceneNodeID(int row)
00459 {
00460
00461 return table[row].GetSceneNodeID();
00462 }
00463 Condition TrackingTable::GetCondition(int row)
00464 {
00465
00466 return table[row].GetCondition();
00467 }
00468 TTableEntry * TrackingTable::getTableEntry(int row)
00469 {
00470
00471 return &table[row];
00472 }
00473 void TrackingTable::ProcessTable(Body::BodyType type, int bodyID, MATRIX bodyMatrix, int buttons, float ctrl1, float ctrl2, VRUT::SceneModule *module)
00474 {
00475
00476
00477 if (ctrl1 < -1 || ctrl1 > 1) ctrl1 = 0;
00478 if (ctrl2 < -1 || ctrl2 > 1) ctrl2 = 0;
00479 for (size_t i = 0 ; i < table.size(); i++)
00480 {
00481
00482 if (bodyID == table[i].GetBodyID() && type == (int)table[i].GetBodyType())
00483 {
00484
00485 table[i].generateEvent(bodyMatrix, buttons, ctrl1, ctrl2, module);
00486 }
00487 }
00488 }
00489 bool TrackingTable::InsertLine(int bodyID, Body::BodyType type, int sceneID, int sceneNode, int pressed, int released, float ctrl1, float ctrl2, TTableEntry::TransformMode mode, float scale)
00490 {
00491 if (type != Body::B6DF2)
00492 {
00493 ctrl1 = ctrl2 = 0;
00494 }
00495 if (type == Body::B6D || type == Body::B3D || type == Body::BGL)
00496 {
00497 pressed = released = 0;
00498 }
00499 std::vector<TTableEntry>::iterator i;
00500 for (i = table.begin(); i != table.end(); i++)
00501 {
00502 Condition cond = (*i).GetCondition();
00503 if ((*i).GetBodyID() == bodyID &&
00504 (*i).GetBodyType() == type &&
00505 (*i).GetSceneID() == sceneID &&
00506 (*i).GetSceneNodeID() == sceneNode &&
00507 cond.PressedMask() == pressed &&
00508 cond.ReleasedMask() == released &&
00509 cond.Control1() == ctrl1 &&
00510 cond.Control2() == ctrl2 &&
00511 (*i).GetTransformationMode() == mode &&
00512 (*i).GetScale() == scale ) return false;
00513 }
00514
00515 this->AddRow(bodyID, type, sceneID, sceneNode, pressed, released, ctrl1, ctrl2, mode, scale);
00516 return true;
00517 }
00518 bool TrackingTable::EraseLine(int bodyID, Body::BodyType type, int sceneID, int sceneNode, int pressed, int released, float ctrl1, float ctrl2, TTableEntry::TransformMode mode, float scale)
00519 {
00520 if (type != Body::B6DF2)
00521 {
00522 ctrl1 = ctrl2 = 0;
00523 }
00524 if (type == Body::B6D || type == Body::B3D || type == Body::BGL)
00525 {
00526 pressed = released = 0;
00527 }
00528 std::vector<TTableEntry>::iterator i;
00529 for (i = table.begin(); i != table.end(); i++)
00530 {
00531 Condition cond = (*i).GetCondition();
00532 if ((*i).GetBodyID() == bodyID &&
00533 (*i).GetBodyType() == type &&
00534 (*i).GetSceneID() == sceneID &&
00535 (*i).GetSceneNodeID() == sceneNode &&
00536 cond.PressedMask() == pressed &&
00537 cond.ReleasedMask() == released &&
00538 cond.Control1() == ctrl1 &&
00539 cond.Control2() == ctrl2 &&
00540 (*i).GetTransformationMode() == mode &&
00541 (*i).GetScale() == scale )
00542 {
00543 table.erase(i);
00544 return true;
00545 }
00546 }
00547 return false;
00548 }
00549 void TrackingTable::ClearTable()
00550 {
00551 table.clear();
00552 }
00553
00554 wxString TrackingTable::GetAsString()
00555 {
00556 wxString dump = wxT("");
00557 size_t max = table.size();
00558 for (size_t i = 0; i < max; i++)
00559 {
00560 dump << table[i].GetAsString() << wxT("\n");
00561 }
00562 return dump;
00563 }
00564 void TrackingTable::WriteToLog()
00565 {
00566 size_t max = table.size();
00567 if (max == 0)
00568 {
00569 LOG(wxT("<TrackingManipulator> Table empty!"));
00570 return;
00571 }
00572 else
00573 {
00574 wxString dump = wxT("<TrackingManipulator> Table: (scene node type id mode pressed released ctrl1 ctrl2 scale)\n");
00575 for (size_t i = 0; i < max; i++)
00576 {
00577 Condition c = table[i].GetCondition();
00578 dump << table[i].GetSceneID() << wxT(" ") << table[i].GetSceneNodeID()
00579 << wxT(" ") << table[i].GetBodyType() << wxT(" ") << table[i].GetBodyID()
00580 << wxT(" ") << table[i].GetTransformationMode() << wxT(" ") << c.PressedMask()
00581 << wxT(" ") << c.ReleasedMask() << wxT(" ") << c.Control1() << wxT(" ") << c.Control2()
00582 << wxT(" ") << table[i].GetScale() <<wxT("\n");
00583 }
00584 LOG(dump);
00585 }
00586 }
00587 MATRIX TTableEntry::transformMatrix(const MATRIX * relative,const MATRIX * current)
00588 {
00589 MATRIX cur_trans = MATRIX::Translation(current->ExtractTranslation());
00590 MATRIX curr_rot = current->ExtractRotation();
00591 MATRIX cur_inv = cur_trans.Inverse();
00592 MATRIX rel_trans = MATRIX::Translation(relative->ExtractTranslation());
00593 MATRIX rel_rot = relative->ExtractRotation();
00594 MATRIX ret = (cur_inv * rel_rot) *(cur_trans * rel_trans);
00595 return ret;
00596 }
00597 MATRIX TTableEntry::transformMatrixRegardWorld(const MATRIX *relative, const MATRIX *nodeLocalMatrix, const MATRIX * nodeWorldMatrix)
00598 {
00599
00600
00601
00602
00603
00604
00605
00606
00607
00608
00609
00610
00611
00612
00613 MATRIX wrld_rot = nodeWorldMatrix->ExtractRotation();
00614 MATRIX wrld_inv = wrld_rot;
00615 wrld_inv.InvertThisPrecise();
00616 MATRIX cur_trans = MATRIX::Translation(nodeLocalMatrix->ExtractTranslation());
00617 MATRIX cur_inv = cur_trans.Inverse();
00618 MATRIX rel_trans = MATRIX::Translation(relative->ExtractTranslation());
00619 MATRIX rel_rot = relative->ExtractRotation();
00620
00621 MATRIX transform = ((((cur_inv * wrld_rot) * rel_rot) * rel_trans) * wrld_inv) * cur_trans;
00622 return transform;
00623
00624 }