16 #include <boost/unordered_map.hpp>
18 #include <osg/Matrixd>
35 class DtTerrainPatchObject;
36 class DtAgentUpdateResolverInterface;
48 TerrainResultNoData = 0,
60 virtual void tick(
double simTime );
62 virtual void tickAttachment();
66 virtual void setModelSet(
int modelSet );
69 virtual double altitude()
const;
71 virtual void setNameAndRegister(
const std::string& name );
73 virtual void getCameraPositionAndOrientation( osg::Vec3d& position,
74 osg::Quat& rotation )
const;
85 virtual void startMoveObserverRight();
86 virtual void stopMoveObserverRight();
87 virtual void moveObserverRight(
double meters );
92 virtual void startMoveObserverForward();
93 virtual void stopMoveObserverForward();
94 virtual void moveObserverForward(
double meters );
100 virtual void startMoveObserverUp();
101 virtual void stopMoveObserverUp();
102 virtual void moveObserverUp(
double meters );
108 virtual void startMoveObserverLeft();
109 virtual void stopMoveObserverLeft();
110 virtual void moveObserverLeft(
double meters );
116 virtual void startMoveObserverBack();
117 virtual void stopMoveObserverBack();
118 virtual void moveObserverBack(
double meters );
124 virtual void startMoveObserverDown();
125 virtual void stopMoveObserverDown();
126 virtual void moveObserverDown(
double meters );
133 virtual void startMoveLevelObserverRight();
134 virtual void stopMoveLevelObserverRight();
135 virtual void moveLevelObserverRight(
double meters );
142 virtual void startMoveLevelObserverForward();
143 virtual void stopMoveLevelObserverForward();
144 virtual void moveLevelObserverForward(
double meters );
151 virtual void startMoveLevelObserverUp();
152 virtual void stopMoveLevelObserverUp();
153 virtual void moveLevelObserverUp(
double meters );
160 virtual void startMoveLevelObserverLeft();
161 virtual void stopMoveLevelObserverLeft();
162 virtual void moveLevelObserverLeft(
double meters );
169 virtual void startMoveLevelObserverBack();
170 virtual void stopMoveLevelObserverBack();
171 virtual void moveLevelObserverBack(
double meters );
177 virtual void startMoveLevelObserverDown();
178 virtual void stopMoveLevelObserverDown();
179 virtual void moveLevelObserverDown(
double meters );
185 virtual void startMoveAttachedRight();
186 virtual void stopMoveAttachedRight();
187 virtual void moveAttachedRight(
double meters );
192 virtual void startMoveAttachedForward();
193 virtual void stopMoveAttachedForward();
194 virtual void moveAttachedForward(
double meters );
200 virtual void startMoveAttachedUp();
201 virtual void stopMoveAttachedUp();
202 virtual void moveAttachedUp(
double meters );
208 virtual void startMoveAttachedLeft();
209 virtual void stopMoveAttachedLeft();
210 virtual void moveAttachedLeft(
double meters );
216 virtual void startMoveAttachedBack();
217 virtual void stopMoveAttachedBack();
218 virtual void moveAttachedBack(
double meters );
224 virtual void startMoveAttachedDown();
225 virtual void stopMoveAttachedDown();
226 virtual void moveAttachedDown(
double meters );
233 virtual void startMoveLevelAttachedRight();
234 virtual void stopMoveLevelAttachedRight();
235 virtual void moveLevelAttachedRight(
double meters );
242 virtual void startMoveLevelAttachedForward();
243 virtual void stopMoveLevelAttachedForward();
244 virtual void moveLevelAttachedForward(
double meters );
251 virtual void startMoveLevelAttachedUp();
252 virtual void stopMoveLevelAttachedUp();
253 virtual void moveLevelAttachedUp(
double meters );
260 virtual void startMoveLevelAttachedLeft();
261 virtual void stopMoveLevelAttachedLeft();
262 virtual void moveLevelAttachedLeft(
double meters );
269 virtual void startMoveLevelAttachedBack();
270 virtual void stopMoveLevelAttachedBack();
271 virtual void moveLevelAttachedBack(
double meters );
277 virtual void startMoveLevelAttachedDown();
278 virtual void stopMoveLevelAttachedDown();
279 virtual void moveLevelAttachedDown(
double meters );
285 virtual void startMoveAttachedContextRight();
286 virtual void stopMoveAttachedContextRight();
287 virtual void moveAttachedContextRight(
double meters );
293 virtual void startMoveAttachedContextForward();
294 virtual void stopMoveAttachedContextForward();
295 virtual void moveAttachedContextForward(
double meters );
301 virtual void startMoveAttachedContextUp();
302 virtual void stopMoveAttachedContextUp();
303 virtual void moveAttachedContextUp(
double meters );
309 virtual void startMoveAttachedContextLeft();
310 virtual void stopMoveAttachedContextLeft();
311 virtual void moveAttachedContextLeft(
double meters );
317 virtual void startMoveAttachedContextBack();
318 virtual void stopMoveAttachedContextBack();
319 virtual void moveAttachedContextBack(
double meters );
324 virtual void startMoveAttachedContextDown();
325 virtual void stopMoveAttachedContextDown();
326 virtual void moveAttachedContextDown(
double meters );
332 virtual void startYawLeft();
333 virtual void stopYawLeft();
340 virtual void startYawRight();
341 virtual void stopYawRight();
347 virtual void startPitchUp();
348 virtual void stopPitchUp();
349 virtual void rotatePitchUp(
double rads );
355 virtual void startPitchDown();
356 virtual void stopPitchDown();
357 virtual void rotatePitchDown(
double rads );
363 virtual void startRollLeft();
364 virtual void stopRollLeft();
370 virtual void startRollRight();
371 virtual void stopRollRight();
377 virtual void startLevelYawLeft();
378 virtual void stopLevelYawLeft();
385 virtual void startLevelYawRight();
386 virtual void stopLevelYawRight();
392 virtual void startLevelPitchUp();
393 virtual void stopLevelPitchUp();
399 virtual void startLevelPitchDown();
400 virtual void stopLevelPitchDown();
406 virtual void startLevelRollLeft();
407 virtual void stopLevelRollLeft();
413 virtual void startLevelRollRight();
414 virtual void stopLevelRollRight();
417 virtual void rotateLevelYawLeft(
double rads );
418 virtual void rotateLevelYawRight(
double rads );
420 virtual void startLookLeft();
421 virtual void stopLookLeft();
422 virtual void lookLeft(
double rads );
424 virtual void startLookRight();
425 virtual void stopLookRight();
426 virtual void lookRight(
double rads );
428 virtual void startLookUp();
429 virtual void stopLookUp();
430 virtual void lookUp(
double rads );
432 virtual void startLookDown();
433 virtual void stopLookDown();
434 virtual void lookDown(
double rads );
436 virtual void startLookTiltRight();
437 virtual void stopLookTiltRight();
438 virtual void lookTiltRight(
double rads );
440 virtual void startLookTiltLeft();
441 virtual void stopLookTiltLeft();
442 virtual void lookTiltLeft(
double rads );
447 virtual void startOrbitingLeft();
448 virtual void stopOrbitingLeft();
449 virtual void orbitLeft(
double rads );
455 virtual void startOrbitingRight();
456 virtual void stopOrbitingRight();
457 virtual void orbitRight(
double rads );
463 virtual void startOrbitingUp();
464 virtual void stopOrbitingUp();
465 virtual void orbitUp(
double rads );
471 virtual void startOrbitingDown();
472 virtual void stopOrbitingDown();
473 virtual void orbitDown(
double rads );
477 virtual void setLocation(
double x,
double y,
double z);
482 virtual void setAttachedLocation(
double x,
double y,
double z );
485 virtual void setOrientation(
double psi,
double theta,
double phi );
488 virtual void setOrientation(
double x,
double y,
double z,
double w);
491 virtual void setAttachedOrientation(
double psi,
double theta,
double phi );
495 void setLocalModelScalingEnabled(
bool enabled );
499 void setLocalModelScalingAmount(
float amount );
503 virtual void jumpTo(
double x,
double y,
double z );
508 virtual void orientTo(
double x,
double y,
double z );
511 virtual void dragTerrain(
double lastX,
double lastY,
double lastZ,
512 double currX,
double currY,
double currZ );
514 virtual void dragTerrain2(
double myStartDragX,
double myStartDragY,
515 double myStartDragZ,
int deltaMouseX,
int deltaMouseY );
517 virtual void dragGravityUp(
double windowUnits );
518 virtual void dragGravityDown(
double windowUnits );
519 virtual void dragGravityLeft(
double windowUnits );
520 virtual void dragGravityRight(
double windowUnits );
521 virtual void scrollObserverForward(
int wheelUnits );
522 virtual void scrollObserverBack(
int wheelUnits );
523 virtual void scrollLevelObserverForward(
int wheelUnits );
524 virtual void scrollLevelObserverBack(
int wheelUnits );
528 virtual void startIncreasingViewResolution();
529 virtual void stopIncreasingViewResolution();
530 virtual void increaseViewResolution();
532 virtual void startDecreasingViewResolution();
533 virtual void stopDecreasingViewResolution();
534 virtual void decreaseViewResolution();
537 virtual void setViewResolution(
double resolution);
540 virtual double viewResolution()
const;
543 virtual void setViewMagnification(
double mag );
546 virtual double viewMagnification()
const;
555 virtual void setOrbitSpeed(
double speed );
558 virtual void setLinearSpeed(
double speed );
561 virtual void setRotationSpeed(
double speed );
564 virtual void setMinLinearSpeed(
double minSpeed );
567 virtual void setLinearScaledSpeedGain(
double gain );
574 virtual void gotoTerrainCenter(
DtUniqueID terrainPatch,
bool retry );
577 virtual void resetAttachment();
579 virtual void resetOrientation();
582 virtual void resetCamera();
583 virtual void level();
585 virtual void stopAll();
587 virtual void attachToObjects(
const std::vector<DtUniqueID>& elementIds );
588 virtual void setSecondaryAttachment(
const std::vector<DtUniqueID>& elementIds );
589 virtual void attachToPart(
int partId);
590 virtual void detach();
592 virtual void setHideModelOnAttach(
bool hide );
593 virtual void scaleCurrentAttachments(
bool scaled );
594 virtual void setOrientToTargetConstraint(
bool orient );
595 virtual void setOrbiting(
bool orbit );
596 virtual void setOrientCameraToTargetConstraint(
bool orient );
598 virtual void setConstrainToTerrain(
bool trueFalse );
599 virtual void setConstrainToCenter(
bool trueFalse );
603 virtual void suppressConstrainToTerrain(
bool trueFalse );
605 virtual void setSpeedScaling(
bool trueFalse );
608 virtual void setSpeedScaledSpeed(
double speed );
610 virtual void getLocation(
double &x,
double &y,
double& z )
const;
612 virtual void getOrientation(
double& psi,
double& theta,
double& phi )
const;
614 virtual void getOrientation(
double& x,
double& y,
double& z,
double& w )
const;
620 virtual double fixed2DAltitude();
624 virtual double heightAboveTerrainFromCurrentZoom();
628 virtual double topographicHeading()
const;
631 virtual void getLinearVelocity(
double &x,
double &y,
double &z)
const;
634 virtual void getRotationalVelocity(
double& x,
double& y,
double& z)
const;
639 virtual void setModeSetting(
int setting,
bool value );
653 virtual double zoomFromCurrentAltitude();
657 virtual double altitudeFromCurrentZoom();
659 virtual void calcObserverWorldVectors();
660 virtual const osg::Vec3d& observerWorldUp()
const;
661 virtual const osg::Vec3d& observerWorldNorth()
const;
662 virtual const osg::Vec3d& observerWorldEast()
const;
664 virtual const osg::Vec3d& attachedWorldUp()
const;
666 virtual osg::Vec3d& observerUp();
667 virtual osg::Vec3d& observerFront();
668 virtual osg::Vec3d& observerRight();
670 virtual osg::Vec3d& attachedUp();
671 virtual osg::Vec3d& attachedFront();
672 virtual osg::Vec3d& attachedRight();
674 virtual osg::Vec3d& attachedOffsetUp();
675 virtual osg::Vec3d& attachedOffsetFront();
676 virtual osg::Vec3d& attachedOffsetRight();
679 virtual osg::Vec3d& levelAttachedUp();
680 virtual osg::Vec3d& levelAttachedFront();
681 virtual osg::Vec3d& levelAttachedRight();
684 virtual osg::Vec3d& levelObserverMimicUp();
685 virtual osg::Vec3d& levelObserverMimicFront();
686 virtual osg::Vec3d& levelObserverMimicRight();
688 virtual osg::Vec3d& cameraUp();
689 virtual osg::Vec3d& cameraFront();
690 virtual osg::Vec3d& cameraRight();
692 virtual osg::Vec3d& levelObserverUp();
693 virtual osg::Vec3d& levelObserverFront();
694 virtual osg::Vec3d& levelObserverRight();
696 virtual void advanceOrbitLeft(
double rads );
697 virtual void advanceOrbitRight(
double rads );
698 virtual void advanceOrbitUp(
double rads );
699 virtual void advanceOrbitDown(
double rads );
701 virtual void makeLevelObserverMatrix();
704 virtual void calculateLevelAttachedRotation();
707 virtual void makeLevelObserverMimicMatrix();
712 virtual osg::Vec3d calcWorldPositionChange();
714 virtual osg::Vec3d calcMimicPositionChange();
715 virtual osg::Vec3d calcFollowPositionChange();
716 virtual osg::Vec3d calcSpaceFollowPositionChange();
717 virtual osg::Vec3d calcTetherPositionChange();
718 virtual osg::Vec3d calcTetherTrackPositionChange();
719 virtual osg::Vec3d calcTrackPositionChange();
720 virtual osg::Quat calcTetherTrackRotation();
722 virtual osg::Quat calcWorldOrientationChange();
723 virtual osg::Quat calcTetherOrientationChange();
724 virtual osg::Quat calcMimicOrientationChange();
725 virtual osg::Quat calcFollowOrientationChange();
727 virtual void setCurrentAttachmentsVisibility(
bool visible );
738 virtual void orientTo(
const osg::Vec3d& target );
741 virtual void orientCameraTo(
const osg::Vec3d& target );
743 virtual TerrainResult getTerrainCenter(
const DtUniqueID& patchID, osg::Vec3d& center );
748 virtual void initializeAttachment();
750 virtual void getScalingIntersection();
751 virtual void getViewIntersection();
754 virtual double linearSpeed();
757 virtual double speedScalingGain()
const;
759 virtual void calcTerrainConstraint( osg::Vec3d prev );
766 virtual bool updateAttachPositionAndOrientation();
768 virtual bool getSecondaryAttachPosition( osg::Vec3d& position );
770 virtual void getObserverOffsetVector(
double& x,
double& y,
double& z )
const;
771 virtual void setObserverOffsetVector(
double x,
double y,
double z );
773 virtual void getAttachedRotationOffset(
double& x,
double& y,
double& z,
double& w )
const;
774 virtual void setAttachedRotationOffset(
double x,
double y,
double z,
778 osg::Vec3& bvolExtents, osg::Vec3d& bvolCenter );
781 osg::Vec3& bvolExtents, osg::Vec3d& bvolCenter );
783 virtual void setLocation(
const osg::Vec3d& location,
bool suppress=
true );
785 virtual bool isMoving()
const;
786 virtual bool isRotating()
const;
788 virtual double computeNearClipDistance(
DtSceneObject* sceneObject );
789 virtual float computeLocalModelScalingAmount(
DtSceneObject* sceneObject );
792 static void matrixdToTaitBryan(
const osg::Matrixd& mat, DtTaitBryan& tb,
bool isWorld2D =
false );
793 static double clampUnity(
double x );
795 virtual void calcScaledSpeed();
796 virtual bool getTerrainOrPropIntersection(
const osg::Vec3d& startPos,
797 const osg::Vec3d& endPos, osg::Vec3d& result )
const;
805 virtual void getPositionAndOrientation(
DtSceneObject& sceneObject, osg::Vec3d& position,
806 osg::Vec3d& orientToPosition, osg::Quat& orientation );
808 virtual void getPositionAndOrientation(
DtTerrainPatchObject& patchObject, osg::Vec3d& position,
809 osg::Vec3d& orientToPosition, osg::Quat& orientation );
812 virtual void getPositionFromSceneObject(
DtSceneObject& sceneObject, osg::Vec3d& position )
const;
816 virtual bool getPartPositionOriFromSceneObject(
DtSceneObject& sceneObject,
817 int partId, osg::Vec3d& position, osg::Quat& ori )
const;
821 virtual void force2D();
824 virtual void dimensionChanged(
bool is2D );
825 virtual void setIs2D(
bool is2D );
828 virtual double calculate3DAltitude()
const;
831 virtual void calculateAltitude();
835 virtual double zoomFromAltitude(
double altitude );
839 virtual double zoomFromHeightAboveTerrain(
double hat );
841 virtual double calcEarthRadiusAtLocalCoord(
const osg::Vec3d& local )
const;
845 virtual void synchronizeLocation(
double x,
double y,
double z );
849 virtual void synchronizeOrientation(
double x,
double y,
double z,
double w );
978 inline void applyMovement(
double linearDistance)
980 if(moving(Right)) myAdvance[0] += linearDistance;
981 if(moving(Left)) myAdvance[0] -= linearDistance;
982 if(moving(Forward)) myAdvance[1] += linearDistance;
983 if(moving(Backward)) myAdvance[1] -= linearDistance;
984 if(moving(Up)) myAdvance[2] += linearDistance;
985 if(moving(Down)) myAdvance[2] -= linearDistance;
989 inline const osg::Vec3d& advance()
const
997 myAdvance.set(0.0,0.0,0.0);
998 myEuler.set(0.0,0.0,0.0);
1001 inline void clearAdvance()
1003 myAdvance.set(0.0,0.0,0.0);
1006 inline bool stopped()
1008 return myState == Stopped;
1011 inline bool moving()
const
1013 return myState != Stopped;
1018 return (myState & d) != 0;
1023 myState = moving ? myState | d : myState & ~d;
1036 inline void applyRotation(
double angle)
1038 if(rotating(YawRight)) myEuler[0] -= angle;
1039 if(rotating(YawLeft)) myEuler[0] += angle;
1040 if(rotating(PitchUp)) myEuler[1] += angle;
1041 if(rotating(PitchDown)) myEuler[1] -= angle;
1042 if(rotating(RollRight)) myEuler[2] += angle;
1043 if(rotating(RollLeft)) myEuler[2] -= angle;
1046 inline const osg::Vec3d& euler()
const
1051 inline osg::Vec3d& euler()
1058 myEuler.set(0.0,0.0,0.0);
1061 inline bool rotating()
const
1063 return myState != Stopped;
1068 return (myState & d) != 0;
1071 inline void setRotating(
Angle d,
bool rotating )
1073 myState = rotating ? myState | d : myState & ~d;