16 #include <boost/unordered_map.hpp>
18 #include <osg/Matrixd>
37 class DtTerrainPatchObject;
38 class DtAgentUpdateResolverInterface;
50 TerrainResultNoData = 0,
62 virtual void tick(
double simTime );
65 virtual void tickAttachment();
69 virtual void setModelSet(
int modelSet );
72 virtual double altitude()
const;
74 virtual void setNameAndRegister(
const std::string& name );
76 virtual void getCameraPositionAndOrientation( osg::Vec3d& position,
77 osg::Quat& rotation )
const;
80 static void matrixdToTaitBryan(
const osg::Matrixd& mat, DtTaitBryan& tb,
bool isWorld2D =
false );
81 static double clampUnity(
double x );
93 virtual void startMoveObserverRight();
94 virtual void stopMoveObserverRight();
95 virtual void moveObserverRight(
double meters );
100 virtual void startMoveObserverForward();
101 virtual void stopMoveObserverForward();
102 virtual void moveObserverForward(
double meters );
108 virtual void startMoveObserverUp();
109 virtual void stopMoveObserverUp();
110 virtual void moveObserverUp(
double meters );
116 virtual void startMoveObserverLeft();
117 virtual void stopMoveObserverLeft();
118 virtual void moveObserverLeft(
double meters );
124 virtual void startMoveObserverBack();
125 virtual void stopMoveObserverBack();
126 virtual void moveObserverBack(
double meters );
132 virtual void startMoveObserverDown();
133 virtual void stopMoveObserverDown();
134 virtual void moveObserverDown(
double meters );
141 virtual void startMoveLevelObserverRight();
142 virtual void stopMoveLevelObserverRight();
143 virtual void moveLevelObserverRight(
double meters );
150 virtual void startMoveLevelObserverForward();
151 virtual void stopMoveLevelObserverForward();
152 virtual void moveLevelObserverForward(
double meters );
159 virtual void startMoveLevelObserverUp();
160 virtual void stopMoveLevelObserverUp();
161 virtual void moveLevelObserverUp(
double meters );
168 virtual void startMoveLevelObserverLeft();
169 virtual void stopMoveLevelObserverLeft();
170 virtual void moveLevelObserverLeft(
double meters );
177 virtual void startMoveLevelObserverBack();
178 virtual void stopMoveLevelObserverBack();
179 virtual void moveLevelObserverBack(
double meters );
185 virtual void startMoveLevelObserverDown();
186 virtual void stopMoveLevelObserverDown();
187 virtual void moveLevelObserverDown(
double meters );
193 virtual void startMoveAttachedRight();
194 virtual void stopMoveAttachedRight();
195 virtual void moveAttachedRight(
double meters );
200 virtual void startMoveAttachedForward();
201 virtual void stopMoveAttachedForward();
202 virtual void moveAttachedForward(
double meters );
208 virtual void startMoveAttachedUp();
209 virtual void stopMoveAttachedUp();
210 virtual void moveAttachedUp(
double meters );
216 virtual void startMoveAttachedLeft();
217 virtual void stopMoveAttachedLeft();
218 virtual void moveAttachedLeft(
double meters );
224 virtual void startMoveAttachedBack();
225 virtual void stopMoveAttachedBack();
226 virtual void moveAttachedBack(
double meters );
232 virtual void startMoveAttachedDown();
233 virtual void stopMoveAttachedDown();
234 virtual void moveAttachedDown(
double meters );
241 virtual void startMoveLevelAttachedRight();
242 virtual void stopMoveLevelAttachedRight();
243 virtual void moveLevelAttachedRight(
double meters );
250 virtual void startMoveLevelAttachedForward();
251 virtual void stopMoveLevelAttachedForward();
252 virtual void moveLevelAttachedForward(
double meters );
259 virtual void startMoveLevelAttachedUp();
260 virtual void stopMoveLevelAttachedUp();
261 virtual void moveLevelAttachedUp(
double meters );
268 virtual void startMoveLevelAttachedLeft();
269 virtual void stopMoveLevelAttachedLeft();
270 virtual void moveLevelAttachedLeft(
double meters );
277 virtual void startMoveLevelAttachedBack();
278 virtual void stopMoveLevelAttachedBack();
279 virtual void moveLevelAttachedBack(
double meters );
285 virtual void startMoveLevelAttachedDown();
286 virtual void stopMoveLevelAttachedDown();
287 virtual void moveLevelAttachedDown(
double meters );
293 virtual void startMoveAttachedContextRight();
294 virtual void stopMoveAttachedContextRight();
295 virtual void moveAttachedContextRight(
double meters );
301 virtual void startMoveAttachedContextForward();
302 virtual void stopMoveAttachedContextForward();
303 virtual void moveAttachedContextForward(
double meters );
309 virtual void startMoveAttachedContextUp();
310 virtual void stopMoveAttachedContextUp();
311 virtual void moveAttachedContextUp(
double meters );
317 virtual void startMoveAttachedContextLeft();
318 virtual void stopMoveAttachedContextLeft();
319 virtual void moveAttachedContextLeft(
double meters );
325 virtual void startMoveAttachedContextBack();
326 virtual void stopMoveAttachedContextBack();
327 virtual void moveAttachedContextBack(
double meters );
332 virtual void startMoveAttachedContextDown();
333 virtual void stopMoveAttachedContextDown();
334 virtual void moveAttachedContextDown(
double meters );
340 virtual void startYawLeft();
341 virtual void stopYawLeft();
348 virtual void startYawRight();
349 virtual void stopYawRight();
355 virtual void startPitchUp();
356 virtual void stopPitchUp();
357 virtual void rotatePitchUp(
double rads );
363 virtual void startPitchDown();
364 virtual void stopPitchDown();
365 virtual void rotatePitchDown(
double rads );
371 virtual void startRollLeft();
372 virtual void stopRollLeft();
378 virtual void startRollRight();
379 virtual void stopRollRight();
385 virtual void startLevelYawLeft();
386 virtual void stopLevelYawLeft();
393 virtual void startLevelYawRight();
394 virtual void stopLevelYawRight();
400 virtual void startLevelPitchUp();
401 virtual void stopLevelPitchUp();
407 virtual void startLevelPitchDown();
408 virtual void stopLevelPitchDown();
414 virtual void startLevelRollLeft();
415 virtual void stopLevelRollLeft();
421 virtual void startLevelRollRight();
422 virtual void stopLevelRollRight();
425 virtual void rotateLevelYawLeft(
double rads );
426 virtual void rotateLevelYawRight(
double rads );
428 virtual void startLookLeft();
429 virtual void stopLookLeft();
430 virtual void lookLeft(
double rads );
432 virtual void startLookRight();
433 virtual void stopLookRight();
434 virtual void lookRight(
double rads );
436 virtual void startLookUp();
437 virtual void stopLookUp();
438 virtual void lookUp(
double rads );
440 virtual void startLookDown();
441 virtual void stopLookDown();
442 virtual void lookDown(
double rads );
444 virtual void startLookTiltRight();
445 virtual void stopLookTiltRight();
446 virtual void lookTiltRight(
double rads );
448 virtual void startLookTiltLeft();
449 virtual void stopLookTiltLeft();
450 virtual void lookTiltLeft(
double rads );
455 virtual void startOrbitingLeft();
456 virtual void stopOrbitingLeft();
457 virtual void orbitLeft(
double rads );
463 virtual void startOrbitingRight();
464 virtual void stopOrbitingRight();
465 virtual void orbitRight(
double rads );
471 virtual void startOrbitingUp();
472 virtual void stopOrbitingUp();
473 virtual void orbitUp(
double rads );
479 virtual void startOrbitingDown();
480 virtual void stopOrbitingDown();
481 virtual void orbitDown(
double rads );
485 virtual void setLocation(
double x,
double y,
double z);
490 virtual void setAttachedLocation(
double x,
double y,
double z );
493 virtual void setOrientation(
double psi,
double theta,
double phi );
496 virtual void setOrientation(
double x,
double y,
double z,
double w);
499 virtual void setAttachedOrientation(
double psi,
double theta,
double phi );
502 virtual void setAttachedOrientation(
double x,
double y,
double z,
507 void setLocalModelScalingEnabled(
bool enabled );
511 void setLocalModelScalingAmount(
float amount );
515 virtual void jumpTo(
double x,
double y,
double z );
520 virtual void orientTo(
double x,
double y,
double z );
523 virtual void dragTerrain(
double lastX,
double lastY,
double lastZ,
524 double currX,
double currY,
double currZ );
526 virtual void dragTerrain2(
double myStartDragX,
double myStartDragY,
527 double myStartDragZ,
int deltaMouseX,
int deltaMouseY );
529 virtual void dragGravityUp(
double windowUnits );
530 virtual void dragGravityDown(
double windowUnits );
531 virtual void dragGravityLeft(
double windowUnits );
532 virtual void dragGravityRight(
double windowUnits );
533 virtual void scrollObserverForward(
int wheelUnits );
534 virtual void scrollObserverBack(
int wheelUnits );
535 virtual void scrollLevelObserverForward(
int wheelUnits );
536 virtual void scrollLevelObserverBack(
int wheelUnits );
540 virtual void startIncreasingViewResolution();
541 virtual void stopIncreasingViewResolution();
542 virtual void increaseViewResolution();
544 virtual void startDecreasingViewResolution();
545 virtual void stopDecreasingViewResolution();
546 virtual void decreaseViewResolution();
549 virtual void setViewResolution(
double resolution);
552 virtual double viewResolution()
const;
555 virtual void setViewMagnification(
double mag );
558 virtual double viewMagnification()
const;
567 virtual void setOrbitSpeed(
double speed );
570 virtual void setLinearSpeed(
double speed );
573 virtual void setRotationSpeed(
double speed );
576 virtual void setMinLinearSpeed(
double minSpeed );
579 virtual void setLinearScaledSpeedGain(
double gain );
586 virtual void gotoTerrainCenter(
DtUniqueID terrainPatch,
bool retry );
589 virtual void resetAttachment();
591 virtual void resetOrientation();
594 virtual void resetCamera();
595 virtual void level();
597 virtual void stopAll();
599 virtual void attachToObjects(
const std::vector<DtUniqueID>& elementIds );
600 virtual void setSecondaryAttachment(
const std::vector<DtUniqueID>& elementIds );
601 virtual void attachToPart(
int partId);
602 virtual void detach();
604 virtual void setHideModelOnAttach(
bool hide );
605 virtual void scaleCurrentAttachments(
bool scaled );
606 virtual void setOrientToTargetConstraint(
bool orient );
607 virtual void setOrbiting(
bool orbit );
608 virtual void setOrientCameraToTargetConstraint(
bool orient );
610 virtual void setConstrainToTerrain(
bool trueFalse );
611 virtual void setConstrainToCenter(
bool trueFalse );
615 virtual void suppressConstrainToTerrain(
bool trueFalse );
617 virtual void setSpeedScaling(
bool trueFalse );
620 virtual void setSpeedScaledSpeed(
double speed );
622 virtual void getLocation(
double &x,
double &y,
double& z )
const;
624 virtual void getOrientation(
double& psi,
double& theta,
double& phi )
const;
626 virtual void getOrientation(
double& x,
double& y,
double& z,
double& w )
const;
632 virtual double fixed2DAltitude();
636 virtual double heightAboveTerrainFromCurrentZoom();
640 virtual double topographicHeading()
const;
643 virtual void getLinearVelocity(
double &x,
double &y,
double &z)
const;
646 virtual void getRotationalVelocity(
double& x,
double& y,
double& z)
const;
651 virtual void setModeSetting(
int setting,
bool value );
654 virtual std::vector<DtUniqueID> currentAttachments()
const;
667 virtual bool attachedObjectHidden()
const;
671 virtual osg::Vec3d attachedOffsetVector()
const;
677 virtual double attachedNearClipOffset()
const;
680 virtual double heightAboveTerrain()
const;
692 virtual bool shouldOrientToGlobeCenter();
695 virtual void adjustToGlobeCurvature();
698 virtual bool shouldRotateGlobe();
702 virtual double zoomFromCurrentAltitude();
706 virtual double altitudeFromCurrentZoom();
708 virtual void calcObserverWorldVectors();
709 virtual const osg::Vec3d& observerWorldUp()
const;
710 virtual const osg::Vec3d& observerWorldNorth()
const;
711 virtual const osg::Vec3d& observerWorldEast()
const;
713 virtual const osg::Vec3d& attachedWorldUp()
const;
715 virtual osg::Vec3d& observerUp();
716 virtual osg::Vec3d& observerFront();
717 virtual osg::Vec3d& observerRight();
719 virtual osg::Vec3d& attachedUp();
720 virtual osg::Vec3d& attachedFront();
721 virtual osg::Vec3d& attachedRight();
723 virtual osg::Vec3d& attachedOffsetUp();
724 virtual osg::Vec3d& attachedOffsetFront();
725 virtual osg::Vec3d& attachedOffsetRight();
728 virtual osg::Vec3d& levelAttachedUp();
729 virtual osg::Vec3d& levelAttachedFront();
730 virtual osg::Vec3d& levelAttachedRight();
733 virtual osg::Vec3d& levelObserverMimicUp();
734 virtual osg::Vec3d& levelObserverMimicFront();
735 virtual osg::Vec3d& levelObserverMimicRight();
737 virtual osg::Vec3d& cameraUp();
738 virtual osg::Vec3d& cameraFront();
739 virtual osg::Vec3d& cameraRight();
741 virtual osg::Vec3d& levelObserverUp();
742 virtual osg::Vec3d& levelObserverFront();
743 virtual osg::Vec3d& levelObserverRight();
745 virtual void advanceOrbitLeft(
double rads );
746 virtual void advanceOrbitRight(
double rads );
747 virtual void advanceOrbitUp(
double rads );
748 virtual void advanceOrbitDown(
double rads );
750 virtual void makeLevelObserverMatrix();
753 virtual void calculateLevelAttachedRotation();
756 virtual void makeLevelObserverMimicMatrix();
761 virtual osg::Vec3d calcWorldPositionChange();
763 virtual osg::Vec3d calcMimicPositionChange();
764 virtual osg::Vec3d calcFollowPositionChange();
765 virtual osg::Vec3d calcSpaceFollowPositionChange();
766 virtual osg::Vec3d calcTetherPositionChange();
767 virtual osg::Vec3d calcTetherTrackPositionChange();
768 virtual osg::Vec3d calcTrackPositionChange();
769 virtual osg::Quat calcTetherTrackRotation();
771 virtual osg::Quat calcWorldOrientationChange();
772 virtual osg::Quat calcTetherOrientationChange();
773 virtual osg::Quat calcMimicOrientationChange();
774 virtual osg::Quat calcFollowOrientationChange();
776 virtual void setCurrentAttachmentsVisibility(
bool visible );
787 virtual void orientTo(
const osg::Vec3d& target );
790 virtual void orientCameraTo(
const osg::Vec3d& target );
792 virtual TerrainResult getTerrainCenter(
const DtUniqueID& patchID, osg::Vec3d& center );
797 virtual void initializeAttachment();
799 virtual void getScalingIntersection();
800 virtual void getViewIntersection();
803 virtual double linearSpeed();
806 virtual double speedScalingGain()
const;
808 virtual void calcTerrainConstraint( osg::Vec3d prev );
815 virtual bool updateAttachPositionAndOrientation();
817 virtual bool getSecondaryAttachPosition( osg::Vec3d& position );
819 virtual void getObserverOffsetVector(
double& x,
double& y,
double& z )
const;
820 virtual void setObserverOffsetVector(
double x,
double y,
double z );
822 virtual void getAttachedRotationOffset(
double& x,
double& y,
double& z,
double& w )
const;
823 virtual void setAttachedRotationOffset(
double x,
double y,
double z,
827 osg::Vec3& bvolExtents, osg::Vec3d& bvolCenter );
830 osg::Vec3& bvolExtents, osg::Vec3d& bvolCenter );
832 virtual void setLocation(
const osg::Vec3d& location,
bool suppress=
true );
834 virtual bool isMoving()
const;
835 virtual bool isRotating()
const;
837 virtual double computeNearClipDistance(
DtSceneObject* sceneObject );
838 virtual float computeLocalModelScalingAmount(
DtSceneObject* sceneObject );
840 virtual void calcScaledSpeed();
841 virtual bool getTerrainOrPropIntersection(
const osg::Vec3d& startPos,
842 const osg::Vec3d& endPos, osg::Vec3d& result )
const;
850 virtual void getPositionAndOrientation(
DtSceneObject& sceneObject, osg::Vec3d& position,
851 osg::Vec3d& orientToPosition, osg::Quat& orientation );
853 virtual void getPositionAndOrientation(
DtTerrainPatchObject& patchObject, osg::Vec3d& position,
854 osg::Vec3d& orientToPosition, osg::Quat& orientation );
857 virtual void getPositionFromSceneObject(
DtSceneObject& sceneObject, osg::Vec3d& position )
const;
861 virtual bool getPartPositionOriFromSceneObject(
DtSceneObject& sceneObject,
862 int partId, osg::Vec3d& position, osg::Quat& ori )
const;
866 virtual void force2D();
869 virtual void dimensionChanged(
bool is2D );
870 virtual void setIs2D(
bool is2D );
873 virtual double calculate3DAltitude()
const;
876 virtual void calculateAltitude();
880 virtual double zoomFromAltitude(
double altitude );
884 virtual double zoomFromHeightAboveTerrain(
double hat );
886 virtual double calcEarthRadiusAtLocalCoord(
const osg::Vec3d& local )
const;
890 virtual void synchronizeLocation(
double x,
double y,
double z );
894 virtual void synchronizeOrientation(
double x,
double y,
double z,
double w );
896 virtual void calcHeightAboveTerrain();
900 std::list<DtChannel*> findChannels();
904 double heightToZoomRatio();
1032 inline void applyMovement(
double linearDistance)
1034 if(moving(Right)) myAdvance[0] += linearDistance;
1035 if(moving(Left)) myAdvance[0] -= linearDistance;
1036 if(moving(Forward)) myAdvance[1] += linearDistance;
1037 if(moving(Backward)) myAdvance[1] -= linearDistance;
1038 if(moving(Up)) myAdvance[2] += linearDistance;
1039 if(moving(Down)) myAdvance[2] -= linearDistance;
1043 inline const osg::Vec3d& advance()
const
1051 myAdvance.set(0.0,0.0,0.0);
1052 myEuler.set(0.0,0.0,0.0);
1055 inline void clearAdvance()
1057 myAdvance.set(0.0,0.0,0.0);
1060 inline bool stopped()
1062 return myState == Stopped;
1065 inline bool moving()
const
1067 return myState != Stopped;
1072 return (myState & d) != 0;
1077 myState = moving ? myState | d : myState & ~d;
1090 inline void applyRotation(
double angle)
1092 if(rotating(YawRight)) myEuler[0] -= angle;
1093 if(rotating(YawLeft)) myEuler[0] += angle;
1094 if(rotating(PitchUp)) myEuler[1] += angle;
1095 if(rotating(PitchDown)) myEuler[1] -= angle;
1096 if(rotating(RollRight)) myEuler[2] += angle;
1097 if(rotating(RollLeft)) myEuler[2] -= angle;
1100 inline const osg::Vec3d& euler()
const
1105 inline osg::Vec3d& euler()
1112 myEuler.set(0.0,0.0,0.0);
1115 inline bool rotating()
const
1117 return myState != Stopped;
1122 return (myState & d) != 0;
1125 inline void setRotating(
Angle d,
bool rotating )
1127 myState = rotating ? myState | d : myState & ~d;