[vtkusers] X, vtkXOpenGLRenderWindow and vtkXRenderWindowInteractor

Kall, Bruce A. kall at mayo.edu
Tue Apr 14 15:33:10 EDT 2009


Is there anyway to do what I want via a straight Xlib-created window
and no Xt?

Bruce


Clinton Stimpson wrote:
>
> 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