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();
350 virtual void startYawRight();
351 virtual void stopYawRight();
357 virtual void startPitchUp();
358 virtual void stopPitchUp();
359 virtual void rotatePitchUp(
double rads );
360 virtual void rotateFlashlightPitchUp(
double rads );
366 virtual void startPitchDown();
367 virtual void stopPitchDown();
368 virtual void rotatePitchDown(
double rads );
369 virtual void rotateFlashlightPitchDown(
double rads );
375 virtual void startRollLeft();
376 virtual void stopRollLeft();
382 virtual void startRollRight();
383 virtual void stopRollRight();
389 virtual void startLevelYawLeft();
390 virtual void stopLevelYawLeft();
397 virtual void startLevelYawRight();
398 virtual void stopLevelYawRight();
404 virtual void startLevelPitchUp();
405 virtual void stopLevelPitchUp();
411 virtual void startLevelPitchDown();
412 virtual void stopLevelPitchDown();
418 virtual void startLevelRollLeft();
419 virtual void stopLevelRollLeft();
425 virtual void startLevelRollRight();
426 virtual void stopLevelRollRight();
429 virtual void rotateLevelYawLeft(
double rads );
430 virtual void rotateLevelYawRight(
double rads );
431 virtual void rotateFlashlightYawLeft(
double rads );
432 virtual void rotateFlashlightYawRight(
double rads );
434 virtual void startLookLeft();
435 virtual void stopLookLeft();
436 virtual void lookLeft(
double rads );
438 virtual void startLookRight();
439 virtual void stopLookRight();
440 virtual void lookRight(
double rads );
442 virtual void startLookUp();
443 virtual void stopLookUp();
444 virtual void lookUp(
double rads );
446 virtual void startLookDown();
447 virtual void stopLookDown();
448 virtual void lookDown(
double rads );
450 virtual void startLookTiltRight();
451 virtual void stopLookTiltRight();
452 virtual void lookTiltRight(
double rads );
454 virtual void startLookTiltLeft();
455 virtual void stopLookTiltLeft();
456 virtual void lookTiltLeft(
double rads );
461 virtual void startOrbitingLeft();
462 virtual void stopOrbitingLeft();
463 virtual void orbitLeft(
double rads );
469 virtual void startOrbitingRight();
470 virtual void stopOrbitingRight();
471 virtual void orbitRight(
double rads );
477 virtual void startOrbitingUp();
478 virtual void stopOrbitingUp();
479 virtual void orbitUp(
double rads );
485 virtual void startOrbitingDown();
486 virtual void stopOrbitingDown();
487 virtual void orbitDown(
double rads );
491 virtual void setLocation(
double x,
double y,
double z);
496 virtual void setAttachedLocation(
double x,
double y,
double z );
499 virtual void setOrientation(
double psi,
double theta,
double phi );
502 virtual void setTopographicOrientation(
double psi,
double theta,
double phi );
505 virtual void setOrientation(
double x,
double y,
double z,
double w);
508 virtual void setAttachedOrientation(
double psi,
double theta,
double phi );
511 virtual void setAttachedOrientation(
double x,
double y,
double z,
516 void setLocalModelScalingEnabled(
bool enabled );
520 void setLocalModelScalingAmount(
float amount );
524 virtual void jumpTo(
double x,
double y,
double z );
529 virtual void orientTo(
double x,
double y,
double z );
532 virtual void dragTerrain(
double lastX,
double lastY,
double lastZ,
533 double currX,
double currY,
double currZ );
535 virtual void dragTerrain2(
double myStartDragX,
double myStartDragY,
536 double myStartDragZ,
int deltaMouseX,
int deltaMouseY );
538 virtual void dragGravityUp(
double windowUnits );
539 virtual void dragGravityDown(
double windowUnits );
540 virtual void dragGravityLeft(
double windowUnits );
541 virtual void dragGravityRight(
double windowUnits );
542 virtual void scrollObserverForward(
int wheelUnits );
543 virtual void scrollObserverBack(
int wheelUnits );
544 virtual void scrollLevelObserverForward(
int wheelUnits );
545 virtual void scrollLevelObserverBack(
int wheelUnits );
547 virtual void scrollFlashlightWider(
int wheelUnits );
548 virtual void scrollFlashlightNarrower(
int wheelUnits );
551 virtual float flashlightAngle();
555 virtual void startIncreasingViewResolution();
556 virtual void stopIncreasingViewResolution();
557 virtual void increaseViewResolution();
559 virtual void startDecreasingViewResolution();
560 virtual void stopDecreasingViewResolution();
561 virtual void decreaseViewResolution();
564 virtual void setViewResolution(
double resolution);
567 virtual double viewResolution()
const;
574 virtual void setCurrentViewMagnification(
double mag );
577 virtual double currentViewMagnification()
const;
586 virtual void setOrbitSpeed(
double speed );
589 virtual void setLinearSpeed(
double speed );
592 virtual void setRotationSpeed(
double speed );
595 virtual void setMinLinearSpeed(
double minSpeed );
598 virtual void setMaxLinearSpeed(
double maxSpeed );
601 virtual void setLinearScaledSpeedGain(
double gain );
608 virtual void gotoTerrainCenter(
DtUniqueID terrainPatch,
bool retry );
611 virtual void resetAttachment();
613 virtual void resetOrientation();
616 virtual void resetCamera();
617 virtual void level();
619 virtual void stopAll();
621 virtual void attachToObjects(
const std::vector<DtUniqueID>& elementIds );
622 virtual void setSecondaryAttachment(
const std::vector<DtUniqueID>& elementIds );
623 virtual void setLocationTrackAttachment(
const osg::Vec3d& location );
624 virtual void setLocationTrackAttachment(
double x,
double y,
double z );
626 virtual void attachToPart(
int partId);
627 virtual void detach();
629 virtual void setHideModelOnAttach(
bool hide );
634 virtual void setAttachmentHas3DCockpit(
bool cockpit );
636 virtual void scaleCurrentAttachments(
bool scaled );
637 virtual void setOrientToTargetConstraint(
bool orient );
638 virtual void setOrbiting(
bool orbit );
639 virtual void setOrientCameraToTargetConstraint(
bool orient );
641 virtual void setConstrainToTerrain(
bool trueFalse );
642 virtual void setConstrainToCenter(
bool trueFalse );
646 virtual void suppressConstrainToTerrain(
bool trueFalse );
648 virtual void setSpeedScaling(
bool trueFalse );
651 virtual void setSpeedScaledSpeed(
double speed );
653 virtual void getLocation(
double &x,
double &y,
double& z )
const;
656 virtual void getOrientation(
double& psi,
double& theta,
double& phi )
const;
659 virtual void getTopographicOrientation(
double& psi,
double& theta,
double& phi )
const;
661 virtual void getOrientation(
double& x,
double& y,
double& z,
double& w )
const;
663 virtual void getFlashlightOrientation(
double& x,
double& y,
double& z,
double& w )
const;
665 virtual void getCameraUp(
double& x,
double& y,
double& z);
667 virtual void getCameraFront(
double& x,
double& y,
double& z);
669 virtual void getCameraRight(
double& x,
double& y,
double& z);
672 virtual void setCameraShakeRotation(
double x,
double y,
double z,
double w);
675 virtual void getCameraShakeRotation(
double& x,
double& y,
double& z,
double& w);;
680 virtual double fixed2DAltitude();
684 virtual double heightAboveTerrainFromCurrentZoom();
688 virtual double topographicHeading()
const;
691 virtual void getLinearVelocity(
double &x,
double &y,
double &z)
const;
694 virtual void getRotationalVelocity(
double& x,
double& y,
double& z)
const;
699 virtual void setModeSetting(
int setting,
bool value );
702 virtual std::vector<DtUniqueID> currentAttachments()
const;
707 virtual const osg::Vec3d& locationTrackAttachmentVec3d()
const;
708 virtual void getLocationTrackAttachment(
double& x,
double& y,
double& z )
const;
722 virtual bool attachedObjectHidden()
const;
727 virtual bool attachmentHas3DCockpit()
const;
731 virtual osg::Vec3d attachedOffsetVector()
const;
737 virtual double attachedNearClipOffset()
const;
740 virtual double heightAboveTerrain()
const;
752 virtual bool shouldOrientToGlobeCenter();
755 virtual void adjustToGlobeCurvature();
758 virtual bool shouldRotateGlobe();
762 virtual double zoomFromCurrentAltitude();
766 virtual double altitudeFromCurrentZoom();
768 virtual void calcObserverWorldVectors();
769 virtual const osg::Vec3d& observerWorldUp()
const;
770 virtual const osg::Vec3d& observerWorldNorth()
const;
771 virtual const osg::Vec3d& observerWorldEast()
const;
773 virtual const osg::Vec3d& attachedWorldUp()
const;
775 virtual osg::Vec3d& observerUp();
776 virtual osg::Vec3d& observerFront();
777 virtual osg::Vec3d& observerRight();
778 virtual void observerBasis(osg::Vec3d& up, osg::Vec3d& front, osg::Vec3d& right);
780 virtual osg::Vec3d& attachedUp();
781 virtual osg::Vec3d& attachedFront();
782 virtual osg::Vec3d& attachedRight();
784 virtual osg::Vec3d& attachedOffsetUp();
785 virtual osg::Vec3d& attachedOffsetFront();
786 virtual osg::Vec3d& attachedOffsetRight();
789 virtual osg::Vec3d& levelAttachedUp();
790 virtual osg::Vec3d& levelAttachedFront();
791 virtual osg::Vec3d& levelAttachedRight();
794 virtual osg::Vec3d& levelObserverMimicUp();
795 virtual osg::Vec3d& levelObserverMimicFront();
796 virtual osg::Vec3d& levelObserverMimicRight();
798 virtual osg::Vec3d& cameraUp();
799 virtual osg::Vec3d& cameraFront();
800 virtual osg::Vec3d& cameraRight();
802 virtual osg::Vec3d& levelObserverUp();
803 virtual osg::Vec3d& levelObserverFront();
804 virtual osg::Vec3d& levelObserverRight();
806 virtual void advanceOrbitLeft(
double rads );
807 virtual void advanceOrbitRight(
double rads );
808 virtual void advanceOrbitUp(
double rads );
809 virtual void advanceOrbitDown(
double rads );
811 virtual void makeLevelObserverMatrix();
814 virtual void calculateLevelAttachedRotation();
817 virtual void makeLevelObserverMimicMatrix();
822 virtual osg::Vec3d calcWorldPositionChange();
824 virtual osg::Vec3d calcMimicPositionChange();
826 virtual osg::Vec3d calcAttachedPosition(
const osg::Quat& attInverse,
const osg::Vec3d& attachedAdvance);
827 virtual osg::Vec3d calcAttachedAdvance(osg::Quat tetherTrackInverse);
829 virtual osg::Vec3d calcFollowPositionChange();
830 virtual osg::Vec3d calcSpaceFollowPositionChange();
831 virtual osg::Vec3d calcTetherPositionChange();
832 virtual osg::Vec3d calcTetherTrackPositionChange();
834 virtual osg::Vec3d calcTrackPositionChange();
835 virtual osg::Quat calcTetherTrackRotation();
837 virtual osg::Quat calcFlashlightOrientationChange();
838 virtual osg::Quat calcWorldOrientationChange();
839 virtual osg::Quat calcTetherOrientationChange();
840 virtual osg::Quat calcMimicOrientationChange();
841 virtual osg::Quat calcFollowOrientationChange();
843 virtual void setCurrentAttachmentsVisibility(
bool visible );
854 virtual void orientTo(
const osg::Vec3d& target );
857 virtual void orientCameraTo(
const osg::Vec3d& target );
859 virtual TerrainResult getTerrainCenter(
const DtUniqueID& patchID, osg::Vec3d& center );
864 virtual void initializeAttachment();
866 virtual void getScalingIntersection();
867 virtual void getViewIntersection();
870 virtual double linearSpeed();
873 virtual double speedScalingGain()
const;
875 virtual void calcTerrainConstraint( osg::Vec3d prev );
882 virtual bool updateAttachPositionAndOrientation();
884 virtual bool getSecondaryAttachPosition( osg::Vec3d& position );
886 virtual void getObserverOffsetVector(
double& x,
double& y,
double& z )
const;
887 virtual void setObserverOffsetVector(
double x,
double y,
double z );
889 virtual void getAttachedRotationOffset(
double& x,
double& y,
double& z,
double& w )
const;
890 virtual void setAttachedRotationOffset(
double x,
double y,
double z,
894 osg::Vec3& bvolExtents, osg::Vec3d& bvolCenter );
897 osg::Vec3& bvolExtents, osg::Vec3d& bvolCenter );
899 virtual void setLocation(
const osg::Vec3d& location,
bool suppress=
true );
901 virtual bool isMoving()
const;
902 virtual bool isRotating()
const;
904 virtual double computeNearClipDistance(
DtSceneObject* sceneObject );
905 virtual float computeLocalModelScalingAmount(
DtSceneObject* sceneObject );
907 virtual void calcScaledSpeed();
908 virtual bool getTerrainOrPropIntersection(
const osg::Vec3d& startPos,
909 const osg::Vec3d& endPos, osg::Vec3d& result )
const;
917 virtual void getPositionAndOrientation(
DtSceneObject& sceneObject, osg::Vec3d& position,
918 osg::Vec3d& orientToPosition, osg::Quat& orientation );
920 virtual void getPositionAndOrientation(
DtTerrainPatchObject& patchObject, osg::Vec3d& position,
921 osg::Vec3d& orientToPosition, osg::Quat& orientation );
924 virtual void getPositionFromSceneObject(
DtSceneObject& sceneObject, osg::Vec3d& position )
const;
928 virtual bool getPartPositionOriFromSceneObject(
DtSceneObject& sceneObject,
929 int partId, osg::Vec3d& position, osg::Quat& ori )
const;
933 virtual void force2D();
936 virtual void dimensionChanged(
bool is2D );
937 virtual void setIs2D(
bool is2D );
940 virtual double calculate3DAltitude()
const;
943 virtual void calculateAltitude();
947 virtual double zoomFromAltitude(
double altitude );
951 virtual double zoomFromHeightAboveTerrain(
double hat );
953 virtual double calcEarthRadiusAtLocalCoord(
const osg::Vec3d& local )
const;
957 virtual void synchronizeLocation(
double x,
double y,
double z );
961 virtual void synchronizeOrientation(
double x,
double y,
double z,
double w );
963 virtual void calcHeightAboveTerrain();
967 std::list<DtChannel*> findChannels();
971 double heightToZoomRatio();
1102 inline void applyMovement(
double linearDistance)
1104 if(moving(Right)) myAdvance[0] += linearDistance;
1105 if(moving(Left)) myAdvance[0] -= linearDistance;
1106 if(moving(Forward)) myAdvance[1] += linearDistance;
1107 if(moving(Backward)) myAdvance[1] -= linearDistance;
1108 if(moving(Up)) myAdvance[2] += linearDistance;
1109 if(moving(Down)) myAdvance[2] -= linearDistance;
1113 inline const osg::Vec3d& advance()
const
1121 myAdvance.set(0.0,0.0,0.0);
1122 myEuler.set(0.0,0.0,0.0);
1125 inline void clearAdvance()
1127 myAdvance.set(0.0,0.0,0.0);
1130 inline bool stopped()
1132 return myState == Stopped;
1135 inline bool moving()
const
1137 return myState != Stopped;
1142 return (myState & d) != 0;
1147 myState = moving ? myState | d : myState & ~d;
1160 inline void applyRotation(
double angle)
1162 if(rotating(YawRight)) myEuler[0] -= angle;
1163 if(rotating(YawLeft)) myEuler[0] += angle;
1164 if(rotating(PitchUp)) myEuler[1] += angle;
1165 if(rotating(PitchDown)) myEuler[1] -= angle;
1166 if(rotating(RollRight)) myEuler[2] += angle;
1167 if(rotating(RollLeft)) myEuler[2] -= angle;
1170 inline const osg::Vec3d& euler()
const
1175 inline osg::Vec3d& euler()
1182 myEuler.set(0.0,0.0,0.0);
1185 inline bool rotating()
const
1187 return myState != Stopped;
1192 return (myState & d) != 0;
1195 inline void setRotating(
Angle d,
bool rotating )
1197 myState = rotating ? myState | d : myState & ~d;