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 { 00021 00023 00040 class WalkCamManip : public CameraManipulator 00041 { 00042 public: 00044 NVSG_API WalkCamManip(void); 00046 NVSG_API ~WalkCamManip(void); 00047 00049 enum 00050 { _W_KEY = 0x0400 00051 , _S_KEY = 0x0800 00052 }; 00053 00055 00056 NVSG_API virtual void keyRepeat(); 00057 00059 00060 NVSG_API virtual void apply(); 00061 00063 00068 bool isWalk(void); 00069 00071 00076 bool isTranslate(void); 00077 00079 00084 bool isTilt(void); 00085 00087 00089 void setScreenSize( UINT x 00090 , UINT y 00091 ); 00092 00094 00095 void setWorldUpVector( nvmath::Vec3f up 00096 ); 00098 00099 const nvmath::Vec3f& getWorldUpVector(); 00100 00102 00103 void setSpeedIncreaseFactor(float factor 00104 ); 00105 00107 00108 float getSpeedIncreaseFactor(); 00109 00111 00113 void setHSensitivity(float sensitivity 00114 ); 00115 00117 00118 float getHSensitivity(); 00119 00121 00122 void setSpeed(float speed 00123 ); 00124 00126 00127 float getSpeed(); 00128 00129 protected: 00130 UINT m_ScreenSizeX; 00131 UINT m_ScreenSizeY; 00132 00133 nvmath::Vec3f m_worldUpVector; 00134 00135 float m_speedIncreaseFactor; 00136 float m_hSensitivity; 00137 00138 float m_speed; 00139 00140 static NVSG_API const UINT WALKFORWARD; 00141 static NVSG_API const UINT WALKBACKWARD; 00142 static NVSG_API const UINT TRANSLATE; 00143 static NVSG_API const UINT TILT; 00144 static NVSG_API const UINT INCREASESPEED; 00145 static NVSG_API const UINT DECREASESPEED; 00146 00147 static NVSG_API const UINT AREAOFPEACE; 00148 00150 00151 NVSG_API virtual UINT convertKey(UINT key 00152 ); 00153 00155 00160 bool isWalkForward( void ); 00161 00163 00168 bool isWalkBackward( void ); 00169 00171 00173 NVSG_API virtual void walk( void ); 00174 00176 00179 NVSG_API virtual void translate( void ); 00180 00182 00185 NVSG_API virtual void tilt( void ); 00186 }; 00187 00188 inline bool WalkCamManip::isWalk( void ) 00189 { 00190 return( isWalkForward() || isWalkBackward() ); 00191 } 00192 00193 inline bool WalkCamManip::isWalkForward( void ) 00194 { 00195 return(WALKFORWARD == m_buttonState && ( m_keyState == 0 00196 || m_keyState == INCREASESPEED 00197 || m_keyState == DECREASESPEED)); 00198 } 00199 00200 inline bool WalkCamManip::isWalkBackward( void ) 00201 { 00202 return(WALKBACKWARD == m_buttonState && ( m_keyState == 0 00203 || m_keyState == INCREASESPEED 00204 || m_keyState == DECREASESPEED)); 00205 } 00206 00207 inline bool WalkCamManip::isTranslate( void ) 00208 { 00209 return( TRANSLATE == ((m_buttonState | m_keyState)) ); 00210 } 00211 00212 inline bool WalkCamManip::isTilt( void ) 00213 { 00214 return( TILT == ((m_buttonState | m_keyState)) ); 00215 } 00216 00217 inline void WalkCamManip::setScreenSize(UINT x, UINT y) 00218 { 00219 __ASSERT(x>0); 00220 __ASSERT(y>0); 00221 m_ScreenSizeX = x; 00222 m_ScreenSizeX = y; 00223 } 00224 00225 inline void WalkCamManip::setWorldUpVector( nvmath::Vec3f up ) 00226 { 00227 m_worldUpVector = up; 00228 } 00229 00230 inline const nvmath::Vec3f& WalkCamManip::getWorldUpVector() 00231 { 00232 return m_worldUpVector; 00233 } 00234 00235 inline void WalkCamManip::setSpeedIncreaseFactor(float factor) 00236 { 00237 __ASSERT(fabs(factor) > FLT_EPSILON); 00238 m_speedIncreaseFactor = factor; 00239 } 00240 00241 inline float WalkCamManip::getSpeedIncreaseFactor() 00242 { 00243 return m_speedIncreaseFactor; 00244 } 00245 00246 inline void WalkCamManip::setHSensitivity(float sensitivity) 00247 { 00248 m_hSensitivity = sensitivity; 00249 } 00250 00251 inline float WalkCamManip::getHSensitivity() 00252 { 00253 return m_hSensitivity; 00254 } 00255 00256 inline void WalkCamManip::setSpeed(float speed) 00257 { 00258 m_speed = speed; 00259 } 00260 00261 inline float WalkCamManip::getSpeed() 00262 { 00263 return m_speed; 00264 } 00265 } // namespace nvui