Hi Joshua,
I don't know CAVElib personally so can't answer specifics about
integration with it.
A couple of general comments though:
1) Is the CAVElib creating multiple graphics contexts? If so there you'll
need a GraphicsWindow on the OSG per context you can't reuse the
same window per context.
2) Do you really need to use CAVElib? The OSG itself can render
to a cave just by setting up the Viewer slave Camera appropriately.
There is also integration with other 3rd party VR libs.
Robert.
On 9 November 2011 20:53, Joshua Cook <[email protected]> wrote:
> So, comes the hard part of my asignment. I'm now tasked with taking the
> wonderful viewer that I've written using OSG and making it play nice with
> CAVElib. Well, CAVElib does not like to play nice. It must own the OpenGL
> context and controll everything except the drawing of the objects. Well, the
> only way I could see to do this was use a GraphicsWindowEmbeded. Now, if I
> just run CAVElib in the background, so to speak, I can see the example .iv
> file perfectly. However, there is a constant barage of warnings that an
> OpenGL error has been detected starting with Warning: detected OpenGL error
> 'invalid operation' at Before Renderer::compile, once for each pipe, and then
> a constant stream of Warning: detected OpenGL error 'invalid operation' at
> after RenderBin::draw(..). If I let CAVElib determine my view frustrum and
> look at matrix I get a screen of garbage because both frustrum and view
> matrixes are identity matrixes which I attribute to the OpenGL issues.
>
> the simple code I'm running to show a .iv file is as follows
>
>
> Code:
>
> osg::Node* node = NULL;
> osg::PositionAttitudeTransform* pat = NULL;
> std::vector<osgViewer::Viewer*> viewVec;
> OpenThreads::Mutex m;
> osg::GraphicsContext* gc = NULL;
>
> void init()
> {
> osgViewer::Viewer* viewer = NULL;
> {
> OpenThreads::ScopedLock<OpenThreads::Mutex> lock(m);
> viewer = new osgViewer::Viewer();
> viewer->setReleaseContextAtEndOfFrameHint(false);
> osg::ref_ptr<osgViewer::GraphicsWindowEmbedded> gw =
> viewer->setUpViewerAsEmbeddedInWindow(100, 100, 500, 500);
> viewer->getCamera()->setGraphicsContext(gw);
> viewer->setSceneData(pat);
> viewer->setThreadingModel(osgViewer::Viewer::SingleThreaded);
> viewer->setCameraManipulator(new osgGA::TrackballManipulator);
> viewer->setThreadSafeRefUnref(true);
> viewer->realize();
> viewVec.push_back(viewer);
> }
>
> CAVEDisplayBarrier();
>
> }
>
> void display()
> {
> //GLenum errorNo;
>
> //glPushAttrib(GL_ALL_ATTRIB_BITS);
> //glPushClientAttrib(GL_CLIENT_ALL_ATTRIB_BITS);
> //glShadeModel(GL_SMOOTH);
>
> //glMatrixMode(GL_TEXTURE);
> //glPushMatrix();
> //glLoadIdentity();
> //glMatrixMode(GL_PROJECTION);
> //glPushMatrix();
> //glLoadIdentity();
> //glMatrixMode(GL_MODELVIEW);
> //glPushMatrix();
> //glLoadIdentity();
>
> int num = CAVEPipeNumber();
> osgViewer::Viewer* viewer = viewVec[num];
> viewer->frame();
>
> //glMatrixMode(GL_TEXTURE);
> //glPopMatrix();
> //glMatrixMode(GL_PROJECTION);
> //glPopMatrix();
> //glMatrixMode(GL_MODELVIEW);
> //glPopMatrix();
>
> //glPopAttrib();
> //glPopClientAttrib();
>
> //errorNo = glGetError();
>
> CAVEDisplayBarrier();
> }
>
> void frame()
> {
> if(CAVEMasterDisplay())
> {
> pat->setAttitude(pat->getAttitude() * osg::Quat(3.14 / 180.0,
> osg::Y_AXIS));
> }
>
>
> pat->setPosition(osg::Vec3(-100, -100, -100));
> int num = CAVEPipeNumber();
> osgViewer::Viewer* viewer = viewVec[num];
> osg::Camera* cam = viewer->getCamera();
> int height = 0;
> int width = 0;
> int x = 0;
> int y = 0;
> CAVEGetViewport(&x, &y, &width, &height);
> cam->setViewport(x, y, width, height);
>
> float viewMatrixGL[16] = {0};
> float projMatrixGL[16] = {0};
>
> CAVENavTransform();
>
> glGetFloatv( GL_MODELVIEW_MATRIX , (float*)viewMatrixGL );
> glGetFloatv( GL_PROJECTION_MATRIX, (float*)projMatrixGL );
>
> osg::Matrix viewMatrix(viewMatrixGL);
> osg::Matrix projMatrix(projMatrixGL);
>
> // set theproj
> cam->setProjectionMatrix(projMatrix);
> // set the view
> cam->setViewMatrix(viewMatrix);
>
> CAVEDisplayBarrier();
> }
>
> int main(int argv, char** argc)
> {
> node = osgDB::readNodeFile("test.iv");
> pat = new osg::PositionAttitudeTransform();
> pat->addChild(node);
>
> CAVEConfigure(NULL, NULL, NULL);
> CAVEInitApplication(init, 0);
> CAVEDisplay(display, 0);
> CAVEFrameFunction(frame, 0);
> CAVEInit();
>
> while(1)
> {
> OpenThreads::Thread::microSleep(1000);
> }
> }
>
>
>
>
> I can't find a solution to my problem and I've scoured the forums, net,
> contacted Mechdyne who owns CAVElib, prayed, and even contemplated
> sacrificing a virgin but the alter is in for cleaning. So, any help, insite,
> or the like would be greatly appreciated.
>
> soulsabr[/code]
>
> ------------------
> Read this topic online here:
> http://forum.openscenegraph.org/viewtopic.php?p=43802#43802
>
>
>
>
>
> _______________________________________________
> osg-users mailing list
> [email protected]
> http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org
>
_______________________________________________
osg-users mailing list
[email protected]
http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org