examples/eqNBody/config.cpp
00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #include "config.h"
00019 #include <eq/client/types.h>
00020
00021 using namespace eq;
00022 using namespace eq::base;
00023 using namespace std;
00024
00025 namespace eqNbody
00026 {
00027
00028 Config::Config( eq::base::RefPtr< eq::Server > parent )
00029 : eq::Config( parent )
00030 , _redraw( true )
00031 {
00032 }
00033
00034 bool Config::init()
00035 {
00036
00037 registerObject( &_frameData );
00038
00039 _frameData.init( _initData.getNumBodies() );
00040 _frameData.updateParameters(NBODY_CONFIG_SHELL, 2.12f, 2.98f, 0.016f);
00041
00042 _initData.setFrameDataID( _frameData.getID( ));
00043 registerObject( &_initData );
00044
00045
00046 if( !eq::Config::init( _initData.getID( )))
00047 {
00048 _deregisterData();
00049 return false;
00050 }
00051
00052 return true;
00053 }
00054
00055 bool Config::exit()
00056 {
00057 const bool ret = eq::Config::exit();
00058 _deregisterData();
00059
00060 return ret;
00061 }
00062
00063 void Config::_deregisterData()
00064 {
00065 deregisterObject( &_initData );
00066 deregisterObject( &_frameData );
00067
00068 _initData.setFrameDataID( EQ_ID_INVALID );
00069 }
00070
00071
00072 void Config::mapData( const uint32_t initDataID )
00073 {
00074 if( _initData.getID() == EQ_ID_INVALID )
00075 {
00076 EQCHECK( mapObject( &_initData, initDataID ));
00077 unmapObject( &_initData );
00078 }
00079 else
00080 {
00081 EQASSERT( _initData.getID() == initDataID );
00082 }
00083 }
00084
00085 void Config::unmapData()
00086 {
00087 unmapObject( &_initData );
00088 }
00089
00090 uint32_t Config::startFrame()
00091 {
00092
00093 uint32_t version = _frameData.getVersion();
00094
00095 _redraw = false;
00096 return eq::Config::startFrame( version );
00097 }
00098
00099 bool Config::needsRedraw()
00100 {
00101 return ( _redraw );
00102 }
00103
00104 bool Config::handleEvent( const eq::ConfigEvent* event )
00105 {
00106 switch( event->data.type )
00107 {
00108 case ConfigEvent::DATA_CHANGED:
00109 _registerData(static_cast< const ConfigEvent* >( event ));
00110 if( _readyToCommit() ) {
00111 _frameData.commit();
00112 }
00113 break;
00114
00115 case ConfigEvent::PROXY_CHANGED:
00116 {
00117 _updateData(static_cast< const ConfigEvent* >( event ));
00118 if( _readyToCommit() ) {
00119 _updateSimulation();
00120 _frameData.commit();
00121 }
00122 }
00123 break;
00124
00125 case eq::Event::KEY_PRESS:
00126 if( _handleKeyEvent( event->data.keyPress ))
00127 {
00128 _redraw = true;
00129 return true;
00130 }
00131 break;
00132
00133 case eq::Event::EXPOSE:
00134 case eq::Event::WINDOW_RESIZE:
00135 case eq::Event::WINDOW_CLOSE:
00136 case eq::Event::VIEW_RESIZE:
00137 _redraw = true;
00138 break;
00139
00140 default:
00141 break;
00142 }
00143
00144 _redraw |= eq::Config::handleEvent( event );
00145 return _redraw;
00146 }
00147
00148 bool Config::_handleKeyEvent( const eq::KeyEvent& event )
00149 {
00150 switch( event.key )
00151 {
00152 case ' ':
00153
00154 return true;
00155
00156 case 's':
00157 case 'S':
00158 _frameData.toggleStatistics();
00159 return true;
00160
00161 default:
00162 return false;
00163 }
00164 }
00165
00166 bool Config::_readyToCommit()
00167 {
00168 return _frameData.isReady();
00169 }
00170
00171 void Config::_updateSimulation()
00172 {
00173 static int ctr = 0;
00174 static int demo = 0;
00175
00176 ctr++;
00177
00178 if(ctr > 200) {
00179 ctr = 0;
00180 switch(demo) {
00181 case 0:
00182 _frameData.updateParameters(NBODY_CONFIG_SHELL, 2.12f, 2.98f, 0.016f);
00183 demo++;
00184 break;
00185 case 1:
00186 _frameData.updateParameters(NBODY_CONFIG_EXPAND, 0.68f, 20.0f, 0.016f);
00187 demo++;
00188 break;
00189 case 2:
00190 _frameData.updateParameters(NBODY_CONFIG_RANDOM, 0.16f, 10.0f, 0.016f);
00191 demo=0;
00192 break;
00193 }
00194 }
00195 }
00196
00197 void Config::_registerData(const ConfigEvent* event)
00198 {
00199 _frameData.addProxyID(event->_proxyID, event->_range);
00200 }
00201
00202 void Config::_updateData(const ConfigEvent* event)
00203 {
00204 _frameData.updateProxyID(event->_proxyID, event->_version, event->_range);
00205 }
00206 }