00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039 #include "OSGConfig.h"
00040 #include "OSGBaseTypes.h"
00041 #include "OSGMatrix.h"
00042 #include "OSGMatrixUtility.h"
00043
00044 #include "OSGFlyEngine.h"
00045 #include "OSGNavigator.h"
00046 #include "OSGNode.h"
00047 #include "OSGCamera.h"
00048 #include "OSGBackground.h"
00049
00050 OSG_USING_NAMESPACE
00051
00052
00053
00054
00055
00084
00085
00086 FlyEngineTransitPtr
00087 FlyEngine::create(void)
00088 {
00089 return FlyEngineTransitPtr(new FlyEngine);
00090 }
00091
00092
00093
00096 const Pnt3f &FlyEngine::getFrom()
00097 {
00098 return _rFrom;
00099 }
00100
00103 const Pnt3f &FlyEngine::getAt()
00104 {
00105 return _rAt;
00106 }
00107
00110 const Vec3f &FlyEngine::getUp()
00111 {
00112 return _vUp;
00113 }
00114
00117 const Matrix &FlyEngine::getMatrix()
00118 {
00119 MatrixLookAt(_tMatrix,_rFrom,_rAt,_vUp);
00120 return _tMatrix;
00121 }
00122
00125
00126 Real32 FlyEngine::getDistance()
00127 {
00128 return 0.0f;
00129 }
00130
00131
00132
00136 void FlyEngine::setFrom(Pnt3f new_from)
00137 {
00138 _rFrom=new_from;
00139 }
00140
00143 void FlyEngine::setAt(Pnt3f new_At)
00144 {
00145 _rAt=new_At;
00146 }
00147
00150 void FlyEngine::setUp(Vec3f new_up)
00151 {
00152 _vUp=new_up;
00153 }
00154
00157 void FlyEngine::set(Pnt3f new_from,Pnt3f new_At,Vec3f new_up)
00158 {
00159 _rFrom=new_from;
00160 _rAt=new_At;
00161 _vUp=new_up;
00162 }
00163
00166 void FlyEngine::set(const Matrix& new_matrix)
00167 {
00168 _rFrom= Pnt3f(new_matrix[3]);
00169 _rAt = Pnt3f(new_matrix[3] - new_matrix[2]);
00170 _vUp = Vec3f(new_matrix[1]);
00171
00172 set(_rFrom, _rAt, _vUp);
00173 }
00174
00177 void FlyEngine::setDistance(Real32 dist)
00178 {
00179 forward(dist);
00180 }
00181
00182
00183
00184 void FlyEngine::buttonPress(Int16 button, Int16 x, Int16 y, Navigator* nav)
00185 {
00186 switch (button)
00187 {
00188 case Navigator::LEFT_MOUSE:
00189 _currentState = Navigator::TRANSLATING_ZPLUS;
00190 break;
00191 case Navigator::MIDDLE_MOUSE:
00192 _currentState = Navigator::ROTATING;
00193 break;
00194 case Navigator::RIGHT_MOUSE:
00195 _currentState = Navigator::TRANSLATING_ZMINUS;
00196 break;
00197 case Navigator::UP_MOUSE:
00198 _currentState = Navigator::IDLE;
00199 forward(-nav->getMotionFactor());
00200 break;
00201 case Navigator::DOWN_MOUSE:
00202 _currentState = Navigator::IDLE;
00203 forward(nav->getMotionFactor());
00204 break;
00205 default:
00206 FNOTICE(("FlyEngine: buttonPress, unknown button\n"));
00207 break;
00208 }
00209 }
00210
00211 void FlyEngine::buttonRelease(Int16 button, Int16 x,Int16 y,Navigator* nav)
00212 {
00213 _currentState = Navigator::IDLE;
00214 }
00215
00216 void FlyEngine::keyPress(Int16 key, Int16 x,Int16 y,Navigator* nav)
00217 {
00218 switch (key)
00219 {
00220 case Navigator::LEFTROT:
00221 rotate(-nav->getRotationAngle(), 0);
00222 break;
00223 case Navigator::RIGHTROT:
00224 rotate(nav->getRotationAngle(), 0);
00225 break;
00226 case Navigator::LEFT:
00227 right(nav->getMotionFactor());
00228 break;
00229 case Navigator::RIGHT:
00230 right(-nav->getMotionFactor());
00231 break;
00232 case Navigator::FORWARDS:
00233 forward(-nav->getMotionFactor());
00234 break;
00235 case Navigator::BACKWARDS:
00236 forward( nav->getMotionFactor());
00237 break;
00238 default:
00239 FNOTICE(("FlyEngine: keyPress, unknown key\n"));
00240 break;
00241 }
00242 }
00243
00244 void FlyEngine::moveTo(Int16 x,Int16 y,Navigator* nav)
00245 {
00246 Real32 fromX,fromY, toX,toY;
00247
00248 nav->calcFromTo(x,y, fromX,fromY, toX,toY);
00249
00250 Real32 distanceX = -(fromX-toX);
00251 Real32 distanceY = (fromY-toY);
00252 rotate(distanceX, distanceY);
00253
00254 switch (_currentState)
00255 {
00256 case Navigator::TRANSLATING_ZPLUS:
00257 forward(-nav->getMotionFactor());
00258 break;
00259 case Navigator::TRANSLATING_ZMINUS:
00260 forward(nav->getMotionFactor());
00261 break;
00262 case Navigator::ROTATING:
00263 break;
00264 default:
00265
00266 break;
00267 }
00268 }
00269
00270 void FlyEngine::idle(Int16 buttons, Int16 x,Int16 y,Navigator* nav)
00271 {
00272 }
00273
00274
00275
00279 void FlyEngine::rotate(Real32 deltaX, Real32 deltaY)
00280 {
00281
00282 Matrix final,temp;
00283 Quaternion q;
00284
00285 q.setValueAsAxisRad(_vUp,-deltaX);
00286 q.getValue(temp);
00287
00288 final.setIdentity();
00289 final.setTranslate(_rFrom);
00290 final.mult(temp);
00291
00292 temp.setIdentity();
00293 temp.setTranslate(-_rFrom[0],-_rFrom[1],-_rFrom[2]);
00294
00295 final.mult(temp );
00296 final.mult(_rAt, _rAt);
00297
00298
00299
00300 Vec3f lv = _rAt-_rFrom;
00301 lv.normalize();
00302
00303 Vec3f sv = lv;
00304 sv.crossThis(_vUp);
00305 sv.normalize();
00306 q.setValueAsAxisRad(sv,-deltaY);
00307 q.getValue(temp);
00308
00309 final.setIdentity();
00310 final.setTranslate(_rFrom);
00311 final.mult(temp);
00312
00313 temp.setIdentity();
00314 temp.setTranslate(-_rFrom[0],-_rFrom[1],-_rFrom[2]);
00315
00316 final.mult(temp);
00317 final.mult(_rAt, _rAt);
00318 }
00319
00322 Real32 FlyEngine::forward(Real32 step)
00323 {
00324 Vec3f lv;
00325 lv = _rFrom-_rAt;
00326 lv.normalize();
00327 lv *= (step);
00328 Matrix transl;
00329 transl.setIdentity();
00330 transl.setTranslate(lv);
00331 transl.mult(_rAt, _rAt );
00332 transl.mult(_rFrom, _rFrom);
00333 return 0.0;
00334 }
00335
00338 Real32 FlyEngine::right(Real32 step)
00339 {
00340 Vec3f sv;
00341 sv = _rFrom-_rAt;
00342 sv.crossThis(_vUp);
00343 sv.normalize();
00344 sv *= (step);
00345 Matrix transl;
00346 transl.setIdentity();
00347 transl.setTranslate(sv);
00348 transl.mult(_rAt, _rAt );
00349 transl.mult(_rFrom, _rFrom);
00350 return 0.0;
00351 }
00352
00353
00354
00355 FlyEngine::FlyEngine(void) : Inherited()
00356 {
00357 _rFrom .setValues(0,0,0);
00358 _rAt .setValues(0,0,1);
00359 _vUp .setValues(0,1,0);
00360 _tMatrix.setIdentity();
00361 }
00362
00363
00364
00365 FlyEngine::~FlyEngine()
00366 {
00367 }