Added extra access methods on osgProducer::KeyboardMouseCallback, and added

support for reading and writing keyboard/mouse events in osgcluster.
This commit is contained in:
Robert Osfield
2005-08-29 12:05:17 +00:00
parent b316dc30e8
commit ffb06a8c49
5 changed files with 200 additions and 21 deletions

View File

@@ -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() && _numEvents<MAX_NUM_EVENTS;
++itr, ++_numEvents)
{
osgProducer::EventAdapter* event = itr->get();
_events[_numEvents].set(*event);
}
std::cout<<"written events = "<<_numEvents<<std::endl;
}
void CameraPacket::writeEventQueue(osgProducer::Viewer& viewer)
{
std::cout<<"recived events = "<<_numEvents<<std::endl;
// copy the packed events to osgProducer style events.
osgProducer::KeyboardMouseCallback::EventQueue queue;
for(unsigned int ei=0; ei<_numEvents; ++ei)
{
osgProducer::EventAdapter* event = new osgProducer::EventAdapter;
_events[ei].get(*event);
queue.push_back(event);
}
// pass them to the viewer.
viewer.getKeyboardMouseCallback()->appendEventQueue(queue);
}
enum ViewerMode
{
STAND_ALONE,
@@ -123,7 +240,7 @@ int main( int argc, char **argv )
while (arguments.read("-m")) viewerMode = MASTER;
while (arguments.read("-s")) viewerMode = SLAVE;
float socketNumber=8100.0f;
int socketNumber=8100;
while (arguments.read("-n",socketNumber)) ;
float camera_fov=-1.0f;
@@ -187,7 +304,7 @@ int main( int argc, char **argv )
Receiver rc;
bc.setPort(static_cast<short int>(socketNumber));
rc.setPort(static_cast<short int>(socketNumber));
rc.setPort(static_cast<short int>(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 "<<osg::Timer::instance()->delta_m(startTick,endTick)<<std::endl;
// update the scene by traversing it with the the update visitor which will
// call all node update callbacks and animations.
viewer.update();
if (viewerMode==SLAVE)
{
osg::Matrix modelview;
cp->getModelView(modelview,camera_offset);
viewer.setView(modelview);
}
// fire off the cull and draw traversals of the scene.
if(!masterKilled)
viewer.frame();

View File

@@ -17,6 +17,8 @@
#include "receiver.h"
#include <iostream>
Receiver::Receiver( void )
{
_port = 0;
@@ -132,14 +134,21 @@ void Receiver::sync( void )
}
}
#else
std::cout<<"A"<<std::endl;
recvfrom( _so, (caddr_t)_buffer, _buffer_size, 0, 0, &size );
std::cout<<" B"<<std::endl;
while( select( _so+1, &fdset, 0L, 0L, &tv ) )
{
std::cout<<" C"<<std::endl;
if( FD_ISSET( _so, &fdset ) )
{
std::cout<<" D"<<std::endl;
recvfrom( _so, (caddr_t)_buffer, _buffer_size, 0, 0, &size );
}
}
std::cout<<" E"<<std::endl;
#endif
}

View File

@@ -104,8 +104,7 @@ class OSGPRODUCER_EXPORT EventAdapter : public osgGA::GUIEventAdapter
void copyStaticVariables();
protected:
public:
EventType _eventType;
int _key;

View File

@@ -71,16 +71,19 @@ class OSGPRODUCER_EXPORT KeyboardMouseCallback : public Producer::KeyboardMouseC
typedef std::vector< osg::ref_ptr<EventAdapter> > 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;
};

View File

@@ -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;