00001 // Copyright NVIDIA Corporation 2002-2004 00002 // TO THE MAXIMUM EXTENT PERMITTED BY APPLICABLE LAW, THIS SOFTWARE IS PROVIDED 00003 // *AS IS* AND NVIDIA AND ITS SUPPLIERS DISCLAIM ALL WARRANTIES, EITHER EXPRESS 00004 // OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY 00005 // AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL NVIDIA OR ITS SUPPLIERS 00006 // BE LIABLE FOR ANY SPECIAL, INCIDENTAL, INDIRECT, OR CONSEQUENTIAL DAMAGES 00007 // WHATSOEVER (INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF BUSINESS PROFITS, 00008 // BUSINESS INTERRUPTION, LOSS OF BUSINESS INFORMATION, OR ANY OTHER PECUNIARY LOSS) 00009 // ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, EVEN IF NVIDIA HAS 00010 // BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES 00011 00012 #pragma once 00013 00015 #include "nvsgcommon.h" 00016 00017 #include "nvui/CameraManipulator.h" 00018 00019 namespace nvui 00020 { 00022 00037 class FlightCamManip : public CameraManipulator 00038 { 00039 public: 00041 NVSG_API FlightCamManip(void); 00042 00044 NVSG_API ~FlightCamManip(void); 00045 00047 enum 00048 { _W_KEY = 0x0400 00049 , _S_KEY = 0x0800 00050 }; 00051 00053 00054 NVSG_API virtual void apply(void); 00055 00057 00058 NVSG_API virtual void keyRepeat(); 00059 00061 00066 bool isFly(void); 00067 00069 00071 void setScreenSize( UINT x 00072 , UINT y 00073 ); 00074 00076 00077 void setWorldUpVector( nvmath::Vec3f up 00078 ); 00080 00081 const nvmath::Vec3f& getWorldUpVector(); 00082 00084 00085 void setSpeedIncreaseFactor(float factor 00086 ); 00087 00089 00090 float getSpeedIncreaseFactor(); 00091 00093 00095 void setHSensitivity(float sensitivity 00096 ); 00097 00099 00100 float getHSensitivity(); 00101 00103 00105 void setVSensitivity(float sensitivity 00106 ); 00107 00109 00110 float getVSensitivity(); 00111 00113 00114 void setSpeed(float speed 00115 ); 00116 00118 00119 float getSpeed(); 00120 00121 protected: 00122 UINT m_ScreenSizeX; 00123 UINT m_ScreenSizeY; 00124 00125 nvmath::Vec3f m_worldUpVector; 00126 00127 float m_speedIncreaseFactor; 00128 float m_hSensitivity; 00129 float m_vSensitivity; 00130 00131 float m_speed; 00132 00133 static NVSG_API const UINT FLYFORWARD; 00134 static NVSG_API const UINT FLYBACKWARD; 00135 static NVSG_API const UINT INCREASESPEED; 00136 static NVSG_API const UINT DECREASESPEED; 00137 00138 static NVSG_API const float AREAOFPEACE; 00139 00141 00142 NVSG_API virtual UINT convertKey(UINT key 00143 ); 00145 00147 void fly(void); 00148 00150 00155 bool isFlyForward(void); 00156 00158 00163 bool isFlyBackward(void); 00164 00165 }; 00166 00167 inline bool FlightCamManip::isFly(void) 00168 { 00169 return (isFlyForward() || isFlyBackward()); 00170 } 00171 00172 inline bool FlightCamManip::isFlyForward(void) 00173 { 00174 return(FLYFORWARD == m_buttonState && ( m_keyState == 0 00175 || m_keyState == INCREASESPEED 00176 || m_keyState == DECREASESPEED)); 00177 } 00178 00179 inline bool FlightCamManip::isFlyBackward(void) 00180 { 00181 return(FLYBACKWARD == m_buttonState && ( m_keyState == 0 00182 || m_keyState == INCREASESPEED 00183 || m_keyState == DECREASESPEED)); 00184 } 00185 00186 inline void FlightCamManip::setScreenSize(UINT x, UINT y) 00187 { 00188 __ASSERT(x>0); 00189 __ASSERT(y>0); 00190 m_ScreenSizeX = x; 00191 m_ScreenSizeX = y; 00192 } 00193 00194 inline void FlightCamManip::setWorldUpVector(nvmath::Vec3f up) 00195 { 00196 m_worldUpVector = up; 00197 } 00198 00199 inline const nvmath::Vec3f& FlightCamManip::getWorldUpVector() 00200 { 00201 return m_worldUpVector; 00202 } 00203 00204 inline void FlightCamManip::setSpeedIncreaseFactor(float factor) 00205 { 00206 __ASSERT(fabs(factor) > FLT_EPSILON); 00207 m_speedIncreaseFactor = factor; 00208 } 00209 00210 inline float FlightCamManip::getSpeedIncreaseFactor() 00211 { 00212 return m_speedIncreaseFactor; 00213 } 00214 00215 inline void FlightCamManip::setHSensitivity(float sensitivity) 00216 { 00217 m_hSensitivity = sensitivity; 00218 } 00219 00220 inline float FlightCamManip::getHSensitivity() 00221 { 00222 return m_hSensitivity; 00223 } 00224 00225 inline void FlightCamManip::setVSensitivity(float sensitivity) 00226 { 00227 m_vSensitivity = sensitivity; 00228 } 00229 00230 inline float FlightCamManip::getVSensitivity() 00231 { 00232 return m_vSensitivity; 00233 } 00234 00235 inline void FlightCamManip::setSpeed(float speed) 00236 { 00237 m_speed = speed; 00238 } 00239 00240 inline float FlightCamManip::getSpeed() 00241 { 00242 return m_speed; 00243 } 00244 00245 } // namespace nvui