在osg3.4下,使用自定义事件userEvent接口,添加事件时间参数使用默认值,程序运行正常,但移植到3.0版本,发现事件相应延迟好几帧,甚至一直不能触发,最后阅读源码发现,3.0和3.4中takeEvents算法修改比较大,导致参数错误而事件无法正常执行。
userEvent的时间默认值为获取当前时间。但3.0版本中,获取当前时间会导致时间无法及时执行,执行将时间参数设置为0,即可解决问题。
3.4中定义:
/** Method for adapting user defined events */
GUIEventAdapter* userEvent(osg::Referenced* userEventData) { return userEvent(userEventData, getTime()); }
/** Method for adapting user defined events with specified event time */
GUIEventAdapter* userEvent(osg::Referenced* userEventData, double time);
GUIEventAdapter* EventQueue::userEvent(osg::Referenced* userEventData, double time)
{
GUIEventAdapter* event = new GUIEventAdapter(*_accumulateEventState);
event->setEventType(GUIEventAdapter::USER);
event->setUserData(userEventData);
event->setTime(time);
addEvent(event);
return event;
}
bool EventQueue::takeEvents(Events& events, double cutOffTime)
{
OpenThreads::ScopedLock<OpenThreads::Mutex> lock(_eventQueueMutex);
if (!_eventQueue.empty())
{
// find last event if queue that came in before the cuttof.
Events::reverse_iterator ritr = _eventQueue.rbegin();
for(; ritr != _eventQueue.rend() && ((*ritr)->getTime() > cutOffTime); ++ritr) {}
if (ritr==_eventQueue.rend()) return false;
for(Events::iterator itr = _eventQueue.begin();
itr != ritr.base();
++itr)
{
events.push_back(*itr);
}
// make sure that the events are in ascending time order, and any out of out events
// have their time reset to the next valid time after them in the events list.
double previousTime = cutOffTime;
for(Events::reverse_iterator itr = events.rbegin();
itr != events.rend();
++itr)
{
if ((*itr)->getTime() > previousTime)
{
OSG_INFO<<"Reset event time from "<<(*itr)->getTime()<<" to "<<previousTime<<std::endl;
(*itr)->setTime(previousTime);
}
else
{
previousTime = (*itr)->getTime();
}
}
// remove the events we are taking from the original event queue.
_eventQueue.erase(_eventQueue.begin(), ritr.base());
return true;
}
else
{
return false;
}
}