OSGFlyEngine.cpp

Go to the documentation of this file.
00001 /*---------------------------------------------------------------------------*\
00002  *                                OpenSG                                     *
00003  *                                                                           *
00004  *                                                                           *
00005  *             Copyright (C) 2000-2002 by the OpenSG Forum                   *
00006  *                                                                           *
00007  *                            www.opensg.org                                 *
00008  *                                                                           *
00009  *   contact: dirk@opensg.org, gerrit.voss@vossg.org, jbehr@zgdv.de          *
00010  *                                                                           *
00011 \*---------------------------------------------------------------------------*/
00012 /*---------------------------------------------------------------------------*\
00013  *                                License                                    *
00014  *                                                                           *
00015  * This library is free software; you can redistribute it and/or modify it   *
00016  * under the terms of the GNU Library General Public License as published    *
00017  * by the Free Software Foundation, version 2.                               *
00018  *                                                                           *
00019  * This library is distributed in the hope that it will be useful, but       *
00020  * WITHOUT ANY WARRANTY; without even the implied warranty of                *
00021  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU         *
00022  * Library General Public License for more details.                          *
00023  *                                                                           *
00024  * You should have received a copy of the GNU Library General Public         *
00025  * License along with this library; if not, write to the Free Software       *
00026  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.                 *
00027  *                                                                           *
00028 \*---------------------------------------------------------------------------*/
00029 /*---------------------------------------------------------------------------*\
00030  *                                Changes                                    *
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  *                            Description                                  *
00054 \***************************************************************************/
00055
00084 /*------------------------- constructors ----------------------------------*/
00085
00086 FlyEngineTransitPtr
00087 FlyEngine::create(void)
00088 {
00089     return FlyEngineTransitPtr(new FlyEngine);
00090 }
00091
00092 /*------------------------------ get --------------------------------------*/
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 // FIXME: remove getDistance() from NavigatorEngine???
00126 Real32 FlyEngine::getDistance()
00127 {
00128     return 0.0f;
00129 }
00130
00131 /*------------------------------ set --------------------------------------*/
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 /*---------------------- navigator engine callbacks ------------------------*/
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             //IDLE
00266             break;
00267     }
00268 }
00269
00270 void FlyEngine::idle(Int16 buttons, Int16 x,Int16 y,Navigator* nav)
00271 {
00272 }
00273
00274 /*---------------------- Flyer Transformations ----------------------------*/
00275
00279 void FlyEngine::rotate(Real32 deltaX, Real32 deltaY)
00280 {
00281     // rotate around the up vector
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     // rotate around the side vector
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 /*-------------------------- constructors ---------------------------------*/
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 /*-------------------------- destructors ----------------------------------*/
00364
00365 FlyEngine::~FlyEngine()
00366 {
00367 }