00001
00002
00003
00004
00005 #include "config.h"
00006
00007 using namespace std;
00008
00009 namespace eqPly
00010 {
00011
00012 Config::Config( eq::base::RefPtr< eq::Server > parent )
00013 : eq::Config( parent )
00014 , _spinX( 5 )
00015 , _spinY( 5 )
00016 , _model( 0 )
00017 , _modelDist( 0 )
00018 , _redraw( true )
00019 {
00020 }
00021
00022 Config::~Config()
00023 {
00024 delete _model;
00025 _model = 0;
00026
00027 delete _modelDist;
00028 _modelDist = 0;
00029 }
00030
00031 bool Config::init()
00032 {
00033 _loadModel();
00034
00035
00036 _frameData.data.color = _initData.useColor();
00037 _frameData.data.renderMode = _initData.getRenderMode();
00038 registerObject( &_frameData );
00039
00040 _initData.setFrameDataID( _frameData.getID( ));
00041 registerObject( &_initData );
00042
00043
00044 if( !eq::Config::init( _initData.getID( )))
00045 return false;
00046
00047
00048 if( !_initData.getTrackerPort().empty( ))
00049 {
00050 if( !_tracker.init( _initData.getTrackerPort() ))
00051 EQWARN << "Failed to initialise tracker" << endl;
00052 else
00053 {
00054
00055
00056 vmml::Matrix4f m( vmml::Matrix4f::IDENTITY );
00057 m.scale( 1.f, 1.f, -1.f );
00058 _tracker.setWorldToEmitter( m );
00059
00060 m = vmml::Matrix4f::IDENTITY;
00061 m.rotateZ( -M_PI_2 );
00062 _tracker.setSensorToObject( m );
00063 EQINFO << "Tracker initialized" << endl;
00064 }
00065 }
00066
00067 return true;
00068 }
00069
00070 bool Config::exit()
00071 {
00072 const bool ret = eq::Config::exit();
00073
00074 _initData.setFrameDataID( EQ_ID_INVALID );
00075 deregisterObject( &_initData );
00076 deregisterObject( &_frameData );
00077
00078 if( _modelDist )
00079 {
00080 _modelDist->deregisterTree();
00081 delete _modelDist;
00082 _modelDist = 0;
00083
00084 _initData.setModelID( EQ_ID_INVALID );
00085
00086 }
00087
00088 return ret;
00089 }
00090
00091 void Config::_loadModel()
00092 {
00093 if( !_model )
00094 {
00095 const string& filename = _initData.getFilename();
00096 EQINFO << "Loading model " << filename << endl;
00097
00098 _model = new Model;
00099
00100 if( _initData.useInvertedFaces() )
00101 _model->useInvertedFaces();
00102
00103 if ( !_model->readFromFile( filename.c_str() ) )
00104 {
00105 EQWARN << "Can't load model: " << filename << endl;
00106
00107 delete _model;
00108 _model = 0;
00109 return;
00110 }
00111 }
00112
00113 if( !_modelDist )
00114 {
00115 EQASSERT( _model );
00116 _modelDist = new ModelDist( _model );
00117 _modelDist->registerTree( this );
00118 EQASSERT( _modelDist->getID() != EQ_ID_INVALID );
00119
00120 _initData.setModelID( _modelDist->getID( ));
00121 }
00122 }
00123
00124 bool Config::mapData( const uint32_t initDataID )
00125 {
00126 if( _initData.getID() == EQ_ID_INVALID )
00127 {
00128 EQCHECK( mapObject( &_initData, initDataID ));
00129 unmapObject( &_initData );
00130 }
00131 else
00132 EQASSERT( _initData.getID() == initDataID );
00133
00134 const uint32_t modelID = _initData.getModelID();
00135 if( modelID == EQ_ID_INVALID )
00136 return true;
00137
00138 if( !_model )
00139 _model = ModelDist::mapModel( this, modelID );
00140
00141 return (_model != 0);
00142 }
00143
00144 uint32_t Config::startFrame()
00145 {
00146
00147 if( _tracker.isRunning() )
00148 {
00149 _tracker.update();
00150 const vmml::Matrix4f& headMatrix = _tracker.getMatrix();
00151 setHeadMatrix( headMatrix );
00152 }
00153
00154
00155 _frameData.data.rotation.preRotateX( -0.001f * _spinX );
00156 _frameData.data.rotation.preRotateY( -0.001f * _spinY );
00157 const uint32_t version = _frameData.commit();
00158
00159 _redraw = false;
00160 return eq::Config::startFrame( version );
00161 }
00162
00163 bool Config::needsRedraw()
00164 {
00165 return ( _spinX != 0 || _spinY != 0 || _tracker.isRunning() || _redraw );
00166 }
00167
00168 bool Config::handleEvent( const eq::ConfigEvent* event )
00169 {
00170 switch( event->data.type )
00171 {
00172 case eq::Event::KEY_PRESS:
00173 _redraw = true;
00174 switch( event->data.keyPress.key )
00175 {
00176 case 'r':
00177 case 'R':
00178 case ' ':
00179 _spinX = 0;
00180 _spinY = 0;
00181 _frameData.reset();
00182 setHeadMatrix( vmml::Matrix4f::IDENTITY );
00183 return true;
00184
00185 case 'o':
00186 case 'O':
00187 _frameData.data.ortho = !_frameData.data.ortho;
00188 return true;
00189
00190 case 's':
00191 case 'S':
00192 _frameData.data.statistics = !_frameData.data.statistics;
00193 return true;
00194
00195 case 'm':
00196 case 'M':
00197 _frameData.data.renderMode = static_cast<mesh::RenderMode>
00198 ((_frameData.data.renderMode+1)%mesh::RENDER_MODE_ALL);
00199 EQINFO << "Switched to " << _frameData.data.renderMode
00200 << endl;
00201 return true;
00202
00203
00204 case eq::KC_UP:
00205 {
00206 vmml::Matrix4f headMatrix = getHeadMatrix();
00207 headMatrix.y += 0.1f;
00208 setHeadMatrix( headMatrix );
00209 return true;
00210 }
00211 case eq::KC_DOWN:
00212 {
00213 vmml::Matrix4f headMatrix = getHeadMatrix();
00214 headMatrix.y -= 0.1f;
00215 setHeadMatrix( headMatrix );
00216 return true;
00217 }
00218 case eq::KC_RIGHT:
00219 {
00220 vmml::Matrix4f headMatrix = getHeadMatrix();
00221 headMatrix.x += 0.1f;
00222 setHeadMatrix( headMatrix );
00223 return true;
00224 }
00225 case eq::KC_LEFT:
00226 {
00227 vmml::Matrix4f headMatrix = getHeadMatrix();
00228 headMatrix.x -= 0.1f;
00229 setHeadMatrix( headMatrix );
00230 return true;
00231 }
00232 case eq::KC_PAGE_DOWN:
00233 {
00234 vmml::Matrix4f headMatrix = getHeadMatrix();
00235 headMatrix.z += 0.1f;
00236 setHeadMatrix( headMatrix );
00237 return true;
00238 }
00239 case eq::KC_PAGE_UP:
00240 {
00241 vmml::Matrix4f headMatrix = getHeadMatrix();
00242 headMatrix.z -= 0.1f;
00243 setHeadMatrix( headMatrix );
00244 return true;
00245 }
00246
00247 default:
00248 break;
00249 }
00250 break;
00251
00252 case eq::Event::POINTER_BUTTON_RELEASE:
00253 if( event->data.pointerButtonRelease.buttons == eq::PTR_BUTTON_NONE
00254 && event->data.pointerButtonRelease.button == eq::PTR_BUTTON1 )
00255 {
00256 _spinX = event->data.pointerButtonRelease.dx;
00257 _spinY = event->data.pointerButtonRelease.dy;
00258 _redraw = true;
00259 }
00260 return true;
00261
00262 case eq::Event::POINTER_MOTION:
00263 if( event->data.pointerMotion.buttons == eq::PTR_BUTTON_NONE )
00264 return true;
00265
00266 if( event->data.pointerMotion.buttons == eq::PTR_BUTTON1 )
00267 {
00268 _spinX = 0;
00269 _spinY = 0;
00270
00271 _frameData.data.rotation.preRotateX(
00272 -0.005f * event->data.pointerMotion.dx );
00273 _frameData.data.rotation.preRotateY(
00274 -0.005f * event->data.pointerMotion.dy );
00275
00276 _redraw = true;
00277 }
00278 else if( event->data.pointerMotion.buttons == eq::PTR_BUTTON2 ||
00279 event->data.pointerMotion.buttons == ( eq::PTR_BUTTON1 |
00280 eq::PTR_BUTTON3 ))
00281 {
00282 _frameData.data.translation.z +=
00283 .005f * event->data.pointerMotion.dy;
00284
00285 _redraw = true;
00286 }
00287 else if( event->data.pointerMotion.buttons == eq::PTR_BUTTON3 )
00288 {
00289 _frameData.data.translation.x +=
00290 .0005f * event->data.pointerMotion.dx;
00291 _frameData.data.translation.y -=
00292 .0005f * event->data.pointerMotion.dy;
00293
00294 _redraw = true;
00295 }
00296 return true;
00297
00298 case eq::Event::EXPOSE:
00299 case eq::Event::WINDOW_RESIZE:
00300 case eq::Event::WINDOW_CLOSE:
00301 case eq::Event::VIEW_RESIZE:
00302 _redraw = true;
00303 break;
00304
00305 default:
00306 break;
00307 }
00308
00309 return eq::Config::handleEvent( event );
00310 }
00311 }