1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92
|
/*=========================================================================
Program: Visualization Toolkit
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.
=========================================================================*/
#ifndef vtkOpenGLResourceFreeCallback_h
#define vtkOpenGLResourceFreeCallback_h
// Description:
// Provide a mechanism for making sure graphics resources are
// freed properly.
class vtkOpenGLRenderWindow;
class vtkWindow;
class vtkGenericOpenGLResourceFreeCallback
{
public:
vtkGenericOpenGLResourceFreeCallback() {
this->VTKWindow = NULL; this->Releasing = false; }
virtual ~vtkGenericOpenGLResourceFreeCallback() { }
// Called when the event is invoked
virtual void Release() = 0;
virtual void RegisterGraphicsResources(vtkOpenGLRenderWindow *rw) = 0;
bool IsReleasing() {
return this->Releasing; }
protected:
vtkOpenGLRenderWindow *VTKWindow;
bool Releasing;
};
// Description:
// Templated member callback.
template <class T>
class vtkOpenGLResourceFreeCallback : public vtkGenericOpenGLResourceFreeCallback
{
public:
vtkOpenGLResourceFreeCallback(T* handler, void (T::*method)(vtkWindow *))
{
this->Handler = handler;
this->Method = method;
}
virtual ~vtkOpenGLResourceFreeCallback() { }
virtual void RegisterGraphicsResources(vtkOpenGLRenderWindow *rw) {
if (this->VTKWindow == rw)
{
return;
}
if (this->VTKWindow)
{
this->Release();
}
this->VTKWindow = rw;
this->VTKWindow->RegisterGraphicsResources(this);
}
// Called when the event is invoked
virtual void Release()
{
if (this->VTKWindow && this->Handler && !this->Releasing)
{
this->Releasing = true;
this->VTKWindow->PushContext();
(this->Handler->*this->Method)(this->VTKWindow);
this->VTKWindow->UnregisterGraphicsResources(this);
this->VTKWindow->PopContext();
this->VTKWindow = NULL;
this->Releasing = false;
}
}
protected:
T* Handler;
void (T::*Method)(vtkWindow *);
};
#endif
// VTK-HeaderTest-Exclude: vtkOpenGLResourceFreeCallback.h
|