[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