Equalizer  1.4.1
eVolve/config.cpp
00001 
00002 /* Copyright (c) 2006-2011, Stefan Eilemann <eile@equalizergraphics.com> 
00003  *               2007-2011, Maxim Makhinya  <maxmah@gmail.com>
00004  *
00005  * Redistribution and use in source and binary forms, with or without
00006  * modification, are permitted provided that the following conditions are met:
00007  *
00008  * - Redistributions of source code must retain the above copyright notice, this
00009  *   list of conditions and the following disclaimer.
00010  * - Redistributions in binary form must reproduce the above copyright notice,
00011  *   this list of conditions and the following disclaimer in the documentation
00012  *   and/or other materials provided with the distribution.
00013  * - Neither the name of Eyescale Software GmbH nor the names of its
00014  *   contributors may be used to endorse or promote products derived from this
00015  *   software without specific prior written permission.
00016  *
00017  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
00018  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
00019  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
00020  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
00021  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
00022  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
00023  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
00024  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
00025  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
00026  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
00027  * POSSIBILITY OF SUCH DAMAGE.
00028  */
00029 
00030 #include "config.h"
00031 
00032 
00033 namespace eVolve
00034 {
00035 
00036 Config::Config( eq::ServerPtr parent )
00037         : eq::Config( parent )
00038         , _spinX( 5 )
00039         , _spinY( 5 )
00040         , _currentCanvas( 0 )
00041         , _messageTime( 0 ){}
00042 
00043 Config::~Config(){}
00044 
00045 bool Config::init()
00046 {
00047     // init distributed objects
00048     LBCHECK( registerObject( &_frameData ));
00049 
00050     _frameData.setOrtho( _initData.getOrtho( ));
00051     _initData.setFrameDataID( _frameData.getID( ));
00052 
00053     _frameData.setAutoObsolete( getLatency( ));
00054 
00055     LBCHECK( registerObject( &_initData ));
00056 
00057     // init config
00058     if( !eq::Config::init( _initData.getID( )))
00059     {
00060         _deregisterData();
00061         return false;
00062     }
00063 
00064     const eq::Canvases& canvases = getCanvases();
00065     if( canvases.empty( ))
00066         _currentCanvas = 0;
00067     else
00068         _currentCanvas = canvases.front();
00069 
00070     _setMessage( "Welcome to eVolve\nPress F1 for help" );
00071 
00072     return true;
00073 }
00074 
00075 bool Config::mapData( const eq::uint128_t& initDataID )
00076 {
00077     if( !_initData.isAttached() )
00078     {
00079         if( !mapObject( &_initData, initDataID ))
00080             return false;
00081         unmapObject( &_initData ); // data was retrieved, unmap immediately
00082     }
00083     else  // appNode, _initData is registered already
00084     {
00085         LBASSERT( _initData.getID() == initDataID );
00086     }
00087     return true;
00088 }
00089 
00090 bool Config::exit()
00091 {
00092     const bool ret = eq::Config::exit();
00093     _deregisterData();
00094 
00095     return ret;
00096 }
00097 
00098 void Config::_deregisterData()
00099 {
00100     deregisterObject( &_initData );
00101     deregisterObject( &_frameData );
00102 
00103     _initData.setFrameDataID( lunchbox::UUID::ZERO );
00104 }
00105 
00106 
00107 uint32_t Config::startFrame()
00108 {
00109     // update database
00110     _frameData.spinCamera( -0.001f * _spinX, -0.001f * _spinY );
00111     const lunchbox::uint128_t& version = _frameData.commit();
00112 
00113     _resetMessage();
00114 
00115     return eq::Config::startFrame( version );
00116 }
00117 
00118 void Config::_resetMessage()
00119 {
00120     // reset message after two seconds
00121     if( _messageTime > 0 && getTime() - _messageTime > 2000 )
00122     {
00123         _messageTime = 0;
00124         _frameData.setMessage( "" );
00125     }
00126 }
00127 
00128 bool Config::handleEvent( const eq::ConfigEvent* event )
00129 {
00130     switch( event->data.type )
00131     {
00132         case eq::Event::KEY_PRESS:
00133             if( _handleKeyEvent( event->data.keyPress ))
00134                 return true;
00135             break;
00136 
00137         case eq::Event::CHANNEL_POINTER_BUTTON_PRESS:
00138         {
00139             const lunchbox::UUID& viewID = event->data.context.view.identifier;
00140             _frameData.setCurrentViewID( viewID );
00141             if( viewID == lunchbox::UUID::ZERO )
00142             {
00143                 _currentCanvas = 0;
00144                 return true;
00145             }
00146             
00147             const eq::View* view = find< eq::View >( viewID );
00148             const eq::Layout* layout = view->getLayout();
00149             const eq::Canvases& canvases = getCanvases();
00150             for( eq::Canvases::const_iterator i = canvases.begin();
00151                  i != canvases.end(); ++i )
00152             {
00153                 eq::Canvas* canvas = *i;
00154                 const eq::Layout* canvasLayout = canvas->getActiveLayout();
00155 
00156                 if( canvasLayout == layout )
00157                 {
00158                     _currentCanvas = canvas;
00159                     return true;
00160                 }
00161             }
00162             return true;
00163         }
00164 
00165         case eq::Event::CHANNEL_POINTER_BUTTON_RELEASE:
00166             if( event->data.pointerButtonRelease.buttons == eq::PTR_BUTTON_NONE
00167                 && event->data.pointerButtonRelease.button  == eq::PTR_BUTTON1 )
00168             {
00169                 _spinY = event->data.pointerButtonRelease.dx;
00170                 _spinX = event->data.pointerButtonRelease.dy;
00171             }
00172             return true;
00173 
00174         case eq::Event::CHANNEL_POINTER_MOTION:
00175             if( event->data.pointerMotion.buttons == eq::PTR_BUTTON1 )
00176             {
00177                 _spinX = 0;
00178                 _spinY = 0;
00179 
00180                 _frameData.spinCamera(  -0.005f * event->data.pointerMotion.dy,
00181                                         -0.005f * event->data.pointerMotion.dx);
00182                 return true;
00183             }
00184             if( event->data.pointerMotion.buttons == eq::PTR_BUTTON2 ||
00185                 event->data.pointerMotion.buttons == ( eq::PTR_BUTTON1 |
00186                                                        eq::PTR_BUTTON3 ))
00187             {
00188                 _frameData.moveCamera( .0, .0,
00189                                         .005f*event->data.pointerMotion.dy );
00190                 return true;
00191             }
00192             if( event->data.pointerMotion.buttons == eq::PTR_BUTTON3 )
00193             {
00194                 _frameData.moveCamera( .0005f * event->data.pointerMotion.dx,
00195                                       -.0005f * event->data.pointerMotion.dy, 
00196                                        .0f );
00197                 return true;
00198             }
00199             break;
00200 
00201         default:
00202             break;
00203     }
00204     return eq::Config::handleEvent( event );
00205 }
00206 
00207 bool Config::_handleKeyEvent( const eq::KeyEvent& event )
00208 {
00209     switch( event.key )
00210     {
00211         case 'b':
00212         case 'B':
00213             _frameData.toggleBackground();
00214             return true;
00215 
00216         case 'd':
00217         case 'D':
00218             _frameData.toggleColorMode();
00219             return true;
00220 
00221         case eq::KC_F1:
00222         case 'h':
00223         case 'H':
00224             _frameData.toggleHelp();
00225             return true;
00226 
00227         case 'r':
00228         case 'R':
00229         case ' ':
00230             _spinX = 0;
00231             _spinY = 0;
00232             _frameData.reset();
00233             return true;
00234 
00235         case 'n':
00236         case 'N':
00237             _frameData.toggleNormalsQuality();
00238             return true;
00239 
00240         case 'o':
00241         case 'O':
00242             _frameData.toggleOrtho();
00243             return true;
00244 
00245         case 's':
00246         case 'S':
00247         _frameData.toggleStatistics();
00248             return true;
00249 
00250         case 'l':
00251             _switchLayout( 1 );
00252             return true;
00253         case 'L':
00254             _switchLayout( -1 );
00255             return true;
00256 
00257         case 'q':
00258             _frameData.adjustQuality( -.1f );
00259             return true;
00260 
00261         case 'Q':
00262             _frameData.adjustQuality( .1f );
00263             return true;
00264 
00265         case 'c':
00266         case 'C':
00267         {
00268             const eq::Canvases& canvases = getCanvases();
00269             if( canvases.empty( ))
00270                 return true;
00271 
00272             _frameData.setCurrentViewID( lunchbox::UUID::ZERO );
00273 
00274             if( !_currentCanvas )
00275             {
00276                 _currentCanvas = canvases.front();
00277                 return true;
00278             }
00279 
00280             eq::Canvases::const_iterator i = std::find( canvases.begin(),
00281                                                         canvases.end(),
00282                                                         _currentCanvas );
00283             LBASSERT( i != canvases.end( ));
00284 
00285             ++i;
00286             if( i == canvases.end( ))
00287                 _currentCanvas = canvases.front();
00288             else
00289                 _currentCanvas = *i;
00290             return true;
00291         }
00292 
00293         case 'v':
00294         case 'V':
00295         {
00296             const eq::Canvases& canvases = getCanvases();
00297             if( !_currentCanvas && !canvases.empty( ))
00298                 _currentCanvas = canvases.front();
00299 
00300             if( !_currentCanvas )
00301                 return true;
00302 
00303             const eq::Layout* layout = _currentCanvas->getActiveLayout();
00304             if( !layout )
00305                 return true;
00306 
00307             const eq::View* current = 
00308                               find< eq::View >( _frameData.getCurrentViewID( ));
00309 
00310             const eq::Views& views = layout->getViews();
00311             LBASSERT( !views.empty( ))
00312 
00313             if( !current )
00314             {
00315                 _frameData.setCurrentViewID( views.front()->getID( ));
00316                 return true;
00317             }
00318 
00319             eq::Views::const_iterator i = std::find( views.begin(),
00320                                                           views.end(),
00321                                                           current );
00322             LBASSERT( i != views.end( ));
00323 
00324             ++i;
00325             if( i == views.end( ))
00326                 _frameData.setCurrentViewID( lunchbox::UUID::ZERO );
00327             else
00328                 _frameData.setCurrentViewID( (*i)->getID( ));
00329             return true;
00330         }
00331 
00332         default:
00333             break;
00334     }
00335     return false;
00336 }
00337 
00338 void Config::_setMessage( const std::string& message )
00339 {
00340     _frameData.setMessage( message );
00341     _messageTime = getTime();
00342 }
00343 
00344 void Config::_switchLayout( int32_t increment )
00345 {
00346     if( !_currentCanvas )
00347         return;
00348 
00349     _frameData.setCurrentViewID( lunchbox::UUID::ZERO );
00350 
00351     size_t index = _currentCanvas->getActiveLayoutIndex() + increment;
00352     const eq::Layouts& layouts = _currentCanvas->getLayouts();
00353     LBASSERT( !layouts.empty( ));
00354 
00355     index = ( index % layouts.size( ));
00356     _currentCanvas->useLayout( uint32_t( index ));
00357 
00358     const eq::Layout* layout = _currentCanvas->getActiveLayout();
00359     std::ostringstream stream;
00360     stream << "Layout ";
00361     if( layout )
00362     {
00363         const std::string& name = layout->getName();
00364         if( name.empty( ))
00365             stream << index;
00366         else
00367             stream << name;
00368     }
00369     else
00370         stream << "NONE";
00371 
00372     stream << " active";
00373     _setMessage( stream.str( ));
00374 }
00375 
00376 }
Generated on Mon Nov 26 2012 14:41:48 for Equalizer 1.4.1 by  doxygen 1.7.6.1