<div dir="ltr">Dear All,<div>I am trying to draw some VTK stuff inside a pre-existing OpenGL context; this context has been created with a library called OpenSG (not to be confused with OpenSceneGraph).</div><div><br></div><div>After some trial-and-error development, I managed to adapt a OpenSG example and integrate some VTK rendering. In the initialization phase I:</div><div>- create an OpenSG GLUT window and put a torus inside the OpenSG scene,</div><div>- create a VTK ExternalVTKWidget and related window/renderer, and put a cube inside the VTK scene.</div><div>In the GLUT main loop, I:</div><div>- activate the OpenSG window,</div><div>- draw the OpenSG torus,</div><div>- setup some GL stuff for camera and lights (why?!?),<br></div><div>- draw the VTK cube,<br></div><div>- swap buffers and deactivate the OpenSG window.<br></div><div><br></div><div>Now, my questions are essentially two:</div><div>1) Why do I need to write the OpenGL/glu code for the camera and the lights? It seems to me that OpenSG correctly calls the OpenGL state machine and sets up the camera and lights, but, when it comes to VTK, the internal camera and lights settings are not used (for example, if I set the camera near and far plane in the vtkRenderer it is ignored, to get everything work I have to call the gluPerspective() on each frame). The same for the Modelview tranform.</div><div>2) When I quit the application, a VTK window opens and prompts me for some OpenGL errors: "</div><div><div>Generic Warning: In ..\..\..\VTK-6.3.0\Rendering\OpenGL\vtkOpenGLDisplayListPainter.cxx, line 52</div><div>failed after ReleaseAllLists 16 OpenGL errors detected</div><div>  0 : (1282) Invalid operation</div><div>  1 : (1282) Invalid operation</div><div>  2 : (1282) Invalid operation</div><div>  3 : (1282) Invalid operation</div><div>  4 : (1282) Invalid operation</div><div>  5 : (1282) Invalid operation</div><div>  6 : (1282) Invalid operation</div><div>  7 : (1282) Invalid operation</div><div>  8 : (1282) Invalid operation</div><div>  9 : (1282) Invalid operation</div><div>  10 : (1282) Invalid operation</div><div>  11 : (1282) Invalid operation</div><div>  12 : (1282) Invalid operation</div><div>  13 : (1282) Invalid operation</div><div>  14 : (1282) Invalid operation</div><div>  15 : (1282) Invalid operation</div></div><div>", can someone tell me why?</div><div><br></div><div>Currently , I am developing with Visual Studio 2010.</div><div>Any suggestion or hint will be highly appreciated!</div><div>Kind Regards,</div><div>Christian</div><div><br></div><div>PS: below you can find the complete example:</div><div><br></div><div><div>#include <vtkAutoInit.h></div><div>VTK_MODULE_INIT(vtkRenderingOpenGL);</div><div>VTK_MODULE_INIT(vtkRenderingContextOpenGL);</div><div>VTK_MODULE_INIT(vtkRenderingFreeType);</div><div>VTK_MODULE_INIT(vtkInteractionStyle);</div><div><br></div><div>// OSG Includes</div><div>#include <OSGGLUT.h></div><div>#include <OSGConfig.h></div><div>#include <OSGSimpleGeometry.h></div><div>#include <OSGGLUTWindow.h></div><div>#include <OSGSimpleSceneManager.h></div><div>#include <OSGPerspectiveCamera.h></div><div><br></div><div>// VTK includes</div><div>#include <ExternalVTKWidget.h></div><div>#include <vtkActor.h></div><div>#include <vtkCallbackCommand.h></div><div>#include <vtkCamera.h></div><div>#include <vtkCubeSource.h></div><div>#include <vtkExternalOpenGLRenderWindow.h></div><div>#include <vtkNew.h></div><div>#include <vtkPolyDataMapper.h></div><div>#include <vtkProperty.h></div><div><br></div><div>// defines</div><div>#define FOV 75.f</div><div>#define NEAR_PLANE 0.01f</div><div>#define FAR_PLANE 100.0f</div><div><br></div><div>// variables</div><div>vtkNew<ExternalVTKWidget> externalVTKWidget;</div><div>vtkNew<vtkActor> actor;</div><div>int width = 100, height = 100;</div><div>OSG::SimpleSceneManagerRefPtr mgr;</div><div>OSG::GLUTWindowRefPtr gwin;</div><div><br></div><div>using namespace OSG;</div><div><br></div><div>// redraw the window</div><div>void display(void)</div><div>{</div><div><span class="Apple-tab-span" style="white-space:pre">     </span>// activate OSG window</div><div><span class="Apple-tab-span" style="white-space:pre">       </span>gwin->activate();</div><div><span class="Apple-tab-span" style="white-space:pre"> </span>gwin->frameInit();</div><div><br></div><div><span class="Apple-tab-span" style="white-space:pre">       </span>// draw OSG stuff</div><div><span class="Apple-tab-span" style="white-space:pre">    </span>mgr->update();</div><div><span class="Apple-tab-span" style="white-space:pre">    </span>gwin->renderAllViewports(mgr->getRenderAction());</div><div><br></div><div><span class="Apple-tab-span" style="white-space:pre">     </span>// setup gl stuff for camera and lights (why?!?)</div><div><span class="Apple-tab-span" style="white-space:pre">     </span>glMatrixMode(GL_PROJECTION);</div><div><span class="Apple-tab-span" style="white-space:pre"> </span>glLoadIdentity();</div><div><span class="Apple-tab-span" style="white-space:pre">    </span>gluPerspective (FOV, (float)width/(float)height, NEAR_PLANE, FAR_PLANE);</div><div><span class="Apple-tab-span" style="white-space:pre">     </span>glEnable(GL_LIGHTING);</div><div><span class="Apple-tab-span" style="white-space:pre">       </span>glEnable(GL_LIGHT0);</div><div><br></div><div><span class="Apple-tab-span" style="white-space:pre">        </span>// draw VTK stuff</div><div><span class="Apple-tab-span" style="white-space:pre">    </span>actor->RotateX(1.0f);</div><div><span class="Apple-tab-span" style="white-space:pre">     </span>actor->RotateY(1.0f);</div><div><span class="Apple-tab-span" style="white-space:pre">     </span>externalVTKWidget->GetRenderWindow()->Render();</div><div><br></div><div><span class="Apple-tab-span" style="white-space:pre">       </span>// swap buffers and deactivate OSG window</div><div><span class="Apple-tab-span" style="white-space:pre">    </span>gwin->swap();</div><div><span class="Apple-tab-span" style="white-space:pre">     </span>gwin->frameExit();</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>gwin->deactivate();</div><div>}</div><div><br></div><div>// react to size changes</div><div>void reshape(int w, int h)</div><div>{</div><div><span class="Apple-tab-span" style="white-space:pre">      </span>width = w;</div><div><span class="Apple-tab-span" style="white-space:pre">   </span>height = h;</div><div><span class="Apple-tab-span" style="white-space:pre">  </span>mgr->resize(w, h);</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>glutPostRedisplay();</div><div>}</div><div><br></div><div>// react to mouse button presses</div><div>void mouse(int button, int state, int x, int y)</div><div>{</div><div><span class="Apple-tab-span" style="white-space:pre">   </span>if (state)</div><div><span class="Apple-tab-span" style="white-space:pre">           </span>mgr->mouseButtonRelease(button, x, y);</div><div><span class="Apple-tab-span" style="white-space:pre">    </span>else</div><div><span class="Apple-tab-span" style="white-space:pre">         </span>mgr->mouseButtonPress(button, x, y);</div><div><span class="Apple-tab-span" style="white-space:pre">      </span>glutPostRedisplay();</div><div>}</div><div><br></div><div>// react to mouse motions with pressed buttons</div><div>void motion(int x, int y)</div><div>{</div><div><span class="Apple-tab-span" style="white-space:pre">   </span>mgr->mouseMove(x, y);</div><div><span class="Apple-tab-span" style="white-space:pre">     </span>glutPostRedisplay();</div><div>}</div><div><br></div><div>// react to keys</div><div>void keyboard(unsigned char k, int x, int y)</div><div>{</div><div><span class="Apple-tab-span" style="white-space:pre">      </span>switch(k)</div><div><span class="Apple-tab-span" style="white-space:pre">    </span>{</div><div><span class="Apple-tab-span" style="white-space:pre">    </span>case 27:</div><div><span class="Apple-tab-span" style="white-space:pre">             </span>{</div><div><span class="Apple-tab-span" style="white-space:pre">                    </span>mgr = NULL;</div><div><span class="Apple-tab-span" style="white-space:pre">                  </span>gwin = NULL;</div><div><span class="Apple-tab-span" style="white-space:pre">                 </span>OSG::osgExit();</div><div><span class="Apple-tab-span" style="white-space:pre">                      </span>exit(0);</div><div><span class="Apple-tab-span" style="white-space:pre">             </span>}</div><div><span class="Apple-tab-span" style="white-space:pre">            </span>break;</div><div><span class="Apple-tab-span" style="white-space:pre">       </span>}</div><div>}</div><div><br></div><div><br></div><div>int main(int argc, char **argv)</div><div>{</div><div><span class="Apple-tab-span" style="white-space:pre">    </span>// init and setup GLUT</div><div><span class="Apple-tab-span" style="white-space:pre">       </span>glewInit();</div><div><span class="Apple-tab-span" style="white-space:pre">  </span>OSG::osgInit(argc,argv);</div><div><span class="Apple-tab-span" style="white-space:pre">     </span>glutInit(&argc, argv);</div><div><span class="Apple-tab-span" style="white-space:pre">   </span>glutInitDisplayMode(GLUT_RGB | GLUT_DEPTH | GLUT_DOUBLE);</div><div><span class="Apple-tab-span" style="white-space:pre">    </span>int winid = glutCreateWindow("OpenSG");</div><div><span class="Apple-tab-span" style="white-space:pre">    </span>glutReshapeFunc(reshape);</div><div><span class="Apple-tab-span" style="white-space:pre">    </span>glutDisplayFunc(display);</div><div><span class="Apple-tab-span" style="white-space:pre">    </span>glutIdleFunc(display);</div><div><span class="Apple-tab-span" style="white-space:pre">       </span>glutMouseFunc(mouse);</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>glutMotionFunc(motion);</div><div><span class="Apple-tab-span" style="white-space:pre">      </span>glutKeyboardFunc(keyboard);</div><div><br></div><div><span class="Apple-tab-span" style="white-space:pre"> </span>{</div><div><span class="Apple-tab-span" style="white-space:pre">            </span>// Connection between GLUT and OpenSG</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>gwin = OSG::GLUTWindow::create();</div><div><span class="Apple-tab-span" style="white-space:pre">            </span>gwin->setGlutId(winid);</div><div><span class="Apple-tab-span" style="white-space:pre">           </span>gwin->setSize(100, 100);</div><div><span class="Apple-tab-span" style="white-space:pre">          </span>gwin->init();</div><div><br></div><div><span class="Apple-tab-span" style="white-space:pre">            </span>// create the scene</div><div><span class="Apple-tab-span" style="white-space:pre">          </span>OSG::NodeRefPtr scene = OSG::makeTorus(.1f, 0.6f, 16, 16);</div><div><span class="Apple-tab-span" style="white-space:pre">           </span>OSG::commitChanges();</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>mgr = OSG::SimpleSceneManager::create();</div><div><span class="Apple-tab-span" style="white-space:pre">             </span>mgr->setWindow(gwin );</div><div><span class="Apple-tab-span" style="white-space:pre">            </span>mgr->setRoot  (scene);</div><div><span class="Apple-tab-span" style="white-space:pre">           </span>mgr->showAll();</div><div><br></div><div><span class="Apple-tab-span" style="white-space:pre">          </span>// set the camera parameters</div><div><span class="Apple-tab-span" style="white-space:pre">         </span>CameraRecPtr cam = mgr->getCamera();</div><div><span class="Apple-tab-span" style="white-space:pre">              </span>PerspectiveCamera *pPerspCam = OSG::dynamic_pointer_cast<PerspectiveCamera>(cam);</div><div><span class="Apple-tab-span" style="white-space:pre">              </span>pPerspCam->setFov(FOV);</div><div><span class="Apple-tab-span" style="white-space:pre">           </span>pPerspCam->setNear(NEAR_PLANE);</div><div><span class="Apple-tab-span" style="white-space:pre">           </span>pPerspCam->setFar(FAR_PLANE);</div><div><span class="Apple-tab-span" style="white-space:pre">             </span>pPerspCam->setAspect(1.f);</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>}</div><div><br></div><div><span class="Apple-tab-span" style="white-space:pre">   </span>{</div><div><span class="Apple-tab-span" style="white-space:pre">            </span>// create the VTK scene</div><div><span class="Apple-tab-span" style="white-space:pre">              </span>vtkNew<vtkCubeSource> cs;</div><div><span class="Apple-tab-span" style="white-space:pre">              </span>vtkNew<vtkPolyDataMapper> mapper;</div><div><span class="Apple-tab-span" style="white-space:pre">              </span>mapper->SetInputConnection(cs->GetOutputPort());</div><div><br></div><div><span class="Apple-tab-span" style="white-space:pre">              </span>actor->SetMapper(mapper.GetPointer());</div><div><span class="Apple-tab-span" style="white-space:pre">            </span>actor->GetProperty()->SetColor(1,1,0.2);</div><div><span class="Apple-tab-span" style="white-space:pre">               </span>actor->GetProperty()->SetOpacity(0.5);</div><div><br></div><div><span class="Apple-tab-span" style="white-space:pre">                </span>// create the VTK external renderer</div><div><span class="Apple-tab-span" style="white-space:pre">          </span>vtkNew<vtkExternalOpenGLRenderWindow> renWin;</div><div><span class="Apple-tab-span" style="white-space:pre">          </span>externalVTKWidget->SetRenderWindow(renWin.GetPointer());</div><div><span class="Apple-tab-span" style="white-space:pre">          </span>vtkRenderer* ren = externalVTKWidget->AddRenderer();</div><div><span class="Apple-tab-span" style="white-space:pre">              </span>ren->AddActor(actor.GetPointer());</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>}</div><div><br></div><div><span class="Apple-tab-span" style="white-space:pre">   </span>glutMainLoop();</div><div><span class="Apple-tab-span" style="white-space:pre">      </span>return 0;</div><div>}</div></div><div><br></div></div>