18 #include <boost/unordered_map.hpp>
20 #include <osg/Matrixd>
37 class DtCoordinateConverter;
39 class DtTerrainPatchObject;
40 class DtAgentUpdateResolverInterface;
52 TerrainResultNoData = 0,
64 virtual void tick(
double simTime );
67 virtual void tickAttachment();
71 virtual void setModelSet(
int modelSet );
74 virtual double altitude()
const;
76 virtual void setNameAndRegister(
const std::string& name );
78 virtual void getCameraPositionAndOrientation( osg::Vec3d& position,
79 osg::Quat& rotation )
const;
82 static void matrixdToTaitBryan(
const osg::Matrixd& mat, DtTaitBryan& tb,
bool isWorld2D =
false );
83 static double clampUnity(
double x );
95 virtual void startMoveObserverRight();
96 virtual void stopMoveObserverRight();
97 virtual void moveObserverRight(
double meters );
102 virtual void startMoveObserverForward();
103 virtual void stopMoveObserverForward();
104 virtual void moveObserverForward(
double meters );
110 virtual void startMoveObserverUp();
111 virtual void stopMoveObserverUp();
112 virtual void moveObserverUp(
double meters );
118 virtual void startMoveObserverLeft();
119 virtual void stopMoveObserverLeft();
120 virtual void moveObserverLeft(
double meters );
126 virtual void startMoveObserverBack();
127 virtual void stopMoveObserverBack();
128 virtual void moveObserverBack(
double meters );
134 virtual void startMoveObserverDown();
135 virtual void stopMoveObserverDown();
136 virtual void moveObserverDown(
double meters );
143 virtual void startMoveLevelObserverRight();
144 virtual void stopMoveLevelObserverRight();
145 virtual void moveLevelObserverRight(
double meters );
152 virtual void startMoveLevelObserverForward();
153 virtual void stopMoveLevelObserverForward();
154 virtual void moveLevelObserverForward(
double meters );
161 virtual void startMoveLevelObserverUp();
162 virtual void stopMoveLevelObserverUp();
163 virtual void moveLevelObserverUp(
double meters );
170 virtual void startMoveLevelObserverLeft();
171 virtual void stopMoveLevelObserverLeft();
172 virtual void moveLevelObserverLeft(
double meters );
179 virtual void startMoveLevelObserverBack();
180 virtual void stopMoveLevelObserverBack();
181 virtual void moveLevelObserverBack(
double meters );
187 virtual void startMoveLevelObserverDown();
188 virtual void stopMoveLevelObserverDown();
189 virtual void moveLevelObserverDown(
double meters );
195 virtual void startMoveAttachedRight();
196 virtual void stopMoveAttachedRight();
197 virtual void moveAttachedRight(
double meters );
202 virtual void startMoveAttachedForward();
203 virtual void stopMoveAttachedForward();
204 virtual void moveAttachedForward(
double meters );
210 virtual void startMoveAttachedUp();
211 virtual void stopMoveAttachedUp();
212 virtual void moveAttachedUp(
double meters );
218 virtual void startMoveAttachedLeft();
219 virtual void stopMoveAttachedLeft();
220 virtual void moveAttachedLeft(
double meters );
226 virtual void startMoveAttachedBack();
227 virtual void stopMoveAttachedBack();
228 virtual void moveAttachedBack(
double meters );
234 virtual void startMoveAttachedDown();
235 virtual void stopMoveAttachedDown();
236 virtual void moveAttachedDown(
double meters );
243 virtual void startMoveLevelAttachedRight();
244 virtual void stopMoveLevelAttachedRight();
245 virtual void moveLevelAttachedRight(
double meters );
252 virtual void startMoveLevelAttachedForward();
253 virtual void stopMoveLevelAttachedForward();
254 virtual void moveLevelAttachedForward(
double meters );
261 virtual void startMoveLevelAttachedUp();
262 virtual void stopMoveLevelAttachedUp();
263 virtual void moveLevelAttachedUp(
double meters );
270 virtual void startMoveLevelAttachedLeft();
271 virtual void stopMoveLevelAttachedLeft();
272 virtual void moveLevelAttachedLeft(
double meters );
279 virtual void startMoveLevelAttachedBack();
280 virtual void stopMoveLevelAttachedBack();
281 virtual void moveLevelAttachedBack(
double meters );
287 virtual void startMoveLevelAttachedDown();
288 virtual void stopMoveLevelAttachedDown();
289 virtual void moveLevelAttachedDown(
double meters );
295 virtual void startMoveAttachedContextRight();
296 virtual void stopMoveAttachedContextRight();
297 virtual void moveAttachedContextRight(
double meters );
303 virtual void startMoveAttachedContextForward();
304 virtual void stopMoveAttachedContextForward();
305 virtual void moveAttachedContextForward(
double meters );
311 virtual void startMoveAttachedContextUp();
312 virtual void stopMoveAttachedContextUp();
313 virtual void moveAttachedContextUp(
double meters );
319 virtual void startMoveAttachedContextLeft();
320 virtual void stopMoveAttachedContextLeft();
321 virtual void moveAttachedContextLeft(
double meters );
327 virtual void startMoveAttachedContextBack();
328 virtual void stopMoveAttachedContextBack();
329 virtual void moveAttachedContextBack(
double meters );
334 virtual void startMoveAttachedContextDown();
335 virtual void stopMoveAttachedContextDown();
336 virtual void moveAttachedContextDown(
double meters );
342 virtual void startYawLeft();
343 virtual void stopYawLeft();
344 virtual void rotateYawLeft(
double rads);
351 virtual void startYawRight();
352 virtual void stopYawRight();
353 virtual void rotateYawRight(
double rads);
359 virtual void startPitchUp();
360 virtual void stopPitchUp();
361 virtual void rotatePitchUp(
double rads );
362 virtual void rotateFlashlightPitchUp(
double rads );
368 virtual void startPitchDown();
369 virtual void stopPitchDown();
370 virtual void rotatePitchDown(
double rads );
371 virtual void rotateFlashlightPitchDown(
double rads );
377 virtual void startRollLeft();
378 virtual void stopRollLeft();
379 virtual void rollLeft(
double rads);
385 virtual void startRollRight();
386 virtual void stopRollRight();
387 virtual void rollRight(
double rads);
393 virtual void startLevelYawLeft();
394 virtual void stopLevelYawLeft();
401 virtual void startLevelYawRight();
402 virtual void stopLevelYawRight();
408 virtual void startLevelPitchUp();
409 virtual void stopLevelPitchUp();
410 virtual void rotateLevelPitchUp(
double rads);
416 virtual void startLevelPitchDown();
417 virtual void stopLevelPitchDown();
418 virtual void rotateLevelPitchDown(
double rads);
424 virtual void startLevelRollLeft();
425 virtual void stopLevelRollLeft();
426 virtual void rollLevelLeft(
double rads);
432 virtual void startLevelRollRight();
433 virtual void stopLevelRollRight();
434 virtual void rollLevelRight(
double rads);
437 virtual void rotateLevelYawLeft(
double rads );
438 virtual void rotateLevelYawRight(
double rads );
439 virtual void rotateFlashlightYawLeft(
double rads );
440 virtual void rotateFlashlightYawRight(
double rads );
442 virtual void startLookLeft();
443 virtual void stopLookLeft();
444 virtual void lookLeft(
double rads );
446 virtual void startLookRight();
447 virtual void stopLookRight();
448 virtual void lookRight(
double rads );
450 virtual void startLookUp();
451 virtual void stopLookUp();
452 virtual void lookUp(
double rads );
454 virtual void startLookDown();
455 virtual void stopLookDown();
456 virtual void lookDown(
double rads );
458 virtual void startLookTiltRight();
459 virtual void stopLookTiltRight();
460 virtual void lookTiltRight(
double rads );
462 virtual void startLookTiltLeft();
463 virtual void stopLookTiltLeft();
464 virtual void lookTiltLeft(
double rads );
469 virtual void startOrbitingLeft();
470 virtual void stopOrbitingLeft();
471 virtual void orbitLeft(
double rads );
477 virtual void startOrbitingRight();
478 virtual void stopOrbitingRight();
479 virtual void orbitRight(
double rads );
485 virtual void startOrbitingUp();
486 virtual void stopOrbitingUp();
487 virtual void orbitUp(
double rads );
493 virtual void startOrbitingDown();
494 virtual void stopOrbitingDown();
495 virtual void orbitDown(
double rads );
499 virtual void setLocation(
double x,
double y,
double z);
504 virtual void setAttachedLocation(
double x,
double y,
double z );
507 virtual void setOrientation(
double psi,
double theta,
double phi );
510 virtual void setTopographicOrientation(
double psi,
double theta,
double phi );
513 virtual void setOrientation(
double x,
double y,
double z,
double w);
516 virtual void setAttachedOrientation(
double psi,
double theta,
double phi );
519 virtual void setAttachedOrientation(
double x,
double y,
double z,
524 void setLocalModelScalingEnabled(
bool enabled );
528 void setLocalModelScalingAmount(
float amount );
532 virtual void jumpTo(
double x,
double y,
double z );
537 virtual void orientTo(
double x,
double y,
double z );
540 virtual void dragTerrain(
double lastX,
double lastY,
double lastZ,
541 double currX,
double currY,
double currZ );
543 virtual void dragTerrain2(
double myStartDragX,
double myStartDragY,
544 double myStartDragZ,
int deltaMouseX,
int deltaMouseY );
546 virtual void dragGravityUp(
double windowUnits );
547 virtual void dragGravityDown(
double windowUnits );
548 virtual void dragGravityLeft(
double windowUnits );
549 virtual void dragGravityRight(
double windowUnits );
550 virtual void scrollObserverForward(
int wheelUnits );
551 virtual void scrollObserverBack(
int wheelUnits );
552 virtual void scrollLevelObserverForward(
int wheelUnits );
553 virtual void scrollLevelObserverBack(
int wheelUnits );
555 virtual void scrollFlashlightWider(
int wheelUnits );
556 virtual void scrollFlashlightNarrower(
int wheelUnits );
559 virtual float flashlightAngle();
563 virtual void startIncreasingViewResolution();
564 virtual void stopIncreasingViewResolution();
565 virtual void increaseViewResolution();
567 virtual void startDecreasingViewResolution();
568 virtual void stopDecreasingViewResolution();
569 virtual void decreaseViewResolution();
572 virtual void setViewResolution(
double resolution);
575 virtual double viewResolution()
const;
582 virtual void setCurrentViewMagnification(
double mag );
585 virtual double currentViewMagnification()
const;
594 virtual void setOrbitSpeed(
double speed );
597 virtual void setLinearSpeed(
double speed );
600 virtual void setRotationSpeed(
double speed );
603 virtual void setMinLinearSpeed(
double minSpeed );
606 virtual void setMaxLinearSpeed(
double maxSpeed );
609 virtual void setLinearScaledSpeedGain(
double gain );
616 virtual void gotoTerrainCenter(
DtUniqueID terrainPatch,
bool retry );
619 virtual void resetAttachment();
621 virtual void resetOrientation();
624 virtual void resetCamera();
625 virtual void level();
627 virtual void stopAll();
629 virtual void attachToObjects(
const std::vector<DtUniqueID>& elementIds );
630 virtual void setSecondaryAttachment(
const std::vector<DtUniqueID>& elementIds );
631 virtual void setLocationTrackAttachment(
const osg::Vec3d& location );
632 virtual void setLocationTrackAttachment(
double x,
double y,
double z );
634 virtual void attachToPart(
int partId);
635 virtual void detach();
637 virtual void setHideModelOnAttach(
bool hide );
642 virtual void setAttachmentHas3DCockpit(
bool cockpit );
644 virtual void scaleCurrentAttachments(
bool scaled );
645 virtual void setOrientToTargetConstraint(
bool orient );
646 virtual void setOrbiting(
bool orbit );
647 virtual void setOrientCameraToTargetConstraint(
bool orient );
649 virtual void setConstrainToTerrain(
bool trueFalse );
650 virtual void setConstrainToCenter(
bool trueFalse );
654 virtual void suppressConstrainToTerrain(
bool trueFalse );
656 virtual void setSpeedScaling(
bool trueFalse );
659 virtual void setSpeedScaledSpeed(
double speed );
661 virtual void getLocation(
double &x,
double &y,
double& z )
const;
664 virtual void getOrientation(
double& psi,
double& theta,
double& phi )
const;
667 virtual void getTopographicOrientation(
double& psi,
double& theta,
double& phi )
const;
669 virtual void getOrientation(
double& x,
double& y,
double& z,
double& w )
const;
671 virtual void getFlashlightOrientation(
double& x,
double& y,
double& z,
double& w )
const;
675 virtual void getObserverPlatformFront(
double& x,
double& y,
double& z)
const;
679 virtual void getObserverPlatformUp(
double& x,
double& y,
double& z)
const;
683 virtual void getObserverPlatformRight(
double& x,
double& y,
double& z)
const;
687 virtual void getObserverFront(
double& x,
double& y,
double& z)
const;
690 virtual void getObserverUp(
double& x,
double& y,
double& z)
const;
693 virtual void getObserverRight(
double& x,
double& y,
double& z)
const;
695 virtual void getCameraUp(
double& x,
double& y,
double& z);
697 virtual void getCameraFront(
double& x,
double& y,
double& z);
699 virtual void getCameraRight(
double& x,
double& y,
double& z);
702 virtual void setCameraShakeRotation(
double x,
double y,
double z,
double w);
705 virtual void getCameraShakeRotation(
double& x,
double& y,
double& z,
double& w);;
710 virtual double fixed2DAltitude();
714 virtual double heightAboveTerrainFromCurrentZoom();
718 virtual double topographicHeading()
const;
721 virtual void getLinearVelocity(
double &x,
double &y,
double &z)
const;
724 virtual void getRotationalVelocity(
double& x,
double& y,
double& z)
const;
729 virtual void setModeSetting(
int setting,
bool value );
732 virtual std::vector<DtUniqueID> currentAttachments()
const;
737 virtual const osg::Vec3d& locationTrackAttachmentVec3d()
const;
738 virtual void getLocationTrackAttachment(
double& x,
double& y,
double& z )
const;
752 virtual bool attachedObjectHidden()
const;
757 virtual bool attachmentHas3DCockpit()
const;
761 virtual osg::Vec3d attachedOffsetVector()
const;
767 virtual double attachedNearClipOffset()
const;
770 virtual double heightAboveTerrain()
const;
782 virtual bool shouldOrientToGlobeCenter();
785 virtual void adjustToGlobeCurvature();
788 virtual bool shouldRotateGlobe();
792 virtual double zoomFromCurrentAltitude();
796 virtual double altitudeFromCurrentZoom();
798 virtual void calcObserverWorldVectors();
799 virtual const osg::Vec3d& observerWorldUp()
const;
800 virtual const osg::Vec3d& observerWorldNorth()
const;
801 virtual const osg::Vec3d& observerWorldEast()
const;
803 virtual const osg::Vec3d& attachedWorldUp()
const;
805 virtual osg::Vec3d& observerUp();
806 virtual osg::Vec3d& observerFront();
807 virtual osg::Vec3d& observerRight();
808 virtual void observerBasis(osg::Vec3d& up, osg::Vec3d& front, osg::Vec3d& right);
810 virtual osg::Vec3d& attachedUp();
811 virtual osg::Vec3d& attachedFront();
812 virtual osg::Vec3d& attachedRight();
814 virtual osg::Vec3d& attachedOffsetUp();
815 virtual osg::Vec3d& attachedOffsetFront();
816 virtual osg::Vec3d& attachedOffsetRight();
819 virtual osg::Vec3d& levelAttachedUp();
820 virtual osg::Vec3d& levelAttachedFront();
821 virtual osg::Vec3d& levelAttachedRight();
824 virtual osg::Vec3d& levelObserverMimicUp();
825 virtual osg::Vec3d& levelObserverMimicFront();
826 virtual osg::Vec3d& levelObserverMimicRight();
828 virtual osg::Vec3d& cameraUp();
829 virtual osg::Vec3d& cameraFront();
830 virtual osg::Vec3d& cameraRight();
832 virtual osg::Vec3d& levelObserverUp();
833 virtual osg::Vec3d& levelObserverFront();
834 virtual osg::Vec3d& levelObserverRight();
836 virtual void advanceOrbitLeft(
double rads );
837 virtual void advanceOrbitRight(
double rads );
838 virtual void advanceOrbitUp(
double rads );
839 virtual void advanceOrbitDown(
double rads );
841 virtual void makeLevelObserverMatrix();
844 virtual void calculateLevelAttachedRotation();
847 virtual void makeLevelObserverMimicMatrix();
852 virtual osg::Vec3d calcWorldPositionChange();
854 virtual osg::Vec3d calcMimicPositionChange();
856 virtual osg::Vec3d calcAttachedPosition(
const osg::Quat& attInverse,
const osg::Vec3d& attachedAdvance);
857 virtual osg::Vec3d calcAttachedAdvance(
const osg::Quat& tetherTrackInverse);
859 virtual osg::Vec3d calcFollowPositionChange();
860 virtual osg::Vec3d calcSpaceFollowPositionChange();
861 virtual osg::Vec3d calcTetherPositionChange();
862 virtual osg::Vec3d calcTetherTrackPositionChange();
864 virtual osg::Vec3d calcTrackPositionChange();
865 virtual osg::Quat calcTetherTrackRotation();
867 virtual osg::Quat calcFlashlightOrientationChange();
868 virtual osg::Quat calcWorldOrientationChange();
869 virtual osg::Quat calcTetherOrientationChange();
870 virtual osg::Quat calcMimicOrientationChange();
871 virtual osg::Quat calcFollowOrientationChange();
873 virtual void setCurrentAttachmentsVisibility(
bool visible );
884 virtual void orientTo(
const osg::Vec3d& target );
887 virtual void orientCameraTo(
const osg::Vec3d& target );
889 virtual TerrainResult getTerrainCenter(
const DtUniqueID& patchID, osg::Vec3d& center );
894 virtual void initializeAttachment();
896 virtual void getScalingIntersection();
897 virtual void getViewIntersection();
900 virtual double linearSpeed();
903 virtual double speedScalingGain()
const;
905 virtual void calcTerrainConstraint(
const osg::Vec3d& prev );
912 virtual bool updateAttachPositionAndOrientation();
914 virtual bool getSecondaryAttachPosition( osg::Vec3d& position );
916 virtual void getObserverOffsetVector(
double& x,
double& y,
double& z )
const;
917 virtual void setObserverOffsetVector(
double x,
double y,
double z );
919 virtual void getAttachedRotationOffset(
double& x,
double& y,
double& z,
double& w )
const;
920 virtual void setAttachedRotationOffset(
double x,
double y,
double z,
924 osg::Vec3& bvolExtents, osg::Vec3d& bvolCenter );
927 osg::Vec3& bvolExtents, osg::Vec3d& bvolCenter );
929 virtual void setLocation(
const osg::Vec3d& location,
bool suppress=
true );
931 virtual bool isMoving()
const;
932 virtual bool isRotating()
const;
934 virtual double computeNearClipDistance(
DtSceneObject* sceneObject );
935 virtual float computeLocalModelScalingAmount(
DtSceneObject* sceneObject );
937 virtual void calcScaledSpeed();
938 virtual bool getTerrainOrPropIntersection(
const osg::Vec3d& startPos,
939 const osg::Vec3d& endPos, osg::Vec3d& result )
const;
948 virtual void getPositionAndOrientation(
DtSceneObject& sceneObject, osg::Vec3d& position,
949 osg::Vec3d& orientToPosition, osg::Quat& orientation );
951 virtual void getPositionAndOrientation(
DtTerrainPatchObject& patchObject, osg::Vec3d& position,
952 osg::Vec3d& orientToPosition, osg::Quat& orientation );
954 virtual void getPositionAndOrientation(
DtOsgObserverObject& observerObject, osg::Vec3d& position,
955 osg::Vec3d& orientToPosition, osg::Quat& orientation );
958 virtual void getPositionFromSceneObject(
DtSceneObject& sceneObject, osg::Vec3d& position )
const;
961 virtual void getPositionFromObserverObject(
DtOsgObserverObject& observerObject, osg::Vec3d& position )
const;
965 virtual bool getPartPositionOriFromSceneObject(
DtSceneObject& sceneObject,
966 int partId, osg::Vec3d& position, osg::Quat& ori )
const;
970 virtual void force2D();
973 virtual void dimensionChanged(
bool is2D );
974 virtual void setIs2D(
bool is2D );
977 virtual double calculate3DAltitude()
const;
980 virtual void calculateAltitude();
984 virtual double zoomFromAltitude(
double altitude );
988 virtual double zoomFromHeightAboveTerrain(
double hat );
990 virtual double calcEarthRadiusAtLocalCoord(
const osg::Vec3d& local )
const;
994 virtual void synchronizeLocation(
double x,
double y,
double z );
998 virtual void synchronizeOrientation(
double x,
double y,
double z,
double w );
1000 virtual void calcHeightAboveTerrain();
1004 std::list<DtChannel*> findChannels();
1008 double heightToZoomRatio();
1138 inline void applyMovement(
double linearDistance)
1140 if(moving(Right)) myAdvance[0] += linearDistance;
1141 if(moving(Left)) myAdvance[0] -= linearDistance;
1142 if(moving(Forward)) myAdvance[1] += linearDistance;
1143 if(moving(Backward)) myAdvance[1] -= linearDistance;
1144 if(moving(Up)) myAdvance[2] += linearDistance;
1145 if(moving(Down)) myAdvance[2] -= linearDistance;
1149 inline const osg::Vec3d& advance()
const
1157 myAdvance.set(0.0,0.0,0.0);
1158 myEuler.set(0.0,0.0,0.0);
1161 inline void clearAdvance()
1163 myAdvance.set(0.0,0.0,0.0);
1166 inline bool stopped()
1168 return myState == Stopped;
1171 inline bool moving()
const
1173 return myState != Stopped;
1178 return (myState & d) != 0;
1183 myState = moving ? myState | d : myState & ~d;
1196 inline void applyRotation(
double angle)
1198 if(rotating(YawRight)) myEuler[0] -= angle;
1199 if(rotating(YawLeft)) myEuler[0] += angle;
1200 if(rotating(PitchUp)) myEuler[1] += angle;
1201 if(rotating(PitchDown)) myEuler[1] -= angle;
1202 if(rotating(RollRight)) myEuler[2] += angle;
1203 if(rotating(RollLeft)) myEuler[2] -= angle;
1206 inline const osg::Vec3d& euler()
const
1211 inline osg::Vec3d& euler()
1218 myEuler.set(0.0,0.0,0.0);
1221 inline bool rotating()
const
1223 return myState != Stopped;
1228 return (myState & d) != 0;
1231 inline void setRotating(
Angle d,
bool rotating )
1233 myState = rotating ? myState | d : myState & ~d;