00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 inline
00024 SceneOrbiter::SceneOrbiter(const Point3 ¢er,
00025 Real azimuth,
00026 Real elevation,
00027 Real distance) :
00028 m_is_dragging(false)
00029 {
00030 Configure(center, azimuth, elevation, distance);
00031 }
00032
00033 inline
00034 void SceneOrbiter::Configure(const Point3 ¢er,
00035 Real azimuth,
00036 Real elevation,
00037 Real distance)
00038 {
00039 assert(!m_is_dragging);
00040
00041 m_center = center;
00042 m_azimuth = NormalizeAngle(azimuth);
00043 m_elevation = NormalizeAngle(elevation);
00044 m_distance = distance;
00045 }
00046
00047 inline
00048 void SceneOrbiter::BeginDrag(Movement m, const Vector2 &p) {
00049 assert(!m_is_dragging);
00050
00051 m_old_center = m_center;
00052 m_old_azimuth = m_azimuth;
00053 m_old_elevation = m_elevation;
00054 m_old_distance = m_distance;
00055
00056 m_movement = m;
00057 m_old_point = p;
00058
00059 #ifdef REVERSE_AZIMUTH
00060 if(m_movement == Movement::TUMBLE) {
00061 m_reverse_azimuth = (fabs(m_elevation) > PI / 2.0);
00062 }
00063 #endif // REVERSE_AZIMUTH
00064
00065 m_is_dragging = true;
00066 }
00067
00068 inline
00069 void SceneOrbiter::UpdateDrag(const Vector2 &p) {
00070 assert(m_is_dragging);
00071
00072 const Vector2 delta = p - m_old_point;
00073
00074 m_old_point = p;
00075
00076 switch(m_movement) {
00077 case Movement::TUMBLE:
00078 tumble(delta);
00079 break;
00080 case Movement::TRACK:
00081 track(delta);
00082 break;
00083 case Movement::DOLLY:
00084 dolly(delta);
00085 break;
00086 }
00087 }
00088
00089 inline
00090 void SceneOrbiter::EndDrag() {
00091 assert(m_is_dragging);
00092 m_is_dragging = false;
00093 }
00094
00095 inline
00096 void SceneOrbiter::CancelDrag() {
00097 assert(m_is_dragging);
00098
00099 m_center = m_old_center;
00100 m_azimuth = m_old_azimuth;
00101 m_elevation = m_old_elevation;
00102 m_distance = m_old_distance;
00103
00104 m_is_dragging = false;
00105 }
00106
00107 inline
00108 bool SceneOrbiter::IsTumbling() const {
00109 return
00110 m_is_dragging &&
00111 m_movement == Movement::TUMBLE;
00112 }
00113
00114 inline
00115 bool SceneOrbiter::IsTracking() const {
00116 return
00117 m_is_dragging &&
00118 m_movement == Movement::TRACK;
00119 }
00120
00121 inline
00122 bool SceneOrbiter::IsDollying() const {
00123 return
00124 m_is_dragging &&
00125 m_movement == Movement::DOLLY;
00126 }
00127
00128 inline
00129 bool SceneOrbiter::IsDragging() const {
00130 return m_is_dragging;
00131 }
00132
00133 inline
00134 void SceneOrbiter::SetCenter(const Point3 ¢er) {
00135 m_center = center;
00136 }
00137
00138 inline
00139 const Point3 &SceneOrbiter::GetCenter() const {
00140 return m_center;
00141 }
00142
00143 inline
00144 Point3 SceneOrbiter::GetEyePosition() const {
00145 Point3 eye = m_center;
00146
00147 eye.m_x += m_distance * cos(m_elevation) * cos(m_azimuth);
00148 eye.m_y += m_distance * sin(m_elevation);
00149 eye.m_z += m_distance * cos(m_elevation) * sin(m_azimuth);
00150
00151 return eye;
00152 }
00153
00154 inline
00155 Real SceneOrbiter::GetAzimuth() const {
00156 return m_azimuth;
00157 }
00158
00159 inline
00160 Real SceneOrbiter::GetElevation() const {
00161 return m_elevation;
00162 }
00163
00164 inline
00165 Real SceneOrbiter::GetDistance() const {
00166 return m_distance;
00167 }