[vtkusers] X, vtkXOpenGLRenderWindow and vtkXRenderWindowInteractor

Clinton Stimpson clinton at elemtech.com
Tue Apr 14 14:38:22 EDT 2009


vtkXRenderWindowInteractor also requires Xt, so you'll need the 
XtAppContext, and to give your own Window, it'll have to be an Xt Widget 
instead.

Clint

Kall, Bruce A. wrote:
> What is the correct way in X Windows (Xlib) to map my own X window and
> have all rendering and interaction happen with this window?
> I've modified the code for Example2.cxx (see below).
>
> The renWin->Render() works in the window I create, but the interactor 
> seems
> to create another window on the Start() command and then immediately dies
> with a GLXBadDrawable error:
> Major opcode 128 (GLX)
> Minor opcode: 11 (X_GLXSwapBuffers)
>
> Any suggestions, corrections? Sure seems like this must have come up
> before, but I haven't found any code that does this in pure Xlib.
>
> If I comment out the renwin->Render() just before creating the 
> interactor, the
> interactor does create and pop up its own window (with no error) and 
> then all rendering and
> interaction does go into the window the interactor creates, but not my 
> window.
>
> Thanks,
> Bruce
>
>
> The code:
>
> /*========================================================================= 
>
>
>  Program:   Visualization Toolkit
>  Module:    $RCSfile: Example2.cxx,v $
>
>  Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
>  All rights reserved.
>  See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
>
>     This software is distributed WITHOUT ANY WARRANTY; without even
>     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
>     PURPOSE.  See the above copyright notice for more information.
>
> =========================================================================*/ 
>
> // include OS specific include file to mix in X code
>
> #include "vtkActor.h"
> #include "vtkConeSource.h"
> #include "vtkGlyph3D.h"
> #include "vtkPolyData.h"
> #include "vtkPolyDataMapper.h"
> #include "vtkRenderer.h"
> #include "vtkSphereSource.h"
> #include "vtkXOpenGLRenderWindow.h"
> #include "vtkXRenderWindowInteractor.h"
>
> #include <X11/Xlib.h>
>
>
> void quit_cb(Widget,XtPointer,XtPointer);
>
> int main (int argc, char *argv[])
> {
>  // X window stuff
>  int depth;
>  Visual *vis;
>  Display *display;
>  Window window;
>
>  Colormap col;
>
>  unsigned long white_pixel,black_pixel;
>  XColor color_value;
>
>  // do the xwindow ui stuff
>  // get the display connection and give it to the renderer
>  display = XOpenDisplay(NULL);
>  /* Turn X Synchronization on so errors happen right away, rather than 
> getting buffered */
>  XSynchronize(display,true);
>
>  // VTK stuff
>  vtkXOpenGLRenderWindow *renWin;
>  vtkRenderer *ren1;
>  vtkActor *sphereActor1, *spikeActor1;
>  vtkSphereSource *sphere;
>  vtkConeSource *cone;
>  vtkGlyph3D *glyph;
>  vtkPolyDataMapper *sphereMapper, *spikeMapper;
>  vtkXRenderWindowInteractor *iren;
>
>
>  renWin = vtkXOpenGLRenderWindow::New();
>
>  renWin->SetDisplayId(display);
>  depth = renWin->GetDesiredDepth();
>  vis = renWin->GetDesiredVisual();
>  col = renWin->GetDesiredColormap();
>
>  /* get a couple of colors */
>  white_pixel = 0;
>  black_pixel = 0;
>  if(XParseColor(display, col, "white", &color_value))
>    white_pixel = color_value.pixel;
>
>  if(XParseColor(display, col, "black", &color_value))
>    black_pixel = color_value.pixel;
>
>  window = 
> XCreateSimpleWindow(display,DefaultRootWindow(display),512,512,256,256,1,white_pixel,black_pixel); 
>
>  XMapRaised(display,window);
>  XFlush(display);
>  XClearWindow(display,window);
>  XFlush(display);
>  renWin->SetDisplayId(display);
>  renWin->SetWindowId(window);
>
>  ren1 = vtkRenderer::New();
>  renWin->AddRenderer(ren1);
>
>  sphere = vtkSphereSource::New();
>  sphereMapper = vtkPolyDataMapper::New();
>  sphereMapper->SetInputConnection(sphere->GetOutputPort());
>  sphereActor1 = vtkActor::New();
>  sphereActor1->SetMapper(sphereMapper);
>  cone = vtkConeSource::New();
>  glyph = vtkGlyph3D::New();
>  glyph->SetInputConnection(sphere->GetOutputPort());
>  glyph->SetSourceConnection(cone->GetOutputPort());
>  glyph->SetVectorModeToUseNormal();
>  glyph->SetScaleModeToScaleByVector();
>  glyph->SetScaleFactor(0.25);
>  spikeMapper = vtkPolyDataMapper::New();
>  spikeMapper->SetInputConnection(glyph->GetOutputPort());
>  spikeActor1 = vtkActor::New();
>  spikeActor1->SetMapper(spikeMapper);
>  ren1->AddActor(sphereActor1);
>  ren1->AddActor(spikeActor1);
>  ren1->SetBackground(0.4,0.1,0.2);
>
>  renWin->Render();
>  // We use an X specific interactor
>  // since we have decided to make this an X program
>  iren = vtkXRenderWindowInteractor::New();
>  iren->SetRenderWindow(renWin);
>
>  iren->Start();
>
>  return 0;
> }
>
> _______________________________________________
> Powered by www.kitware.com
>
> Visit other Kitware open-source projects at 
> http://www.kitware.com/opensource/opensource.html
>
> Please keep messages on-topic and check the VTK FAQ at: 
> http://www.vtk.org/Wiki/VTK_FAQ
>
> Follow this link to subscribe/unsubscribe:
> http://www.vtk.org/mailman/listinfo/vtkusers




More information about the vtkusers mailing list