Main Page | Namespace List | Class Hierarchy | Alphabetical List | Class List | File List | Namespace Members | Class Members | File Members | Related Pages

sceneorbiter.inl

Go to the documentation of this file.
00001 /*
00002     Sheep - A Rigid Body Dynamics Engine
00003     Copyright (C) 2001-2004 Francois Beaune
00004     Contact: http://toxicengine.sourceforge.net/
00005 
00006     This file is part of Sheep.
00007 
00008     Sheep is free software; you can redistribute it and/or modify
00009     it under the terms of the GNU General Public License as published by
00010     the Free Software Foundation; either version 2 of the License, or
00011     (at your option) any later version.
00012 
00013     Sheep is distributed in the hope that it will be useful,
00014     but WITHOUT ANY WARRANTY; without even the implied warranty of
00015     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00016     GNU General Public License for more details.
00017 
00018     You should have received a copy of the GNU General Public License
00019     along with Sheep; if not, write to the Free Software
00020     Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
00021 */
00022 
00023 inline
00024 SceneOrbiter::SceneOrbiter(const Point3 &center,
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 &center,
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 &center) {
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 }

Generated on Tue May 11 01:31:52 2004 for toxic by doxygen 1.3.6