[vtk-developers] recent Solution: Bug in SetRenderWindow(NULL)=> still a bug?
Dean Inglis
dean.inglis at camris.ca
Wed Dec 10 10:38:44 EST 2003
Hi Charl,
>fail. Does vtkBorlandRenderWindow simply inherit from
>vtkWin32OpenGLRenderWindow?
No, it inherits from one of the Borland C++ Builder VCL components
and maintains protected ivars:
vtkWin32OpenGLRenderWindow *FRenderWindow;
vtkRenderer *FRenderer;
vtkWin32RenderWindowInteractor *FInteractor;
which one can access through pointer by Get methods (no Set).
<destroy it...>
//--------------------------------------------------------------------------
-
__fastcall TvtkBorlandRenderWindow::~TvtkBorlandRenderWindow()
{
// Delete this first because Renderwindow has a hold on it too
if (FInteractor)
{
FInteractor->Delete();
FInteractor = NULL;
}
if (FRenderer)
{
if(FRenderWindow) { FRenderWindow->RemoveRenderer(FRenderer); }
FRenderer->Delete();
FRenderer = NULL;
}
if (FRenderWindow)
{
FRenderWindow->RemoveObserver(FAbortCallback);
FRenderWindow->Delete();
FRenderWindow = NULL;
}
FAbortCallback->Delete();
}
<create it when needed...>
//--------------------------------------------------------------------------
-
vtkWin32OpenGLRenderWindow * __fastcall
TvtkBorlandRenderWindow::GetRenderWindow(void)
{
if (!FRenderWindow)
{
//stuff the renderwindow into our window
FRenderWindow = vtkWin32OpenGLRenderWindow::New();
FRenderWindow->AddObserver( vtkCommand::AbortCheckEvent,
FAbortCallback);
FRenderWindow->SetParentId(Parent->Handle);
FRenderWindow->SetWindowId(Handle);
FRenderWindow->DoubleBufferOn();
FRenderWindow->SwapBuffersOn();
// Clean and Frame to avoid unsightly garbage during initial
// display which may be long when a complex scene is first rendered
FRenderWindow->Clean();
FRenderWindow->Frame();
this->Invalidate();
}
// We create the interactor here because it makes maintenance better
if (!FInteractor)
{
FInteractor = vtkWin32RenderWindowInteractor::New();
FInteractor->SetRenderWindow(FRenderWindow);
FInteractor->SetInstallMessageProc(false);
this->SetInteractorMode(FInteractorMode);
FInteractor->UpdateSize(Width,Height);
FInteractor->Initialize();
}
return FRenderWindow;
}
Dean
>> The error does not occur in a Borland C++ Builder (5 or 6) app having
only one
>> vtkBorlandRenderWindow component. In the case of an app with two such
>> components, when the app destroys the components, the first internal
render window
>> successfully completes its Delete() while the second produce the above
errors.
>> I'm unsure how to fix this for Borland users (including myself!).
>Urgh... unless my memory is playing tricks again, each RenderWindow
>should have a valid context, so that MakeCurrent should actually never
>fail. Does vtkBorlandRenderWindow simply inherit from
>vtkWin32OpenGLRenderWindow?
More information about the vtk-developers
mailing list