diff --git a/examples/osgcluster/osgcluster.cpp b/examples/osgcluster/osgcluster.cpp index cb0e6b42a..771376f90 100644 --- a/examples/osgcluster/osgcluster.cpp +++ b/examples/osgcluster/osgcluster.cpp @@ -33,9 +33,78 @@ inline void swapBytes( T &s ) *(sptr++) = *(dptr--); } +class PackedEvent +{ + public: + PackedEvent(): + _eventType(osgProducer::EventAdapter::NONE), + _key(0), + _button(0), + _Xmin(0),_Xmax(0), + _Ymin(0),_Ymax(0), + _mx(0), + _my(0), + _buttonMask(0), + _modKeyMask(0), + _time(0.0) {} + + + void set(const osgProducer::EventAdapter& event) + { + _eventType = event._eventType; + _key = event._key; + _button = event._button; + _Xmin = event._Xmin; + _Xmax = event._Xmax; + _Ymin = event._Ymin; + _Ymax = event._Ymax; + _mx = event._mx; + _my = event._my; + _buttonMask = event._buttonMask; + _modKeyMask = event._modKeyMask; + _time = event._time; + } + + void get(osgProducer::EventAdapter& event) + { + event._eventType = _eventType; + event._key = _key; + event._button = _button; + event._Xmin = _Xmin; + event._Xmax = _Xmax; + event._Ymin = _Ymin; + event._Ymax = _Ymax; + event._mx = _mx; + event._my = _my; + event._buttonMask = _buttonMask; + event._modKeyMask = _modKeyMask; + event._time = _time; + } + + void swapBytes() + { + } + + protected: + + osgProducer::EventAdapter::EventType _eventType; + int _key; + int _button; + float _Xmin,_Xmax; + float _Ymin,_Ymax; + float _mx; + float _my; + unsigned int _buttonMask; + unsigned int _modKeyMask; + double _time; +}; + +const unsigned int MAX_NUM_EVENTS = 10; + class CameraPacket { public: + CameraPacket():_masterKilled(false) { _byte_order = 0x12345678; @@ -56,6 +125,10 @@ class CameraPacket { matrix = _matrix * osg::Matrix::rotate(osg::DegreesToRadians(angle_offset),0.0f,1.0f,0.0f); } + void readEventQueue(osgProducer::Viewer& viewer); + + void writeEventQueue(osgProducer::Viewer& viewer); + void checkByteOrder( void ) { if( _byte_order == 0x78563412 ) // We're backwards @@ -66,6 +139,12 @@ class CameraPacket { swapBytes( _matrix.ptr()[i] ); // umm.. we should byte swap _frameStamp too... + + + for(unsigned int ei=0; ei<_numEvents; ++ei) + { + _events[ei].swapBytes(); + } } } @@ -83,8 +162,46 @@ class CameraPacket { // us to do this, even though its a reference counted object. osg::FrameStamp _frameStamp; + unsigned int _numEvents; + PackedEvent _events[MAX_NUM_EVENTS]; + }; +void CameraPacket::readEventQueue(osgProducer::Viewer& viewer) +{ + osgProducer::KeyboardMouseCallback::EventQueue queue; + viewer.getKeyboardMouseCallback()->copyEventQueue(queue); + + _numEvents = 0; + for(osgProducer::KeyboardMouseCallback::EventQueue::iterator itr =queue.begin(); + itr != queue.end() && _numEventsget(); + _events[_numEvents].set(*event); + } + std::cout<<"written events = "<<_numEvents<(socketNumber)); - rc.setPort(static_cast(socketNumber)); + rc.setPort(static_cast(socketNumber+1)); bool masterKilled = false; @@ -196,11 +313,8 @@ int main( int argc, char **argv ) // wait for all cull and draw threads to complete. viewer.sync(); - // update the scene by traversing it with the the update visitor which will - // call all node update callbacks and animations. - viewer.update(); - - + osg::Timer_t startTick = osg::Timer::instance()->tick(); + // special handling for working as a cluster. switch (viewerMode) { @@ -211,11 +325,13 @@ int main( int argc, char **argv ) osg::Matrix modelview(viewer.getCameraConfig()->getCamera(0)->getViewMatrix()); cp->setPacket(modelview,viewer.getFrameStamp()); + + cp->readEventQueue(viewer); bc.setBuffer(cp, sizeof( CameraPacket )); bc.sync(); - + } break; case(SLAVE): @@ -227,10 +343,7 @@ int main( int argc, char **argv ) cp->checkByteOrder(); - osg::Matrix modelview; - cp->getModelView(modelview,camera_offset); - - viewer.setView(modelview); + cp->writeEventQueue(viewer); if (cp->getMasterKilled()) { @@ -245,6 +358,22 @@ int main( int argc, char **argv ) break; } + osg::Timer_t endTick = osg::Timer::instance()->tick(); + + osg::notify(osg::NOTICE)<<"Time to do sync "<delta_m(startTick,endTick)<getModelView(modelview,camera_offset); + + viewer.setView(modelview); + } + // fire off the cull and draw traversals of the scene. if(!masterKilled) viewer.frame(); diff --git a/examples/osgcluster/receiver.cpp b/examples/osgcluster/receiver.cpp index 11958df5a..368f9ce3f 100644 --- a/examples/osgcluster/receiver.cpp +++ b/examples/osgcluster/receiver.cpp @@ -17,6 +17,8 @@ #include "receiver.h" +#include + Receiver::Receiver( void ) { _port = 0; @@ -132,14 +134,21 @@ void Receiver::sync( void ) } } #else + std::cout<<"A"< > EventQueue; double getEventQueue(EventQueue& queue); + double copyEventQueue(EventQueue& queue) const; + double setEventQueue(EventQueue& queue); + double appendEventQueue(EventQueue& queue); - bool done() { return _done; } - float mx() { return _mx; } - float my() { return _my; } - unsigned int mbutton() { return _mbutton; } + bool done() const { return _done; } + float mx() const { return _mx; } + float my() const { return _my; } + unsigned int mbutton() const { return _mbutton; } void setStartTick(osg::Timer_t tick) { _startTick = tick; } - osg::Timer_t getStartTick() { return _startTick; } + osg::Timer_t getStartTick() const { return _startTick; } - double getTime() { return _timer.delta_s(_startTick,_timer.tick()); } + double getTime() const { return _timer.delta_s(_startTick,_timer.tick()); } Producer::KeyboardMouse* getKeyboardMouse() { return _keyboardMouse; } const Producer::KeyboardMouse* getKeyboardMouse() const { return _keyboardMouse; } @@ -98,7 +101,7 @@ class OSGPRODUCER_EXPORT KeyboardMouseCallback : public Producer::KeyboardMouseC osg::Timer_t _startTick; osg::Timer _timer; - OpenThreads::Mutex _eventQueueMutex; + mutable OpenThreads::Mutex _eventQueueMutex; EventQueue _eventQueue; }; diff --git a/src/osgProducer/KeyboardMouseCallback.cpp b/src/osgProducer/KeyboardMouseCallback.cpp index 913f0abc0..abdeaf14b 100644 --- a/src/osgProducer/KeyboardMouseCallback.cpp +++ b/src/osgProducer/KeyboardMouseCallback.cpp @@ -173,6 +173,45 @@ double KeyboardMouseCallback::getEventQueue(EventQueue& queue) return swapTime; } +double KeyboardMouseCallback::copyEventQueue(EventQueue& queue) const +{ + double swapTime; + + queue.clear(); + _eventQueueMutex.lock(); + queue = _eventQueue; + swapTime = getTime(); + _eventQueueMutex.unlock(); + + return swapTime; +} + +double KeyboardMouseCallback::setEventQueue(EventQueue& queue) +{ + double swapTime; + + queue.clear(); + _eventQueueMutex.lock(); + _eventQueue = queue; + swapTime = getTime(); + _eventQueueMutex.unlock(); + + return swapTime; +} + +double KeyboardMouseCallback::appendEventQueue(EventQueue& queue) +{ + double swapTime; + + queue.clear(); + _eventQueueMutex.lock(); + _eventQueue.insert(_eventQueue.end(),queue.begin(),queue.end()); + swapTime = getTime(); + _eventQueueMutex.unlock(); + + return swapTime; +} + EventAdapter* KeyboardMouseCallback::createEventAdapter() { EventAdapter* ea = new EventAdapter;