18 #include <boost/unordered_map.hpp>
20 #include <osg/Matrixd>
40 class DtTerrainPatchObject;
41 class DtAgentUpdateResolverInterface;
53 TerrainResultNoData = 0,
65 virtual void tick(
double simTime );
68 virtual void tickAttachment();
72 virtual void setModelSet(
int modelSet );
75 virtual double altitude()
const;
77 virtual void setNameAndRegister(
const std::string& name );
79 virtual void getCameraPositionAndOrientation( osg::Vec3d& position,
80 osg::Quat& rotation )
const;
83 static void matrixdToTaitBryan(
const osg::Matrixd& mat, DtTaitBryan& tb,
bool isWorld2D =
false );
84 static double clampUnity(
double x );
96 virtual void startMoveObserverRight();
97 virtual void stopMoveObserverRight();
98 virtual void moveObserverRight(
double meters );
103 virtual void startMoveObserverForward();
104 virtual void stopMoveObserverForward();
105 virtual void moveObserverForward(
double meters );
111 virtual void startMoveObserverUp();
112 virtual void stopMoveObserverUp();
113 virtual void moveObserverUp(
double meters );
119 virtual void startMoveObserverLeft();
120 virtual void stopMoveObserverLeft();
121 virtual void moveObserverLeft(
double meters );
127 virtual void startMoveObserverBack();
128 virtual void stopMoveObserverBack();
129 virtual void moveObserverBack(
double meters );
135 virtual void startMoveObserverDown();
136 virtual void stopMoveObserverDown();
137 virtual void moveObserverDown(
double meters );
144 virtual void startMoveLevelObserverRight();
145 virtual void stopMoveLevelObserverRight();
146 virtual void moveLevelObserverRight(
double meters );
153 virtual void startMoveLevelObserverForward();
154 virtual void stopMoveLevelObserverForward();
155 virtual void moveLevelObserverForward(
double meters );
162 virtual void startMoveLevelObserverUp();
163 virtual void stopMoveLevelObserverUp();
164 virtual void moveLevelObserverUp(
double meters );
171 virtual void startMoveLevelObserverLeft();
172 virtual void stopMoveLevelObserverLeft();
173 virtual void moveLevelObserverLeft(
double meters );
180 virtual void startMoveLevelObserverBack();
181 virtual void stopMoveLevelObserverBack();
182 virtual void moveLevelObserverBack(
double meters );
188 virtual void startMoveLevelObserverDown();
189 virtual void stopMoveLevelObserverDown();
190 virtual void moveLevelObserverDown(
double meters );
196 virtual void startMoveAttachedRight();
197 virtual void stopMoveAttachedRight();
198 virtual void moveAttachedRight(
double meters );
203 virtual void startMoveAttachedForward();
204 virtual void stopMoveAttachedForward();
205 virtual void moveAttachedForward(
double meters );
211 virtual void startMoveAttachedUp();
212 virtual void stopMoveAttachedUp();
213 virtual void moveAttachedUp(
double meters );
219 virtual void startMoveAttachedLeft();
220 virtual void stopMoveAttachedLeft();
221 virtual void moveAttachedLeft(
double meters );
227 virtual void startMoveAttachedBack();
228 virtual void stopMoveAttachedBack();
229 virtual void moveAttachedBack(
double meters );
235 virtual void startMoveAttachedDown();
236 virtual void stopMoveAttachedDown();
237 virtual void moveAttachedDown(
double meters );
244 virtual void startMoveLevelAttachedRight();
245 virtual void stopMoveLevelAttachedRight();
246 virtual void moveLevelAttachedRight(
double meters );
253 virtual void startMoveLevelAttachedForward();
254 virtual void stopMoveLevelAttachedForward();
255 virtual void moveLevelAttachedForward(
double meters );
262 virtual void startMoveLevelAttachedUp();
263 virtual void stopMoveLevelAttachedUp();
264 virtual void moveLevelAttachedUp(
double meters );
271 virtual void startMoveLevelAttachedLeft();
272 virtual void stopMoveLevelAttachedLeft();
273 virtual void moveLevelAttachedLeft(
double meters );
280 virtual void startMoveLevelAttachedBack();
281 virtual void stopMoveLevelAttachedBack();
282 virtual void moveLevelAttachedBack(
double meters );
288 virtual void startMoveLevelAttachedDown();
289 virtual void stopMoveLevelAttachedDown();
290 virtual void moveLevelAttachedDown(
double meters );
296 virtual void startMoveAttachedContextRight();
297 virtual void stopMoveAttachedContextRight();
298 virtual void moveAttachedContextRight(
double meters );
304 virtual void startMoveAttachedContextForward();
305 virtual void stopMoveAttachedContextForward();
306 virtual void moveAttachedContextForward(
double meters );
312 virtual void startMoveAttachedContextUp();
313 virtual void stopMoveAttachedContextUp();
314 virtual void moveAttachedContextUp(
double meters );
320 virtual void startMoveAttachedContextLeft();
321 virtual void stopMoveAttachedContextLeft();
322 virtual void moveAttachedContextLeft(
double meters );
328 virtual void startMoveAttachedContextBack();
329 virtual void stopMoveAttachedContextBack();
330 virtual void moveAttachedContextBack(
double meters );
335 virtual void startMoveAttachedContextDown();
336 virtual void stopMoveAttachedContextDown();
337 virtual void moveAttachedContextDown(
double meters );
343 virtual void startYawLeft();
344 virtual void stopYawLeft();
351 virtual void startYawRight();
352 virtual void stopYawRight();
358 virtual void startPitchUp();
359 virtual void stopPitchUp();
360 virtual void rotatePitchUp(
double rads );
361 virtual void rotateFlashlightPitchUp(
double rads );
367 virtual void startPitchDown();
368 virtual void stopPitchDown();
369 virtual void rotatePitchDown(
double rads );
370 virtual void rotateFlashlightPitchDown(
double rads );
376 virtual void startRollLeft();
377 virtual void stopRollLeft();
383 virtual void startRollRight();
384 virtual void stopRollRight();
390 virtual void startLevelYawLeft();
391 virtual void stopLevelYawLeft();
398 virtual void startLevelYawRight();
399 virtual void stopLevelYawRight();
405 virtual void startLevelPitchUp();
406 virtual void stopLevelPitchUp();
412 virtual void startLevelPitchDown();
413 virtual void stopLevelPitchDown();
419 virtual void startLevelRollLeft();
420 virtual void stopLevelRollLeft();
426 virtual void startLevelRollRight();
427 virtual void stopLevelRollRight();
430 virtual void rotateLevelYawLeft(
double rads );
431 virtual void rotateLevelYawRight(
double rads );
432 virtual void rotateFlashlightYawLeft(
double rads );
433 virtual void rotateFlashlightYawRight(
double rads );
435 virtual void startLookLeft();
436 virtual void stopLookLeft();
437 virtual void lookLeft(
double rads );
439 virtual void startLookRight();
440 virtual void stopLookRight();
441 virtual void lookRight(
double rads );
443 virtual void startLookUp();
444 virtual void stopLookUp();
445 virtual void lookUp(
double rads );
447 virtual void startLookDown();
448 virtual void stopLookDown();
449 virtual void lookDown(
double rads );
451 virtual void startLookTiltRight();
452 virtual void stopLookTiltRight();
453 virtual void lookTiltRight(
double rads );
455 virtual void startLookTiltLeft();
456 virtual void stopLookTiltLeft();
457 virtual void lookTiltLeft(
double rads );
462 virtual void startOrbitingLeft();
463 virtual void stopOrbitingLeft();
464 virtual void orbitLeft(
double rads );
470 virtual void startOrbitingRight();
471 virtual void stopOrbitingRight();
472 virtual void orbitRight(
double rads );
478 virtual void startOrbitingUp();
479 virtual void stopOrbitingUp();
480 virtual void orbitUp(
double rads );
486 virtual void startOrbitingDown();
487 virtual void stopOrbitingDown();
488 virtual void orbitDown(
double rads );
492 virtual void setLocation(
double x,
double y,
double z);
497 virtual void setAttachedLocation(
double x,
double y,
double z );
500 virtual void setOrientation(
double psi,
double theta,
double phi );
503 virtual void setTopographicOrientation(
double psi,
double theta,
double phi );
506 virtual void setOrientation(
double x,
double y,
double z,
double w);
509 virtual void setAttachedOrientation(
double psi,
double theta,
double phi );
512 virtual void setAttachedOrientation(
double x,
double y,
double z,
517 void setLocalModelScalingEnabled(
bool enabled );
521 void setLocalModelScalingAmount(
float amount );
525 virtual void jumpTo(
double x,
double y,
double z );
530 virtual void orientTo(
double x,
double y,
double z );
533 virtual void dragTerrain(
double lastX,
double lastY,
double lastZ,
534 double currX,
double currY,
double currZ );
536 virtual void dragTerrain2(
double myStartDragX,
double myStartDragY,
537 double myStartDragZ,
int deltaMouseX,
int deltaMouseY );
539 virtual void dragGravityUp(
double windowUnits );
540 virtual void dragGravityDown(
double windowUnits );
541 virtual void dragGravityLeft(
double windowUnits );
542 virtual void dragGravityRight(
double windowUnits );
543 virtual void scrollObserverForward(
int wheelUnits );
544 virtual void scrollObserverBack(
int wheelUnits );
545 virtual void scrollLevelObserverForward(
int wheelUnits );
546 virtual void scrollLevelObserverBack(
int wheelUnits );
548 virtual void scrollFlashlightWider(
int wheelUnits );
549 virtual void scrollFlashlightNarrower(
int wheelUnits );
552 virtual float flashlightAngle();
556 virtual void startIncreasingViewResolution();
557 virtual void stopIncreasingViewResolution();
558 virtual void increaseViewResolution();
560 virtual void startDecreasingViewResolution();
561 virtual void stopDecreasingViewResolution();
562 virtual void decreaseViewResolution();
565 virtual void setViewResolution(
double resolution);
568 virtual double viewResolution()
const;
571 virtual void setViewMagnification(
double mag );
574 virtual double viewMagnification()
const;
583 virtual void setOrbitSpeed(
double speed );
586 virtual void setLinearSpeed(
double speed );
589 virtual void setRotationSpeed(
double speed );
592 virtual void setMinLinearSpeed(
double minSpeed );
595 virtual void setLinearScaledSpeedGain(
double gain );
602 virtual void gotoTerrainCenter(
DtUniqueID terrainPatch,
bool retry );
605 virtual void resetAttachment();
607 virtual void resetOrientation();
610 virtual void resetCamera();
611 virtual void level();
613 virtual void stopAll();
615 virtual void attachToObjects(
const std::vector<DtUniqueID>& elementIds );
616 virtual void setSecondaryAttachment(
const std::vector<DtUniqueID>& elementIds );
617 virtual void attachToPart(
int partId);
618 virtual void detach();
620 virtual void setHideModelOnAttach(
bool hide );
625 virtual void setAttachmentHas3DCockpit(
bool cockpit );
627 virtual void scaleCurrentAttachments(
bool scaled );
628 virtual void setOrientToTargetConstraint(
bool orient );
629 virtual void setOrbiting(
bool orbit );
630 virtual void setOrientCameraToTargetConstraint(
bool orient );
632 virtual void setConstrainToTerrain(
bool trueFalse );
633 virtual void setConstrainToCenter(
bool trueFalse );
637 virtual void suppressConstrainToTerrain(
bool trueFalse );
639 virtual void setSpeedScaling(
bool trueFalse );
642 virtual void setSpeedScaledSpeed(
double speed );
644 virtual void getLocation(
double &x,
double &y,
double& z )
const;
647 virtual void getOrientation(
double& psi,
double& theta,
double& phi )
const;
650 virtual void getTopographicOrientation(
double& psi,
double& theta,
double& phi )
const;
652 virtual void getOrientation(
double& x,
double& y,
double& z,
double& w )
const;
654 virtual void getFlashlightOrientation(
double& x,
double& y,
double& z,
double& w )
const;
656 virtual void getCameraUp(
double& x,
double& y,
double& z);
658 virtual void getCameraFront(
double& x,
double& y,
double& z);
660 virtual void getCameraRight(
double& x,
double& y,
double& z);
663 virtual void setCameraShakeRotation(
double x,
double y,
double z,
double w);
666 virtual void getCameraShakeRotation(
double& x,
double& y,
double& z,
double& w);;
671 virtual double fixed2DAltitude();
675 virtual double heightAboveTerrainFromCurrentZoom();
679 virtual double topographicHeading()
const;
682 virtual void getLinearVelocity(
double &x,
double &y,
double &z)
const;
685 virtual void getRotationalVelocity(
double& x,
double& y,
double& z)
const;
690 virtual void setModeSetting(
int setting,
bool value );
693 virtual std::vector<DtUniqueID> currentAttachments()
const;
706 virtual bool attachedObjectHidden()
const;
711 virtual bool attachmentHas3DCockpit()
const;
715 virtual osg::Vec3d attachedOffsetVector()
const;
721 virtual double attachedNearClipOffset()
const;
724 virtual double heightAboveTerrain()
const;
736 virtual bool shouldOrientToGlobeCenter();
739 virtual void adjustToGlobeCurvature();
742 virtual bool shouldRotateGlobe();
746 virtual double zoomFromCurrentAltitude();
750 virtual double altitudeFromCurrentZoom();
752 virtual void calcObserverWorldVectors();
753 virtual const osg::Vec3d& observerWorldUp()
const;
754 virtual const osg::Vec3d& observerWorldNorth()
const;
755 virtual const osg::Vec3d& observerWorldEast()
const;
757 virtual const osg::Vec3d& attachedWorldUp()
const;
759 virtual osg::Vec3d& observerUp();
760 virtual osg::Vec3d& observerFront();
761 virtual osg::Vec3d& observerRight();
762 virtual void observerBasis(osg::Vec3d& up, osg::Vec3d& front, osg::Vec3d& right);
764 virtual osg::Vec3d& attachedUp();
765 virtual osg::Vec3d& attachedFront();
766 virtual osg::Vec3d& attachedRight();
768 virtual osg::Vec3d& attachedOffsetUp();
769 virtual osg::Vec3d& attachedOffsetFront();
770 virtual osg::Vec3d& attachedOffsetRight();
773 virtual osg::Vec3d& levelAttachedUp();
774 virtual osg::Vec3d& levelAttachedFront();
775 virtual osg::Vec3d& levelAttachedRight();
778 virtual osg::Vec3d& levelObserverMimicUp();
779 virtual osg::Vec3d& levelObserverMimicFront();
780 virtual osg::Vec3d& levelObserverMimicRight();
782 virtual osg::Vec3d& cameraUp();
783 virtual osg::Vec3d& cameraFront();
784 virtual osg::Vec3d& cameraRight();
786 virtual osg::Vec3d& levelObserverUp();
787 virtual osg::Vec3d& levelObserverFront();
788 virtual osg::Vec3d& levelObserverRight();
790 virtual void advanceOrbitLeft(
double rads );
791 virtual void advanceOrbitRight(
double rads );
792 virtual void advanceOrbitUp(
double rads );
793 virtual void advanceOrbitDown(
double rads );
795 virtual void makeLevelObserverMatrix();
798 virtual void calculateLevelAttachedRotation();
801 virtual void makeLevelObserverMimicMatrix();
806 virtual osg::Vec3d calcWorldPositionChange();
808 virtual osg::Vec3d calcMimicPositionChange();
810 virtual osg::Vec3d calcAttachedPosition(
const osg::Quat& attInverse,
const osg::Vec3d& attachedAdvance);
811 virtual osg::Vec3d calcAttachedAdvance(osg::Quat tetherTrackInverse);
813 virtual osg::Vec3d calcFollowPositionChange();
814 virtual osg::Vec3d calcSpaceFollowPositionChange();
815 virtual osg::Vec3d calcTetherPositionChange();
816 virtual osg::Vec3d calcTetherTrackPositionChange();
818 virtual osg::Vec3d calcTrackPositionChange();
819 virtual osg::Quat calcTetherTrackRotation();
821 virtual osg::Quat calcFlashlightOrientationChange();
822 virtual osg::Quat calcWorldOrientationChange();
823 virtual osg::Quat calcTetherOrientationChange();
824 virtual osg::Quat calcMimicOrientationChange();
825 virtual osg::Quat calcFollowOrientationChange();
827 virtual void setCurrentAttachmentsVisibility(
bool visible );
838 virtual void orientTo(
const osg::Vec3d& target );
841 virtual void orientCameraTo(
const osg::Vec3d& target );
843 virtual TerrainResult getTerrainCenter(
const DtUniqueID& patchID, osg::Vec3d& center );
848 virtual void initializeAttachment();
850 virtual void getScalingIntersection();
851 virtual void getViewIntersection();
854 virtual double linearSpeed();
857 virtual double speedScalingGain()
const;
859 virtual void calcTerrainConstraint( osg::Vec3d prev );
866 virtual bool updateAttachPositionAndOrientation();
868 virtual bool getSecondaryAttachPosition( osg::Vec3d& position );
870 virtual void getObserverOffsetVector(
double& x,
double& y,
double& z )
const;
871 virtual void setObserverOffsetVector(
double x,
double y,
double z );
873 virtual void getAttachedRotationOffset(
double& x,
double& y,
double& z,
double& w )
const;
874 virtual void setAttachedRotationOffset(
double x,
double y,
double z,
878 osg::Vec3& bvolExtents, osg::Vec3d& bvolCenter );
881 osg::Vec3& bvolExtents, osg::Vec3d& bvolCenter );
883 virtual void setLocation(
const osg::Vec3d& location,
bool suppress=
true );
885 virtual bool isMoving()
const;
886 virtual bool isRotating()
const;
888 virtual double computeNearClipDistance(
DtSceneObject* sceneObject );
889 virtual float computeLocalModelScalingAmount(
DtSceneObject* sceneObject );
891 virtual void calcScaledSpeed();
892 virtual bool getTerrainOrPropIntersection(
const osg::Vec3d& startPos,
893 const osg::Vec3d& endPos, osg::Vec3d& result )
const;
901 virtual void getPositionAndOrientation(
DtSceneObject& sceneObject, osg::Vec3d& position,
902 osg::Vec3d& orientToPosition, osg::Quat& orientation );
904 virtual void getPositionAndOrientation(
DtTerrainPatchObject& patchObject, osg::Vec3d& position,
905 osg::Vec3d& orientToPosition, osg::Quat& orientation );
908 virtual void getPositionFromSceneObject(
DtSceneObject& sceneObject, osg::Vec3d& position )
const;
912 virtual bool getPartPositionOriFromSceneObject(
DtSceneObject& sceneObject,
913 int partId, osg::Vec3d& position, osg::Quat& ori )
const;
917 virtual void force2D();
920 virtual void dimensionChanged(
bool is2D );
921 virtual void setIs2D(
bool is2D );
924 virtual double calculate3DAltitude()
const;
927 virtual void calculateAltitude();
931 virtual double zoomFromAltitude(
double altitude );
935 virtual double zoomFromHeightAboveTerrain(
double hat );
937 virtual double calcEarthRadiusAtLocalCoord(
const osg::Vec3d& local )
const;
941 virtual void synchronizeLocation(
double x,
double y,
double z );
945 virtual void synchronizeOrientation(
double x,
double y,
double z,
double w );
947 virtual void calcHeightAboveTerrain();
951 std::list<DtChannel*> findChannels();
955 double heightToZoomRatio();
1086 inline void applyMovement(
double linearDistance)
1088 if(moving(Right)) myAdvance[0] += linearDistance;
1089 if(moving(Left)) myAdvance[0] -= linearDistance;
1090 if(moving(Forward)) myAdvance[1] += linearDistance;
1091 if(moving(Backward)) myAdvance[1] -= linearDistance;
1092 if(moving(Up)) myAdvance[2] += linearDistance;
1093 if(moving(Down)) myAdvance[2] -= linearDistance;
1097 inline const osg::Vec3d& advance()
const
1105 myAdvance.set(0.0,0.0,0.0);
1106 myEuler.set(0.0,0.0,0.0);
1109 inline void clearAdvance()
1111 myAdvance.set(0.0,0.0,0.0);
1114 inline bool stopped()
1116 return myState == Stopped;
1119 inline bool moving()
const
1121 return myState != Stopped;
1126 return (myState & d) != 0;
1131 myState = moving ? myState | d : myState & ~d;
1144 inline void applyRotation(
double angle)
1146 if(rotating(YawRight)) myEuler[0] -= angle;
1147 if(rotating(YawLeft)) myEuler[0] += angle;
1148 if(rotating(PitchUp)) myEuler[1] += angle;
1149 if(rotating(PitchDown)) myEuler[1] -= angle;
1150 if(rotating(RollRight)) myEuler[2] += angle;
1151 if(rotating(RollLeft)) myEuler[2] -= angle;
1154 inline const osg::Vec3d& euler()
const
1159 inline osg::Vec3d& euler()
1166 myEuler.set(0.0,0.0,0.0);
1169 inline bool rotating()
const
1171 return myState != Stopped;
1176 return (myState & d) != 0;
1179 inline void setRotating(
Angle d,
bool rotating )
1181 myState = rotating ? myState | d : myState & ~d;