Added extra access methods on osgProducer::KeyboardMouseCallback, and added
support for reading and writing keyboard/mouse events in osgcluster.
This commit is contained in:
@@ -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();
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
|
||||
@@ -104,8 +104,7 @@ class OSGPRODUCER_EXPORT EventAdapter : public osgGA::GUIEventAdapter
|
||||
|
||||
void copyStaticVariables();
|
||||
|
||||
protected:
|
||||
|
||||
public:
|
||||
|
||||
EventType _eventType;
|
||||
int _key;
|
||||
|
||||
@@ -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;
|
||||
|
||||
};
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user