00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012 #ifndef __NAVIGATION_H__
00013 #define __NAVIGATION_H__
00014
00015 #include "../../core/src/cameramodule.h"
00016 #include "navigationstyleinterface.h"
00017
00018 #include <vector>
00019 #include <list>
00020
00021 namespace VRUT
00022 {
00024 const int MODULE_VERSION = 1;
00025
00027 class Navigation: public CameraModule
00028 {
00029 wxString defaultMouseEventTimeout;
00030 protected:
00032 enum NavigationStyle
00033 {
00034 CAMERA_MANIPULATOR = 0,
00035 CATIA = 1,
00036 ICEMSURF = 2,
00037 DELTAGEN = 3,
00038 VD2 = 4,
00039 CORTONA = 5,
00040 CINEMA4D = 6,
00041 MAYA = 7
00042 };
00043 enum ViewName
00044 {
00045 FRONT,
00046 SIDE,
00047 TOP,
00048 REAR
00049 };
00051 struct NavigationOperationPair
00052 {
00054 Parameter::ParameterIdentificator paramId;
00056 int paramValue;
00057 NavigationOperationPair() { }
00058 NavigationOperationPair(Parameter::ParameterIdentificator paramId, int paramValue) { this->paramId = paramId; this->paramValue = paramValue; }
00059 };
00061 typedef std::vector<NavigationStyleInterface*> NavigationStyleVector;
00063 typedef std::vector<const SceneNode*> SceneNodeVector;
00065 NavigationStyleVector navigationStyleDefinition;
00067 SceneNodeVector cameras;
00069 wxArrayString navigationStyleString;
00071 wxArrayString cameraString;
00073 Parameter::ParameterIdentificator navigationStyleParamID;
00075 Parameter::ParameterIdentificator selectedCameraParamID;
00077 wxPoint lastPos;
00079 wxPoint mouseDelta;
00081 typedef std::list<NavigationOperationPair> ParameterIdentificatorList;
00083 VECTOR3 scenePivot;
00085 bool scenePivotWasSet;
00086
00088 class NavigationStyleCameraManipulatorSpecific : public NavigationStyleInterface
00089 {
00091 Navigation *navigation;
00092 public:
00093 NavigationStyleCameraManipulatorSpecific(const MODULE_ID & _id, const wxString & _name, Navigation *navigation);
00094 void getAndFixButtonValues(const wxCommandEvent & evt) {}
00095 void registerButtons() {}
00096 bool isAnyButtonSelected() const {};
00097 void buttonEvent() {}
00099 void updateParams(const wxCommandEvent & evt) {}
00101 void keyStyle(wxKeyEvent & evt);
00103 void mouseStyle(wxMouseEvent & evt);
00104 };
00105
00107 class NavigationStyleCATIASpecific : public NavigationStyleInterface
00108 {
00110 Navigation *navigation;
00111 public:
00113 bool wasLeftOrRightButtonDownWhilePanning;
00115 bool wasDragging;
00117 bool buttonOperationStarted;
00119 bool fly;
00121 ParameterIdentificatorList examineButtonsInfo;
00123 ParameterIdentificatorList flyModeButtonsInfo;
00124
00126 ParameterIdentificatorList::iterator panButtonIter;
00128 ParameterIdentificatorList::iterator rotateButtonIter;
00130 ParameterIdentificatorList::iterator zoomInButtonIter;
00132 ParameterIdentificatorList::iterator zoomOutButtonIter;
00134 ParameterIdentificatorList::iterator turnHeadButtonIter;
00136 ParameterIdentificatorList::iterator flyButtonIter;
00138 ParameterIdentificatorList::iterator accelerateButtonIter;
00140 ParameterIdentificatorList::iterator decelerateButtonIter;
00141
00143 NavigationOperationPair flyModeButton;
00145 NavigationOperationPair fitAllInButton;
00147 NavigationStyleCATIASpecific(const MODULE_ID & _id, const wxString & _name, Navigation *navigation);
00149 bool isCATIAFlyModeEnabled() const;
00151 void getAndFixFlyModeButtonValue(const wxCommandEvent & evt);
00153 void getAndFixFitAllInButtonValue(const wxCommandEvent & evt);
00155 void getAndFixButtonValues(const wxCommandEvent & evt);
00157 void updateParams(const wxCommandEvent & evt) {}
00159 void registerButtons();
00161 bool isAnyButtonSelected() const;
00163 void buttonEvent();
00165 void keyStyle(wxKeyEvent & evt);
00167 void mouseStyle(wxMouseEvent & evt);
00168 };
00169
00171 class NavigationStyleCortonaSpecific : public NavigationStyleInterface
00172 {
00174 Navigation *navigation;
00175 public:
00177 Parameter::ParameterIdentificator avatarHeightParamID;
00179 ParameterIdentificatorList modeButtonsInfo;
00181 ParameterIdentificatorList walkButtonsInfo;
00183 ParameterIdentificatorList flyButtonsInfo;
00185 ParameterIdentificatorList studyButtonsInfo;
00187 ParameterIdentificatorList otherButtonsInfo;
00188
00190 ParameterIdentificatorList::iterator walkButtonIter;
00192 ParameterIdentificatorList::iterator flyButtonIter;
00194 ParameterIdentificatorList::iterator studyButtonIter;
00195
00197 ParameterIdentificatorList::iterator planWalkButtonIter;
00199 ParameterIdentificatorList::iterator panWalkButtonIter;
00201 ParameterIdentificatorList::iterator turnWalkButtonIter;
00202
00204 ParameterIdentificatorList::iterator planFlyButtonIter;
00206 ParameterIdentificatorList::iterator panFlyButtonIter;
00208 ParameterIdentificatorList::iterator turnFlyButtonIter;
00210 ParameterIdentificatorList::iterator rollFlyButtonIter;
00211
00213 ParameterIdentificatorList::iterator planStudyButtonIter;
00215 ParameterIdentificatorList::iterator panStudyButtonIter;
00217 ParameterIdentificatorList::iterator turnStudyButtonIter;
00219 ParameterIdentificatorList::iterator rollStudyButtonIter;
00220
00222 ParameterIdentificatorList::iterator fitAllInButtonIter;
00224 ParameterIdentificatorList::iterator goToButtonIter;
00226 ParameterIdentificatorList::iterator alignButtonIter;
00227
00229 bool operationStarted;
00231 bool gotoOperationStarted;
00233 bool altDown;
00235 bool spaceDown;
00237 wxPoint mouseOperationOrigin;
00239 float speedCompensation;
00241 float avatarHeight;
00243 float maxStepHeight;
00244
00246 NavigationStyleCortonaSpecific(const MODULE_ID & _id, const wxString & _name, Navigation *navigation);
00248 void getAndFixButtonValues(const wxCommandEvent & evt);
00250 void registerButtons();
00252 void updateParams(const wxCommandEvent & evt);
00254 void buttonEvent();
00256 void keyStyle(wxKeyEvent & evt);
00258 void mouseStyle(wxMouseEvent & evt);
00260 wxPoint getMouseDelta(const wxMouseEvent & evt) const;
00261 };
00263 class NavigationStyleCinema4DSpecific : public NavigationStyleInterface
00264 {
00266 Navigation *navigation;
00267 public:
00269 bool ctrlDown;
00271 bool wasDragging;
00273 ParameterIdentificatorList navigationButtonsInfo;
00275 ParameterIdentificatorList::iterator panButtonIter;
00277 ParameterIdentificatorList::iterator zoomButtonIter;
00279 ParameterIdentificatorList::iterator rotateButtonIter;
00281 NavigationStyleCinema4DSpecific(const MODULE_ID & _id, const wxString & _name, Navigation *navigation);
00283 void selectionClick(wxMouseEvent & evt, Scene * scene, Camera * camera);
00285 void getAndFixButtonValues(const wxCommandEvent & evt);
00287 void updateParams(const wxCommandEvent & evt) {}
00289 void registerButtons();
00291 void buttonEvent();
00293 void keyStyle(wxKeyEvent & evt);
00295 void mouseStyle(wxMouseEvent & evt);
00296 };
00298 class NavigationStyleMayaSpecific : public NavigationStyleInterface
00299 {
00301 Navigation *navigation;
00302 public:
00304 ParameterIdentificatorList navigationButtonsInfo;
00305
00307 ParameterIdentificatorList::iterator selectButtonIter;
00309 ParameterIdentificatorList::iterator tumbleButtonIter;
00311 ParameterIdentificatorList::iterator trackButtonIter;
00313 ParameterIdentificatorList::iterator dollyButtonIter;
00315 ParameterIdentificatorList::iterator zoomButtonIter;
00317 ParameterIdentificatorList::iterator rollButtonIter;
00319 ParameterIdentificatorList::iterator azimuthElevationButtonIter;
00321 ParameterIdentificatorList::iterator yawPitchButtonIter;
00323 ParameterIdentificatorList::iterator flyButtonIter;
00325 bool altDown;
00327 bool shiftDown;
00329 bool axisAlignedRotateOperationStarted;
00331 bool axisAlignedXaxis;
00333 NavigationStyleMayaSpecific(const MODULE_ID & _id, const wxString & _name, Navigation *navigation);
00335 void getAndFixButtonValues(const wxCommandEvent & evt);
00337 void registerButtons();
00339 void updateParams(const wxCommandEvent & evt) {}
00341 void buttonEvent();
00343 void keyStyle(wxKeyEvent & evt);
00345 void mouseStyle(wxMouseEvent & evt);
00346 };
00348 class NavigationStyleDeltaViewSpecific : public NavigationStyleInterface
00349 {
00351 Navigation *navigation;
00352 public:
00354 bool altDown;
00356 bool ctrlDown;
00358 bool shiftDown;
00360 bool axisAlignedRotateOperationStarted;
00362 bool axisAlignedXaxis;
00364 NavigationStyleDeltaViewSpecific(const MODULE_ID & _id, const wxString & _name, Navigation *navigation);
00366 void getAndFixButtonValues(const wxCommandEvent & evt);
00368 void updateParams(const wxCommandEvent & evt) {}
00370 void registerButtons();
00372 void buttonEvent();
00374 void keyStyle(wxKeyEvent & evt);
00376 void mouseStyle(wxMouseEvent & evt);
00377 };
00379 class NavigationStyleICEMSurfSpecific : public NavigationStyleInterface
00380 {
00382 Navigation *navigation;
00383 public:
00385 bool ctrlDown;
00387 bool shiftDown;
00389 bool magnifyingGlass;
00391 bool axisAlignedRotateOperationStarted;
00393 bool axisAlignedXaxis;
00395 bool rotateOperationStarted;
00396
00398 ParameterIdentificatorList otherButtonsInfo;
00400 ParameterIdentificatorList navigationModeButtonsInfo;
00402 ParameterIdentificatorList centerOfRotationButtonsInfo;
00403
00405 ParameterIdentificatorList::iterator zoomInButtonIter;
00407 ParameterIdentificatorList::iterator zoomOutButtonIter;
00409 ParameterIdentificatorList::iterator sideViewButtonIter;
00411 ParameterIdentificatorList::iterator topViewButtonIter;
00413 ParameterIdentificatorList::iterator frontViewButtonIter;
00415 ParameterIdentificatorList::iterator rearViewButtonIter;
00417 ParameterIdentificatorList::iterator freeButtonIter;
00419 ParameterIdentificatorList::iterator walkButtonIter;
00421 ParameterIdentificatorList::iterator flyButtonIter;
00423 ParameterIdentificatorList::iterator turnHeadButtonIter;
00425 ParameterIdentificatorList::iterator centerOfGeometryButtonIter;
00427 ParameterIdentificatorList::iterator dynamicButtonIter;
00429 ParameterIdentificatorList::iterator referencePointButtonIter;
00431 NavigationStyleICEMSurfSpecific(const MODULE_ID & _id, const wxString & _name, Navigation *navigation);
00433 void getAndFixButtonValues(const wxCommandEvent & evt);
00435 void updateParams(const wxCommandEvent & evt) {}
00437 void registerButtons();
00439 void buttonEvent();
00441 void keyStyle(wxKeyEvent & evt);
00443 void mouseStyle(wxMouseEvent & evt);
00444 };
00446 class NavigationStyleVD2Specific : public NavigationStyleInterface
00447 {
00449 Navigation *navigation;
00450 public:
00452 bool centerPickOperationStarted;
00453 NavigationStyleVD2Specific(const MODULE_ID & _id, const wxString & _name, Navigation *navigation);
00454 void getAndFixButtonValues(const wxCommandEvent & evt) {}
00455 void registerButtons() {}
00456 bool isAnyButtonSelected() const {};
00457 void buttonEvent() {}
00459 void updateParams(const wxCommandEvent & evt) {}
00461 void keyStyle(wxKeyEvent & evt);
00463 void mouseStyle(wxMouseEvent & evt);
00464 };
00465
00466 NODE_ID selectedObject;
00468 NavigationStyleInterface *activeNavigationStyle;
00470 NavigationStyleCameraManipulatorSpecific navigationStyleCameraManipulatorSpecific;
00472 NavigationStyleCATIASpecific navigationStyleCATIASpecific;
00474 NavigationStyleCortonaSpecific navigationStyleCortonaSpecific;
00476 NavigationStyleCinema4DSpecific navigationStyleCinema4DSpecific;
00478 NavigationStyleMayaSpecific navigationStyleMayaSpecific;
00480 NavigationStyleDeltaViewSpecific navigationStyleDeltaViewSpecific;
00482 NavigationStyleICEMSurfSpecific navigationStyleICEMSurfSpecific;
00484 NavigationStyleVD2Specific navigationStyleVD2Specific;
00486 Parameter::ParameterIdentificator cameraCenterDistanceParamID;
00488 bool fovChangeOperationStarted;
00490 float nearPlane;
00492 float farPlane;
00494 float fov;
00496 Parameter::ParameterIdentificator fovParamID;
00498 Parameter::ParameterIdentificator farPlaneParamID;
00500 Parameter::ParameterIdentificator nearPlaneParamID;
00502 float rotspeed;
00504 float zoomStep;
00506 float flySpeedStep;
00508 Parameter::ParameterIdentificator rotspeedParamID;
00510 float zoomspeed;
00512 Parameter::ParameterIdentificator zoomspeedParamID;
00514 float cruisespeed;
00516 Parameter::ParameterIdentificator cruisespeedParamID;
00518 float panspeed;
00520 Parameter::ParameterIdentificator panspeedParamID;
00521
00523 wxString buildCurrentCameraString(const SceneNode *node);
00525 void lowMouseEventTimeout();
00527 void highMouseEventTimeout();
00529 void registerGUI();
00531 void refreshGUI();
00533 void registerCommonGUIControls();
00535 void registerTextControl(Parameter::ParameterIdentificator & paramID, const wxString & value);
00537 void registerButton(Parameter::ParameterIdentificator & paramID);
00539 void registerButtonList(ParameterIdentificatorList & buttonList);
00541 bool isAnyButtonSelected(const ParameterIdentificatorList & buttonList) const;
00543 bool getAndFixButtonValues(const wxCommandEvent & evt, ParameterIdentificatorList & buttonList);
00545 void clearButtonValues(ParameterIdentificatorList &buttonList);
00547 void clearButtonValuesConditional(const wxCommandEvent & evt, ParameterIdentificatorList &buttonList);
00549 NavigationStyleInterface *resolveStyleFromString(const wxString& string) const;
00551 void select(Scene * scene, Camera * camera, wxMouseEvent & evt);
00553 void pickScenePivot(Scene * scene, Camera * camera, const NODE_ID& cameraID, wxMouseEvent & evt);
00555 void translateCameraCenterToSelection(Scene * scene, Camera * camera, const NODE_ID& cameraID, wxMouseEvent & evt);
00557 void pan(Scene * scene, Camera * camera, const NODE_ID& cameraID, const wxPoint& mouseDelta, float speed);
00559 void rotate(Scene * scene, Camera * camera, const NODE_ID& cameraID, const wxPoint& mouseAbsolute, const wxPoint& mouseDelta, bool rollControl, bool yAlignedUpVector, bool rotateAroundScenePivot);
00561 void turnHead(Scene * scene, Camera * camera, const NODE_ID& cameraID, const wxPoint& mouseDelta, bool yAlignedUpVector);
00563 void fly(Scene * scene, Camera * camera, const NODE_ID& cameraID, const wxPoint& mouseDelta);
00565 void zoom(Scene * scene, Camera * camera, const NODE_ID& cameraID, int mouseDelta, float speed);
00567 void roll(Scene * scene, Camera * camera, const NODE_ID& cameraID, int mouseDelta, float speed, bool rotateAroundScenePivot);
00569 void turnHeadLeftRightWithYAlignedUpVector(Scene * scene, Camera * camera, const NODE_ID& cameraID, int mouseXDelta, float speed);
00571 void moveWithCollisionTesting(Scene * scene, Camera * camera, const NODE_ID& cameraID, const VECTOR3& walkDirection, float speedModifier, float maxStepHeight, float avatarHeight);
00573 void planWalk(Scene * scene, Camera * camera, const NODE_ID& cameraID, const wxPoint& mouseDelta, float speedModifier, float maxStepHeight, float avatarHeight);
00575 void panWalk(Scene * scene, Camera * camera, const NODE_ID& cameraID, const wxPoint& mouseDelta, float speedModifier, float maxStepHeight, float avatarHeight);
00577 void turnWalk(Scene * scene, Camera * camera, const NODE_ID& cameraID, const wxPoint& mouseDelta, float speedModifier);
00579 void planFly(Scene * scene, Camera * camera, const NODE_ID& cameraID, const wxPoint& mouseDelta, float speedModifier);
00581 void panFly(Scene * scene, Camera * camera, const NODE_ID& cameraID, const wxPoint& mouseDelta, float speedModifier);
00583 void turnFly(Scene * scene, Camera * camera, const NODE_ID& cameraID, const wxPoint& mouseDelta, float speedModifier);
00585 void rollFly(Scene * scene, Camera * camera, const NODE_ID& cameraID, const wxPoint& mouseDelta, float speedModifier);
00587 void planStudy(Scene * scene, Camera * camera, const NODE_ID& cameraID, const wxPoint& mouseDelta, float speedModifier);
00589 void panStudy(Scene * scene, Camera * camera, const NODE_ID& cameraID, const wxPoint& mouseDelta, float speedModifier);
00591 void turnStudy(Scene * scene, Camera * camera, const NODE_ID& cameraID, const wxPoint& mouseDelta, float speedModifier);
00593 void rollStudy(Scene * scene, Camera * camera, const NODE_ID& cameraID, const wxPoint& mouseDelta, float speedModifier);
00595 void processNavigationOperationButtonEvent();
00597 void findCameras(SceneNodeVector & cameras);
00599 void setInitialScenePivot();
00601 void removePitch();
00603 void alignView(ViewName name);
00605 virtual void processEvent(wxCommandEvent & evt);
00607 virtual void processKeyEvent(wxKeyEvent & evt);
00609 virtual void processMouseEvent(wxMouseEvent & evt);
00611 virtual void run();
00612 public:
00614 Navigation(const MODULE_ID & _id, const wxString & _name, EventHandler * msgSink);
00616 virtual ~Navigation();
00617
00619 virtual wxString GetDesc() const;
00620 };
00621 };
00622
00623
00624 EXPORT_VRUT_MODULE_FUNCTIONS( Navigation )
00625
00626
00627 #endif