Moved rendering support into GraphisContext, osgViewer::Viewer/View, and
added frame stamp updating and update traversal to osgViewer::Scene/Viewer. Updated osgcamera example to use new Viewer API calls instead of using local rendering calls.
This commit is contained in:
@@ -232,7 +232,6 @@ void GraphicsWindowX11::init()
|
||||
XWindowAttributes watt;
|
||||
XGetWindowAttributes( _display, _parent, &watt );
|
||||
// unsigned int parentWindowHeight = watt.height;
|
||||
osg::notify(osg::NOTICE)<<"First watt.x = "<<watt.x<<" watt.y="<<watt.y<<std::endl;
|
||||
|
||||
XSetWindowAttributes swatt;
|
||||
swatt.colormap = XCreateColormap( _display, _parent, _visualInfo->visual, AllocNone);
|
||||
@@ -386,32 +385,29 @@ void GraphicsWindowX11::checkEvents()
|
||||
switch( ev.type )
|
||||
{
|
||||
case Expose :
|
||||
osg::notify(osg::NOTICE)<<"Expose x="<<ev.xexpose.x<<" y="<<ev.xexpose.y<<" width="<<ev.xexpose.width<<", height="<<ev.xexpose.height<<std::endl;
|
||||
osg::notify(osg::INFO)<<"Expose x="<<ev.xexpose.x<<" y="<<ev.xexpose.y<<" width="<<ev.xexpose.width<<", height="<<ev.xexpose.height<<std::endl;
|
||||
break;
|
||||
|
||||
case GravityNotify :
|
||||
osg::notify(osg::NOTICE)<<"GravityNotify"<<std::endl;
|
||||
osg::notify(osg::INFO)<<"GravityNotify"<<std::endl;
|
||||
break;
|
||||
|
||||
case UnmapNotify :
|
||||
osg::notify(osg::NOTICE)<<"UnmapNotify"<<std::endl;
|
||||
osg::notify(osg::INFO)<<"UnmapNotify"<<std::endl;
|
||||
break;
|
||||
|
||||
case ReparentNotify:
|
||||
osg::notify(osg::NOTICE)<<"ReparentNotify"<<std::endl;
|
||||
osg::notify(osg::INFO)<<"ReparentNotify"<<std::endl;
|
||||
break;
|
||||
|
||||
case DestroyNotify :
|
||||
osg::notify(osg::NOTICE)<<"DestroyNotify"<<std::endl;
|
||||
osg::notify(osg::INFO)<<"DestroyNotify"<<std::endl;
|
||||
_realized = false;
|
||||
break;
|
||||
|
||||
case ConfigureNotify :
|
||||
{
|
||||
osg::notify(osg::NOTICE)<<"ConfigureNotify x="<<ev.xconfigure.x<<" y="<<ev.xconfigure.y<<" width="<<ev.xconfigure.width<<", height="<<ev.xconfigure.height<<std::endl;
|
||||
XWindowAttributes watt;
|
||||
XGetWindowAttributes( _display, _window, &watt );
|
||||
osg::notify(osg::NOTICE)<<"After sync apply.x = "<<watt.x<<" watt.y="<<watt.y<<" width="<<watt.width<<" height="<<watt.height<<std::endl;
|
||||
osg::notify(osg::INFO)<<"ConfigureNotify x="<<ev.xconfigure.x<<" y="<<ev.xconfigure.y<<" width="<<ev.xconfigure.width<<", height="<<ev.xconfigure.height<<std::endl;
|
||||
|
||||
_traits->_x = ev.xconfigure.x;
|
||||
_traits->_y = ev.xconfigure.y;
|
||||
@@ -476,7 +472,7 @@ void GraphicsWindowX11::checkEvents()
|
||||
|
||||
int dest_x_return, dest_y_return;
|
||||
Window child_return;
|
||||
Bool result = XTranslateCoordinates(_display, _window, _parent, 0, 0, &dest_x_return, &dest_y_return, &child_return);
|
||||
XTranslateCoordinates(_display, _window, _parent, 0, 0, &dest_x_return, &dest_y_return, &child_return);
|
||||
|
||||
wx += (screenOrigin_x - dest_x_return);
|
||||
wy += (screenOrigin_y - dest_y_return);
|
||||
|
||||
@@ -24,6 +24,7 @@ Scene::Scene():
|
||||
_frameStamp->setReferenceTime(0);
|
||||
|
||||
_updateVisitor = new osgUtil::UpdateVisitor;
|
||||
_updateVisitor->setFrameStamp(_frameStamp.get());
|
||||
|
||||
_eventQueue = new osgGA::EventQueue;
|
||||
_eventQueue->setStartTick(_startTick);
|
||||
@@ -111,6 +112,10 @@ void Scene::frameEventTraversal()
|
||||
|
||||
void Scene::frameUpdateTraversal()
|
||||
{
|
||||
if (!getSceneData()) return;
|
||||
|
||||
getSceneData()->accept(*_updateVisitor);
|
||||
|
||||
if (_databasePager.valid())
|
||||
{
|
||||
// tell the DatabasePager the frame number of that the scene graph is being actively used to render a frame
|
||||
@@ -121,3 +126,6 @@ void Scene::frameUpdateTraversal()
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -99,7 +99,7 @@ void View::setUpViewAcrossAllScreens()
|
||||
osgViewer::GraphicsWindow* gw = dynamic_cast<osgViewer::GraphicsWindow*>(gc.get());
|
||||
if (gw)
|
||||
{
|
||||
osg::notify(osg::NOTICE)<<" GraphicsWindow has been created successfully."<<std::endl;
|
||||
osg::notify(osg::INFO)<<" GraphicsWindow has been created successfully."<<std::endl;
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -140,7 +140,7 @@ void View::setUpViewAcrossAllScreens()
|
||||
osgViewer::GraphicsWindow* gw = dynamic_cast<osgViewer::GraphicsWindow*>(gc.get());
|
||||
if (gw)
|
||||
{
|
||||
osg::notify(osg::NOTICE)<<" GraphicsWindow has been created successfully."<<gw<<std::endl;
|
||||
osg::notify(osg::INFO)<<" GraphicsWindow has been created successfully."<<gw<<std::endl;
|
||||
|
||||
gw->getEventQueue()->setUseFixedMouseInputRange(true);
|
||||
gw->getEventQueue()->getCurrentEventState()->setInputRange(inputRangeMinX, inputRangeMinY, inputRangeMinX+float(width),inputRangeMinY+float(height) );
|
||||
@@ -167,14 +167,37 @@ void View::setUpViewAcrossAllScreens()
|
||||
assignSceneDataToCameras();
|
||||
}
|
||||
|
||||
// Draw operation, that does a draw on the scene graph.
|
||||
struct RenderingOperation : public osg::GraphicsContext::Operation
|
||||
{
|
||||
RenderingOperation(osgViewer::View* view, osg::Camera* camera, osg::FrameStamp* frameStamp):
|
||||
osg::GraphicsContext::Operation("Render",true)
|
||||
{
|
||||
_sceneView = new osgUtil::SceneView;
|
||||
_sceneView->setDefaults();
|
||||
_sceneView->setCamera(camera);
|
||||
_sceneView->setState(camera->getGraphicsContext()->getState());
|
||||
_sceneView->setSceneData(view->getSceneData());
|
||||
_sceneView->setFrameStamp(frameStamp);
|
||||
|
||||
}
|
||||
|
||||
virtual void operator () (osg::GraphicsContext*)
|
||||
{
|
||||
_sceneView->cull();
|
||||
_sceneView->draw();
|
||||
}
|
||||
|
||||
osg::ref_ptr<osgUtil::SceneView> _sceneView;
|
||||
};
|
||||
|
||||
void View::setUpRenderingSupport()
|
||||
{
|
||||
osg::FrameStamp* frameStamp = _scene->getFrameStamp();
|
||||
|
||||
if (_camera.valid() && _camera->getGraphicsContext())
|
||||
{
|
||||
osg::ref_ptr<osgUtil::SceneView> sceneView = new osgUtil::SceneView;
|
||||
sceneView->setState(_camera->getGraphicsContext()->getState());
|
||||
sceneView->setCamera(_camera.get());
|
||||
_camera->setRenderingCache(0, sceneView.get());
|
||||
_camera->getGraphicsContext()->add(new RenderingOperation(this, _camera.get(), frameStamp));
|
||||
}
|
||||
|
||||
for(unsigned i=0; i<getNumSlaves(); ++i)
|
||||
@@ -182,11 +205,7 @@ void View::setUpRenderingSupport()
|
||||
Slave& slave = getSlave(i);
|
||||
if (slave._camera.valid() && slave._camera->getGraphicsContext())
|
||||
{
|
||||
osg::ref_ptr<osgUtil::SceneView> sceneView = new osgUtil::SceneView;
|
||||
sceneView->setDefaults();
|
||||
sceneView->setState(slave._camera->getGraphicsContext()->getState());
|
||||
sceneView->setCamera(slave._camera.get());
|
||||
slave._camera->setRenderingCache(0, sceneView.get());
|
||||
slave._camera->getGraphicsContext()->add(new RenderingOperation(this, slave._camera.get(), frameStamp));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -30,7 +30,8 @@ public:
|
||||
};
|
||||
|
||||
Viewer::Viewer():
|
||||
_firstFrame(true)
|
||||
_firstFrame(true),
|
||||
_done(false)
|
||||
{
|
||||
}
|
||||
|
||||
@@ -40,7 +41,7 @@ Viewer::~Viewer()
|
||||
|
||||
void Viewer::init()
|
||||
{
|
||||
osg::notify(osg::NOTICE)<<"Viewer::init()"<<std::endl;
|
||||
osg::notify(osg::INFO)<<"Viewer::init()"<<std::endl;
|
||||
|
||||
osg::ref_ptr<osgGA::GUIEventAdapter> initEvent = _eventQueue->createEvent();
|
||||
initEvent->setEventType(osgGA::GUIEventAdapter::FRAME);
|
||||
@@ -54,7 +55,7 @@ void Viewer::init()
|
||||
|
||||
void Viewer::realize()
|
||||
{
|
||||
osg::notify(osg::NOTICE)<<"Viewer::realize()"<<std::endl;
|
||||
osg::notify(osg::INFO)<<"Viewer::realize()"<<std::endl;
|
||||
|
||||
if (_camera.valid() && _camera->getGraphicsContext())
|
||||
{
|
||||
@@ -66,7 +67,7 @@ void Viewer::realize()
|
||||
Slave& slave = getSlave(i);
|
||||
if (slave._camera.valid() && slave._camera->getGraphicsContext())
|
||||
{
|
||||
osg::notify(osg::NOTICE)<<" slave realize()"<<std::endl;
|
||||
osg::notify(osg::INFO)<<" slave realize()"<<std::endl;
|
||||
slave._camera->getGraphicsContext()->realize();
|
||||
}
|
||||
}
|
||||
@@ -85,7 +86,7 @@ void Viewer::realize()
|
||||
Slave& slave = getSlave(i);
|
||||
if (slave._camera.valid() && slave._camera->getGraphicsContext())
|
||||
{
|
||||
osg::notify(osg::NOTICE)<<" slave realize()"<<std::endl;
|
||||
osg::notify(osg::INFO)<<" slave realize()"<<std::endl;
|
||||
slave._camera->getGraphicsContext()->realize();
|
||||
osgViewer::GraphicsWindow* gw = dynamic_cast<osgViewer::GraphicsWindow*>(slave._camera->getGraphicsContext());
|
||||
gw->grabFocusIfPointerInWindow();
|
||||
@@ -98,20 +99,24 @@ void Viewer::realize()
|
||||
|
||||
void Viewer::frame()
|
||||
{
|
||||
if (_done) return;
|
||||
|
||||
if (_firstFrame)
|
||||
{
|
||||
init();
|
||||
_firstFrame = false;
|
||||
}
|
||||
frameAdvance();
|
||||
|
||||
frameEventTraversal();
|
||||
frameUpdateTraversal();
|
||||
frameCullTraversal();
|
||||
frameDrawTraversal();
|
||||
frameRenderingTraversals();
|
||||
}
|
||||
|
||||
void Viewer::frameAdvance()
|
||||
{
|
||||
if (_done) return;
|
||||
|
||||
// osg::notify(osg::NOTICE)<<"Viewer::frameAdvance()."<<std::endl;
|
||||
|
||||
_scene->frameAdvance();
|
||||
@@ -119,6 +124,8 @@ void Viewer::frameAdvance()
|
||||
|
||||
void Viewer::frameEventTraversal()
|
||||
{
|
||||
if (_done) return;
|
||||
|
||||
// osg::notify(osg::NOTICE)<<"Viewer::frameEventTraversal()."<<std::endl;
|
||||
|
||||
// need to copy events from the GraphicsWindow's into local EventQueue;
|
||||
@@ -201,6 +208,24 @@ void Viewer::frameEventTraversal()
|
||||
}
|
||||
#endif
|
||||
|
||||
// osg::notify(osg::NOTICE)<<"Events "<<events.size()<<std::endl;
|
||||
for(osgGA::EventQueue::Events::iterator itr = events.begin();
|
||||
itr != events.end();
|
||||
++itr)
|
||||
{
|
||||
osgGA::GUIEventAdapter* event = itr->get();
|
||||
switch(event->getEventType())
|
||||
{
|
||||
case(osgGA::GUIEventAdapter::KEYUP):
|
||||
if (event->getKey()=='q') _done = true;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (_done) return;
|
||||
|
||||
ActionAdapter aa;
|
||||
|
||||
for(osgGA::EventQueue::Events::iterator itr = events.begin();
|
||||
@@ -227,6 +252,10 @@ void Viewer::frameEventTraversal()
|
||||
|
||||
void Viewer::frameUpdateTraversal()
|
||||
{
|
||||
if (_done) return;
|
||||
|
||||
if (_scene.valid()) _scene->frameUpdateTraversal();
|
||||
|
||||
if (_cameraManipulator.valid())
|
||||
{
|
||||
_camera->setViewMatrix(_cameraManipulator->getInverseMatrix());
|
||||
@@ -235,14 +264,50 @@ void Viewer::frameUpdateTraversal()
|
||||
updateSlaves();
|
||||
}
|
||||
|
||||
void Viewer::frameCullTraversal()
|
||||
void Viewer::frameRenderingTraversals()
|
||||
{
|
||||
osg::notify(osg::NOTICE)<<"Viewer::frameCullTraversal() not implemented yet."<<std::endl;
|
||||
}
|
||||
if (_done) return;
|
||||
|
||||
void Viewer::frameDrawTraversal()
|
||||
{
|
||||
osg::notify(osg::NOTICE)<<"Viewer::frameDrawTraversal() not implemented yet."<<std::endl;
|
||||
typedef std::set<osg::GraphicsContext*> GraphicsContexts;
|
||||
GraphicsContexts contexts;
|
||||
|
||||
if (_camera.valid() && _camera->getGraphicsContext())
|
||||
{
|
||||
osgViewer::GraphicsWindow* gw = dynamic_cast<osgViewer::GraphicsWindow*>(_camera->getGraphicsContext());
|
||||
if (gw)
|
||||
{
|
||||
contexts.insert(gw);
|
||||
}
|
||||
}
|
||||
|
||||
for(unsigned int i=0; i<getNumSlaves(); ++i)
|
||||
{
|
||||
Slave& slave = getSlave(i);
|
||||
if (slave._camera.valid() && slave._camera->getGraphicsContext())
|
||||
{
|
||||
osgViewer::GraphicsWindow* gw = dynamic_cast<osgViewer::GraphicsWindow*>(slave._camera->getGraphicsContext());
|
||||
if (gw)
|
||||
{
|
||||
contexts.insert(gw);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for(GraphicsContexts::iterator itr = contexts.begin();
|
||||
itr != contexts.end();
|
||||
++itr)
|
||||
{
|
||||
if (_done) return;
|
||||
const_cast<osg::GraphicsContext*>(*itr)->makeCurrent();
|
||||
const_cast<osg::GraphicsContext*>(*itr)->runOperations();
|
||||
}
|
||||
|
||||
for(GraphicsContexts::iterator itr = contexts.begin();
|
||||
itr != contexts.end();
|
||||
++itr)
|
||||
{
|
||||
const_cast<osg::GraphicsContext*>(*itr)->swapBuffers();
|
||||
}
|
||||
}
|
||||
|
||||
void Viewer::releaseAllGLObjects()
|
||||
|
||||
Reference in New Issue
Block a user