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 );
83 virtual void setCameraPositionAndOrientation(
const osg::Vec3d& position,
84 const osg::Quat& rotation );
86 virtual void getCameraPositionAndOrientation( osg::Vec3d& position,
87 osg::Quat& rotation )
const;
91 static void matrixdToTaitBryan(
const osg::Matrixd& mat, DtTaitBryan& tb,
bool isWorld2D =
false );
92 static double clampUnity(
double x );
104 virtual void startMoveObserverRight();
105 virtual void stopMoveObserverRight();
106 virtual void moveObserverRight(
double meters );
111 virtual void startMoveObserverForward();
112 virtual void stopMoveObserverForward();
113 virtual void moveObserverForward(
double meters );
119 virtual void startMoveObserverUp();
120 virtual void stopMoveObserverUp();
121 virtual void moveObserverUp(
double meters );
127 virtual void startMoveObserverLeft();
128 virtual void stopMoveObserverLeft();
129 virtual void moveObserverLeft(
double meters );
135 virtual void startMoveObserverBack();
136 virtual void stopMoveObserverBack();
137 virtual void moveObserverBack(
double meters );
143 virtual void startMoveObserverDown();
144 virtual void stopMoveObserverDown();
145 virtual void moveObserverDown(
double meters );
152 virtual void startMoveLevelObserverRight();
153 virtual void stopMoveLevelObserverRight();
154 virtual void moveLevelObserverRight(
double meters );
161 virtual void startMoveLevelObserverForward();
162 virtual void stopMoveLevelObserverForward();
163 virtual void moveLevelObserverForward(
double meters );
170 virtual void startMoveLevelObserverUp();
171 virtual void stopMoveLevelObserverUp();
172 virtual void moveLevelObserverUp(
double meters );
179 virtual void startMoveLevelObserverLeft();
180 virtual void stopMoveLevelObserverLeft();
181 virtual void moveLevelObserverLeft(
double meters );
188 virtual void startMoveLevelObserverBack();
189 virtual void stopMoveLevelObserverBack();
190 virtual void moveLevelObserverBack(
double meters );
196 virtual void startMoveLevelObserverDown();
197 virtual void stopMoveLevelObserverDown();
198 virtual void moveLevelObserverDown(
double meters );
204 virtual void startMoveAttachedRight();
205 virtual void stopMoveAttachedRight();
206 virtual void moveAttachedRight(
double meters );
211 virtual void startMoveAttachedForward();
212 virtual void stopMoveAttachedForward();
213 virtual void moveAttachedForward(
double meters );
219 virtual void startMoveAttachedUp();
220 virtual void stopMoveAttachedUp();
221 virtual void moveAttachedUp(
double meters );
227 virtual void startMoveAttachedLeft();
228 virtual void stopMoveAttachedLeft();
229 virtual void moveAttachedLeft(
double meters );
235 virtual void startMoveAttachedBack();
236 virtual void stopMoveAttachedBack();
237 virtual void moveAttachedBack(
double meters );
243 virtual void startMoveAttachedDown();
244 virtual void stopMoveAttachedDown();
245 virtual void moveAttachedDown(
double meters );
252 virtual void startMoveLevelAttachedRight();
253 virtual void stopMoveLevelAttachedRight();
254 virtual void moveLevelAttachedRight(
double meters );
261 virtual void startMoveLevelAttachedForward();
262 virtual void stopMoveLevelAttachedForward();
263 virtual void moveLevelAttachedForward(
double meters );
270 virtual void startMoveLevelAttachedUp();
271 virtual void stopMoveLevelAttachedUp();
272 virtual void moveLevelAttachedUp(
double meters );
279 virtual void startMoveLevelAttachedLeft();
280 virtual void stopMoveLevelAttachedLeft();
281 virtual void moveLevelAttachedLeft(
double meters );
288 virtual void startMoveLevelAttachedBack();
289 virtual void stopMoveLevelAttachedBack();
290 virtual void moveLevelAttachedBack(
double meters );
296 virtual void startMoveLevelAttachedDown();
297 virtual void stopMoveLevelAttachedDown();
298 virtual void moveLevelAttachedDown(
double meters );
304 virtual void startMoveAttachedContextRight();
305 virtual void stopMoveAttachedContextRight();
306 virtual void moveAttachedContextRight(
double meters );
312 virtual void startMoveAttachedContextForward();
313 virtual void stopMoveAttachedContextForward();
314 virtual void moveAttachedContextForward(
double meters );
320 virtual void startMoveAttachedContextUp();
321 virtual void stopMoveAttachedContextUp();
322 virtual void moveAttachedContextUp(
double meters );
328 virtual void startMoveAttachedContextLeft();
329 virtual void stopMoveAttachedContextLeft();
330 virtual void moveAttachedContextLeft(
double meters );
336 virtual void startMoveAttachedContextBack();
337 virtual void stopMoveAttachedContextBack();
338 virtual void moveAttachedContextBack(
double meters );
343 virtual void startMoveAttachedContextDown();
344 virtual void stopMoveAttachedContextDown();
345 virtual void moveAttachedContextDown(
double meters );
351 virtual void startYawLeft();
352 virtual void stopYawLeft();
353 virtual void rotateYawLeft(
double rads);
360 virtual void startYawRight();
361 virtual void stopYawRight();
362 virtual void rotateYawRight(
double rads);
368 virtual void startPitchUp();
369 virtual void stopPitchUp();
370 virtual void rotatePitchUp(
double rads );
371 virtual void rotateFlashlightPitchUp(
double rads );
377 virtual void startPitchDown();
378 virtual void stopPitchDown();
379 virtual void rotatePitchDown(
double rads );
380 virtual void rotateFlashlightPitchDown(
double rads );
386 virtual void startRollLeft();
387 virtual void stopRollLeft();
388 virtual void rollLeft(
double rads);
394 virtual void startRollRight();
395 virtual void stopRollRight();
396 virtual void rollRight(
double rads);
402 virtual void startLevelYawLeft();
403 virtual void stopLevelYawLeft();
410 virtual void startLevelYawRight();
411 virtual void stopLevelYawRight();
417 virtual void startLevelPitchUp();
418 virtual void stopLevelPitchUp();
419 virtual void rotateLevelPitchUp(
double rads);
425 virtual void startLevelPitchDown();
426 virtual void stopLevelPitchDown();
427 virtual void rotateLevelPitchDown(
double rads);
433 virtual void startLevelRollLeft();
434 virtual void stopLevelRollLeft();
435 virtual void rollLevelLeft(
double rads);
441 virtual void startLevelRollRight();
442 virtual void stopLevelRollRight();
443 virtual void rollLevelRight(
double rads);
446 virtual void rotateLevelYawLeft(
double rads );
447 virtual void rotateLevelYawRight(
double rads );
448 virtual void rotateFlashlightYawLeft(
double rads );
449 virtual void rotateFlashlightYawRight(
double rads );
451 virtual void startLookLeft();
452 virtual void stopLookLeft();
453 virtual void lookLeft(
double rads );
455 virtual void startLookRight();
456 virtual void stopLookRight();
457 virtual void lookRight(
double rads );
459 virtual void startLookUp();
460 virtual void stopLookUp();
461 virtual void lookUp(
double rads );
463 virtual void startLookDown();
464 virtual void stopLookDown();
465 virtual void lookDown(
double rads );
467 virtual void startLookTiltRight();
468 virtual void stopLookTiltRight();
469 virtual void lookTiltRight(
double rads );
471 virtual void startLookTiltLeft();
472 virtual void stopLookTiltLeft();
473 virtual void lookTiltLeft(
double rads );
478 virtual void startOrbitingLeft();
479 virtual void stopOrbitingLeft();
480 virtual void orbitLeft(
double rads );
486 virtual void startOrbitingRight();
487 virtual void stopOrbitingRight();
488 virtual void orbitRight(
double rads );
494 virtual void startOrbitingUp();
495 virtual void stopOrbitingUp();
496 virtual void orbitUp(
double rads );
502 virtual void startOrbitingDown();
503 virtual void stopOrbitingDown();
504 virtual void orbitDown(
double rads );
508 virtual void setLocation(
double x,
double y,
double z);
513 virtual void setAttachedLocation(
double x,
double y,
double z );
516 virtual void setOrientation(
double psi,
double theta,
double phi );
519 virtual void setTopographicOrientation(
double psi,
double theta,
double phi );
522 virtual void setOrientation(
double x,
double y,
double z,
double w);
525 virtual void setAttachedOrientation(
double psi,
double theta,
double phi );
528 virtual void setAttachedOrientation(
double x,
double y,
double z,
533 void setLocalModelScalingEnabled(
bool enabled );
537 void setLocalModelScalingAmount(
float amount );
541 virtual void jumpTo(
double x,
double y,
double z );
546 virtual void orientTo(
double x,
double y,
double z );
549 virtual void dragTerrain(
double lastX,
double lastY,
double lastZ,
550 double currX,
double currY,
double currZ );
552 virtual void dragTerrain2(
double myStartDragX,
double myStartDragY,
553 double myStartDragZ,
int deltaMouseX,
int deltaMouseY );
555 virtual void dragGravityUp(
double windowUnits );
556 virtual void dragGravityDown(
double windowUnits );
557 virtual void dragGravityLeft(
double windowUnits );
558 virtual void dragGravityRight(
double windowUnits );
559 virtual void scrollObserverForward(
int wheelUnits );
560 virtual void scrollObserverBack(
int wheelUnits );
561 virtual void scrollLevelObserverForward(
int wheelUnits );
562 virtual void scrollLevelObserverBack(
int wheelUnits );
564 virtual void scrollFlashlightWider(
int wheelUnits );
565 virtual void scrollFlashlightNarrower(
int wheelUnits );
568 virtual float flashlightAngle();
572 virtual void startIncreasingViewResolution();
573 virtual void stopIncreasingViewResolution();
574 virtual void increaseViewResolution();
576 virtual void startDecreasingViewResolution();
577 virtual void stopDecreasingViewResolution();
578 virtual void decreaseViewResolution();
581 virtual void setViewResolution(
double resolution);
584 virtual double viewResolution()
const;
591 virtual void setCurrentViewMagnification(
double mag );
594 virtual double currentViewMagnification()
const;
603 virtual void setOrbitSpeed(
double speed );
606 virtual void setLinearSpeed(
double speed );
609 virtual void setRotationSpeed(
double speed );
612 virtual void setMinLinearSpeed(
double minSpeed );
615 virtual void setMaxLinearSpeed(
double maxSpeed );
618 virtual void setLinearScaledSpeedGain(
double gain );
625 virtual void gotoTerrainCenter(
DtUniqueID terrainPatch,
bool retry );
628 virtual void resetAttachment();
630 virtual void resetOrientation();
633 virtual void resetCamera();
634 virtual void level();
636 virtual void stopAll();
638 virtual void attachToObjects(
const std::vector<DtUniqueID>& elementIds );
639 virtual void setSecondaryAttachment(
const std::vector<DtUniqueID>& elementIds );
640 virtual void setLocationTrackAttachment(
const osg::Vec3d& location );
641 virtual void setLocationTrackAttachment(
double x,
double y,
double z );
643 virtual void attachToPart(
int partId);
644 virtual void detach();
646 virtual void setHideModelOnAttach(
bool hide );
651 virtual void setAttachmentHas3DCockpit(
bool cockpit );
653 virtual void scaleCurrentAttachments(
bool scaled );
654 virtual void setOrientToTargetConstraint(
bool orient );
655 virtual void setOrbiting(
bool orbit );
656 virtual void setOrientCameraToTargetConstraint(
bool orient );
658 virtual void setConstrainToTerrain(
bool trueFalse );
659 virtual void setConstrainToCenter(
bool trueFalse );
663 virtual void suppressConstrainToTerrain(
bool trueFalse );
665 virtual void setSpeedScaling(
bool trueFalse );
668 virtual void setSpeedScaledSpeed(
double speed );
670 virtual void getLocation(
double &x,
double &y,
double& z )
const;
673 virtual void getOrientation(
double& psi,
double& theta,
double& phi )
const;
676 virtual void getTopographicOrientation(
double& psi,
double& theta,
double& phi )
const;
678 virtual void getOrientation(
double& x,
double& y,
double& z,
double& w )
const;
680 virtual void getFlashlightOrientation(
double& x,
double& y,
double& z,
double& w )
const;
684 virtual void getObserverPlatformFront(
double& x,
double& y,
double& z)
const;
688 virtual void getObserverPlatformUp(
double& x,
double& y,
double& z)
const;
692 virtual void getObserverPlatformRight(
double& x,
double& y,
double& z)
const;
696 virtual void getObserverFront(
double& x,
double& y,
double& z)
const;
699 virtual void getObserverUp(
double& x,
double& y,
double& z)
const;
702 virtual void getObserverRight(
double& x,
double& y,
double& z)
const;
704 virtual void getCameraUp(
double& x,
double& y,
double& z);
706 virtual void getCameraFront(
double& x,
double& y,
double& z);
708 virtual void getCameraRight(
double& x,
double& y,
double& z);
711 virtual void setCameraShakeRotation(
double x,
double y,
double z,
double w);
714 virtual void getCameraShakeRotation(
double& x,
double& y,
double& z,
double& w);;
719 virtual double fixed2DAltitude();
723 virtual double heightAboveTerrainFromCurrentZoom();
727 virtual double topographicHeading()
const;
730 virtual void getLinearVelocity(
double &x,
double &y,
double &z)
const;
733 virtual void getRotationalVelocity(
double& x,
double& y,
double& z)
const;
738 virtual void setModeSetting(
int setting,
bool value );
741 virtual std::vector<DtUniqueID> currentAttachments()
const;
746 virtual const osg::Vec3d& locationTrackAttachmentVec3d()
const;
747 virtual void getLocationTrackAttachment(
double& x,
double& y,
double& z )
const;
761 virtual bool attachedObjectHidden()
const;
766 virtual bool attachmentHas3DCockpit()
const;
770 virtual osg::Vec3d attachedOffsetVector()
const;
776 virtual double attachedNearClipOffset()
const;
779 virtual double heightAboveTerrain()
const;
791 virtual bool shouldOrientToGlobeCenter();
794 virtual void adjustToGlobeCurvature();
797 virtual bool shouldRotateGlobe();
801 virtual double zoomFromCurrentAltitude();
805 virtual double altitudeFromCurrentZoom();
807 virtual void calcObserverWorldVectors();
808 virtual const osg::Vec3d& observerWorldUp()
const;
809 virtual const osg::Vec3d& observerWorldNorth()
const;
810 virtual const osg::Vec3d& observerWorldEast()
const;
812 virtual const osg::Vec3d& attachedWorldUp()
const;
814 virtual osg::Vec3d& observerUp();
815 virtual osg::Vec3d& observerFront();
816 virtual osg::Vec3d& observerRight();
817 virtual void observerBasis(osg::Vec3d& up, osg::Vec3d& front, osg::Vec3d& right);
819 virtual osg::Vec3d& attachedUp();
820 virtual osg::Vec3d& attachedFront();
821 virtual osg::Vec3d& attachedRight();
823 virtual osg::Vec3d& attachedOffsetUp();
824 virtual osg::Vec3d& attachedOffsetFront();
825 virtual osg::Vec3d& attachedOffsetRight();
828 virtual osg::Vec3d& levelAttachedUp();
829 virtual osg::Vec3d& levelAttachedFront();
830 virtual osg::Vec3d& levelAttachedRight();
833 virtual osg::Vec3d& levelObserverMimicUp();
834 virtual osg::Vec3d& levelObserverMimicFront();
835 virtual osg::Vec3d& levelObserverMimicRight();
837 virtual osg::Vec3d& cameraUp();
838 virtual osg::Vec3d& cameraFront();
839 virtual osg::Vec3d& cameraRight();
841 virtual osg::Vec3d& levelObserverUp();
842 virtual osg::Vec3d& levelObserverFront();
843 virtual osg::Vec3d& levelObserverRight();
845 virtual void advanceOrbitLeft(
double rads );
846 virtual void advanceOrbitRight(
double rads );
847 virtual void advanceOrbitUp(
double rads );
848 virtual void advanceOrbitDown(
double rads );
850 virtual void makeLevelObserverMatrix();
853 virtual void calculateLevelAttachedRotation();
856 virtual void makeLevelObserverMimicMatrix();
861 virtual osg::Vec3d calcWorldPositionChange();
863 virtual osg::Vec3d calcMimicPositionChange();
865 virtual osg::Vec3d calcAttachedPosition(
const osg::Quat& attInverse,
const osg::Vec3d& attachedAdvance);
866 virtual osg::Vec3d calcAttachedAdvance(
const osg::Quat& tetherTrackInverse);
868 virtual osg::Vec3d calcFollowPositionChange();
869 virtual osg::Vec3d calcSpaceFollowPositionChange();
870 virtual osg::Vec3d calcTetherPositionChange();
871 virtual osg::Vec3d calcTetherTrackPositionChange();
873 virtual osg::Vec3d calcTrackPositionChange();
874 virtual osg::Quat calcTetherTrackRotation();
876 virtual osg::Quat calcFlashlightOrientationChange();
877 virtual osg::Quat calcWorldOrientationChange();
878 virtual osg::Quat calcTetherOrientationChange();
879 virtual osg::Quat calcMimicOrientationChange();
880 virtual osg::Quat calcFollowOrientationChange();
882 virtual void setCurrentAttachmentsVisibility(
bool visible );
893 virtual void orientTo(
const osg::Vec3d& target );
896 virtual void orientCameraTo(
const osg::Vec3d& target );
898 virtual TerrainResult getTerrainCenter(
const DtUniqueID& patchID, osg::Vec3d& center );
903 virtual void initializeAttachment();
905 virtual void getScalingIntersection();
906 virtual void getViewIntersection();
909 virtual double linearSpeed();
912 virtual double speedScalingGain()
const;
914 virtual void calcTerrainConstraint(
const osg::Vec3d& prev );
921 virtual bool updateAttachPositionAndOrientation();
923 virtual bool getSecondaryAttachPosition( osg::Vec3d& position );
925 virtual void getObserverOffsetVector(
double& x,
double& y,
double& z )
const;
926 virtual void setObserverOffsetVector(
double x,
double y,
double z );
928 virtual void getAttachedRotationOffset(
double& x,
double& y,
double& z,
double& w )
const;
929 virtual void setAttachedRotationOffset(
double x,
double y,
double z,
933 osg::Vec3& bvolExtents, osg::Vec3d& bvolCenter );
936 osg::Vec3& bvolExtents, osg::Vec3d& bvolCenter );
938 virtual void setLocation(
const osg::Vec3d& location,
bool suppress=
true );
940 virtual bool isMoving()
const;
941 virtual bool isRotating()
const;
943 virtual double computeNearClipDistance(
DtSceneObject* sceneObject );
944 virtual float computeLocalModelScalingAmount(
DtSceneObject* sceneObject );
946 virtual void calcScaledSpeed();
947 virtual bool getTerrainOrPropIntersection(
const osg::Vec3d& startPos,
948 const osg::Vec3d& endPos, osg::Vec3d& result )
const;
957 virtual void getPositionAndOrientation(
DtSceneObject& sceneObject, osg::Vec3d& position,
958 osg::Vec3d& orientToPosition, osg::Quat& orientation );
960 virtual void getPositionAndOrientation(
DtTerrainPatchObject& patchObject, osg::Vec3d& position,
961 osg::Vec3d& orientToPosition, osg::Quat& orientation );
963 virtual void getPositionAndOrientation(
DtOsgObserverObject& observerObject, osg::Vec3d& position,
964 osg::Vec3d& orientToPosition, osg::Quat& orientation );
967 virtual void getPositionFromSceneObject(
DtSceneObject& sceneObject, osg::Vec3d& position )
const;
970 virtual void getPositionFromObserverObject(
DtOsgObserverObject& observerObject, osg::Vec3d& position )
const;
974 virtual bool getPartPositionOriFromSceneObject(
DtSceneObject& sceneObject,
975 int partId, osg::Vec3d& position, osg::Quat& ori )
const;
979 virtual void force2D();
982 virtual void dimensionChanged(
bool is2D );
983 virtual void setIs2D(
bool is2D );
986 virtual double calculate3DAltitude()
const;
989 virtual void calculateAltitude();
993 virtual double zoomFromAltitude(
double altitude );
997 virtual double zoomFromHeightAboveTerrain(
double hat );
999 virtual double calcEarthRadiusAtLocalCoord(
const osg::Vec3d& local )
const;
1003 virtual void synchronizeLocation(
double x,
double y,
double z );
1007 virtual void synchronizeOrientation(
double x,
double y,
double z,
double w );
1009 virtual void calcHeightAboveTerrain();
1013 std::list<DtChannel*> findChannels();
1017 double heightToZoomRatio();
1147 inline void applyMovement(
double linearDistance)
1149 if(moving(Right)) myAdvance[0] += linearDistance;
1150 if(moving(Left)) myAdvance[0] -= linearDistance;
1151 if(moving(Forward)) myAdvance[1] += linearDistance;
1152 if(moving(Backward)) myAdvance[1] -= linearDistance;
1153 if(moving(Up)) myAdvance[2] += linearDistance;
1154 if(moving(Down)) myAdvance[2] -= linearDistance;
1158 inline const osg::Vec3d& advance()
const
1166 myAdvance.set(0.0,0.0,0.0);
1167 myEuler.set(0.0,0.0,0.0);
1170 inline void clearAdvance()
1172 myAdvance.set(0.0,0.0,0.0);
1175 inline bool stopped()
1177 return myState == Stopped;
1180 inline bool moving()
const
1182 return myState != Stopped;
1187 return (myState & d) != 0;
1192 myState = moving ? myState | d : myState & ~d;
1205 inline void applyRotation(
double angle)
1207 if(rotating(YawRight)) myEuler[0] -= angle;
1208 if(rotating(YawLeft)) myEuler[0] += angle;
1209 if(rotating(PitchUp)) myEuler[1] += angle;
1210 if(rotating(PitchDown)) myEuler[1] -= angle;
1211 if(rotating(RollRight)) myEuler[2] += angle;
1212 if(rotating(RollLeft)) myEuler[2] -= angle;
1215 inline const osg::Vec3d& euler()
const
1220 inline osg::Vec3d& euler()
1227 myEuler.set(0.0,0.0,0.0);
1230 inline bool rotating()
const
1232 return myState != Stopped;
1237 return (myState & d) != 0;
1240 inline void setRotating(
Angle d,
bool rotating )
1242 myState = rotating ? myState | d : myState & ~d;