examples/eqNBody/config.cpp

00001 /*
00002  * Copyright (c) 2009, Philippe Robert <probert@eyescale.ch> 
00003  *
00004  * This library is free software; you can redistribute it and/or modify it under
00005  * the terms of the GNU Lesser General Public License version 2.1 as published
00006  * by the Free Software Foundation.
00007  *  
00008  * This library is distributed in the hope that it will be useful, but WITHOUT
00009  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
00010  * FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License for more
00011  * details.
00012  * 
00013  * You should have received a copy of the GNU Lesser General Public License
00014  * along with this library; if not, write to the Free Software Foundation, Inc.,
00015  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
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         // init distributed objects
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         // init config
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 ); // data was retrieved, unmap immediately
00078         }
00079         else  // appNode, _initData is registered already
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         // Get current version...
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();        // broadcast changed data to all clients
00112                 }
00113                 break;
00114 
00115             case ConfigEvent::PROXY_CHANGED:
00116                 {
00117                     _updateData(static_cast< const ConfigEvent* >( event ));
00118                     if( _readyToCommit() ) {
00119                         _updateSimulation();    // update the simulation every nth frame
00120                         _frameData.commit();    // broadcast changed data to all clients
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                 //_frameData.reset();
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;     // frame counter
00174         static int demo = 0;    // demo config
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 }
Generated on Mon Aug 10 18:58:32 2009 for Equalizer 0.9 by  doxygen 1.5.8