Show
Ignore:
Timestamp:
08/29/05 14:05:17 (9 years ago)
Author:
robert
Message:

Added extra access methods on osgProducer::KeyboardMouseCallback?, and added
support for reading and writing keyboard/mouse events in osgcluster.

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • OpenSceneGraph/trunk/examples/osgcluster/osgcluster.cpp

    r3809 r4470  
    3434} 
    3535 
     36class PackedEvent 
     37{ 
     38    public: 
     39        PackedEvent(): 
     40            _eventType(osgProducer::EventAdapter::NONE), 
     41            _key(0), 
     42            _button(0), 
     43            _Xmin(0),_Xmax(0), 
     44            _Ymin(0),_Ymax(0), 
     45            _mx(0), 
     46            _my(0), 
     47            _buttonMask(0), 
     48            _modKeyMask(0), 
     49            _time(0.0) {} 
     50 
     51 
     52        void set(const osgProducer::EventAdapter& event) 
     53        { 
     54            _eventType = event._eventType; 
     55            _key = event._key; 
     56            _button = event._button; 
     57            _Xmin = event._Xmin; 
     58            _Xmax = event._Xmax; 
     59            _Ymin = event._Ymin; 
     60            _Ymax = event._Ymax; 
     61            _mx = event._mx; 
     62            _my = event._my; 
     63            _buttonMask = event._buttonMask; 
     64            _modKeyMask = event._modKeyMask; 
     65            _time = event._time; 
     66        } 
     67 
     68        void get(osgProducer::EventAdapter& event) 
     69        { 
     70            event._eventType = _eventType; 
     71            event._key = _key; 
     72            event._button = _button; 
     73            event._Xmin = _Xmin; 
     74            event._Xmax = _Xmax; 
     75            event._Ymin = _Ymin; 
     76            event._Ymax = _Ymax; 
     77            event._mx = _mx; 
     78            event._my = _my; 
     79            event._buttonMask = _buttonMask; 
     80            event._modKeyMask = _modKeyMask; 
     81            event._time = _time; 
     82        } 
     83         
     84        void swapBytes() 
     85        { 
     86        } 
     87 
     88    protected: 
     89     
     90        osgProducer::EventAdapter::EventType _eventType; 
     91        int _key; 
     92        int _button; 
     93        float _Xmin,_Xmax; 
     94        float _Ymin,_Ymax; 
     95        float _mx; 
     96        float _my; 
     97        unsigned int _buttonMask; 
     98        unsigned int _modKeyMask; 
     99        double _time; 
     100}; 
     101 
     102const unsigned int MAX_NUM_EVENTS = 10; 
     103 
    36104class CameraPacket { 
    37105    public: 
     106     
    38107     
    39108        CameraPacket():_masterKilled(false)  
     
    56125            matrix = _matrix * osg::Matrix::rotate(osg::DegreesToRadians(angle_offset),0.0f,1.0f,0.0f); 
    57126        } 
     127         
     128        void readEventQueue(osgProducer::Viewer& viewer); 
     129         
     130        void writeEventQueue(osgProducer::Viewer& viewer); 
    58131         
    59132        void checkByteOrder( void ) 
     
    67140 
    68141                    // umm.. we should byte swap _frameStamp too... 
     142                     
     143                     
     144                for(unsigned int ei=0; ei<_numEvents; ++ei) 
     145                { 
     146                    _events[ei].swapBytes(); 
     147                } 
    69148            } 
    70149        } 
     
    84163        osg::FrameStamp  _frameStamp; 
    85164         
     165        unsigned int _numEvents; 
     166        PackedEvent  _events[MAX_NUM_EVENTS];         
     167         
    86168}; 
     169 
     170void CameraPacket::readEventQueue(osgProducer::Viewer& viewer) 
     171{ 
     172    osgProducer::KeyboardMouseCallback::EventQueue queue; 
     173    viewer.getKeyboardMouseCallback()->copyEventQueue(queue); 
     174 
     175    _numEvents = 0; 
     176    for(osgProducer::KeyboardMouseCallback::EventQueue::iterator itr =queue.begin(); 
     177        itr != queue.end() && _numEvents<MAX_NUM_EVENTS; 
     178        ++itr, ++_numEvents) 
     179    { 
     180        osgProducer::EventAdapter* event = itr->get(); 
     181        _events[_numEvents].set(*event); 
     182    } 
     183    std::cout<<"written events = "<<_numEvents<<std::endl; 
     184} 
     185 
     186void CameraPacket::writeEventQueue(osgProducer::Viewer& viewer) 
     187{ 
     188    std::cout<<"recived events = "<<_numEvents<<std::endl; 
     189 
     190    // copy the packed events to osgProducer style events. 
     191    osgProducer::KeyboardMouseCallback::EventQueue queue; 
     192    for(unsigned int ei=0; ei<_numEvents; ++ei) 
     193    { 
     194        osgProducer::EventAdapter* event = new osgProducer::EventAdapter; 
     195        _events[ei].get(*event); 
     196        queue.push_back(event); 
     197    } 
     198     
     199    // pass them to the viewer. 
     200    viewer.getKeyboardMouseCallback()->appendEventQueue(queue); 
     201} 
     202 
     203 
    87204 
    88205enum ViewerMode 
     
    124241    while (arguments.read("-s")) viewerMode = SLAVE; 
    125242     
    126     float socketNumber=8100.0f; 
     243    int socketNumber=8100; 
    127244    while (arguments.read("-n",socketNumber)) ; 
    128245 
     
    188305 
    189306    bc.setPort(static_cast<short int>(socketNumber)); 
    190     rc.setPort(static_cast<short int>(socketNumber)); 
     307    rc.setPort(static_cast<short int>(socketNumber+1)); 
    191308 
    192309    bool masterKilled = false; 
     
    197314        viewer.sync(); 
    198315 
    199         // update the scene by traversing it with the the update visitor which will 
    200         // call all node update callbacks and animations. 
    201         viewer.update(); 
    202           
    203           
     316        osg::Timer_t startTick = osg::Timer::instance()->tick(); 
     317                  
    204318        // special handling for working as a cluster. 
    205319        switch (viewerMode) 
     
    212326                 
    213327                cp->setPacket(modelview,viewer.getFrameStamp()); 
     328                 
     329                cp->readEventQueue(viewer); 
    214330 
    215331                bc.setBuffer(cp, sizeof( CameraPacket )); 
    216332                 
    217333                bc.sync(); 
    218  
     334                 
    219335            } 
    220336            break; 
     
    228344                cp->checkByteOrder(); 
    229345 
    230                 osg::Matrix modelview; 
    231                 cp->getModelView(modelview,camera_offset); 
    232                  
    233                 viewer.setView(modelview); 
     346                cp->writeEventQueue(viewer); 
    234347 
    235348                if (cp->getMasterKilled())  
     
    246359        } 
    247360          
     361        osg::Timer_t endTick = osg::Timer::instance()->tick(); 
     362         
     363        osg::notify(osg::NOTICE)<<"Time to do sync "<<osg::Timer::instance()->delta_m(startTick,endTick)<<std::endl; 
     364 
     365        // update the scene by traversing it with the the update visitor which will 
     366        // call all node update callbacks and animations. 
     367        viewer.update(); 
     368 
     369        if (viewerMode==SLAVE) 
     370        { 
     371            osg::Matrix modelview; 
     372            cp->getModelView(modelview,camera_offset); 
     373         
     374            viewer.setView(modelview); 
     375        } 
     376 
    248377        // fire off the cull and draw traversals of the scene. 
    249378        if(!masterKilled)