You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
408 lines
11 KiB
C++
408 lines
11 KiB
C++
/*=========================================================================
|
|
|
|
Program: Visualization Toolkit
|
|
Module: vtkCocoaRenderWindow.h
|
|
|
|
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.
|
|
|
|
=========================================================================*/
|
|
/**
|
|
* @class vtkCocoaRenderWindow
|
|
* @brief Cocoa OpenGL rendering window
|
|
*
|
|
*
|
|
* vtkCocoaRenderWindow is a concrete implementation of the abstract
|
|
* class vtkOpenGLRenderWindow. It is only available on Mac OS X 10.6
|
|
* and later.
|
|
* To use this class, build VTK with VTK_USE_COCOA turned ON (this is
|
|
* the default).
|
|
* This class can be used by 32 and 64 bit processes, and either in
|
|
* garbage collected or reference counted modes. ARC is not yet supported.
|
|
* vtkCocoaRenderWindow uses Objective-C++, and the OpenGL and
|
|
* Cocoa APIs. This class's default behaviour is to create an NSWindow and
|
|
* a vtkCocoaGLView which are used together to draw all VTK content.
|
|
* If you already have an NSWindow and vtkCocoaGLView and you want this
|
|
* class to use them you must call both SetRootWindow() and SetWindowId(),
|
|
* respectively, early on (before WindowInitialize() is executed).
|
|
*
|
|
* @sa
|
|
* vtkOpenGLRenderWindow vtkCocoaGLView
|
|
*
|
|
* @warning
|
|
* This header must be in C++ only because it is included by .cxx files.
|
|
* That means no Objective-C may be used. That's why some instance variables
|
|
* are void* instead of what they really should be.
|
|
*/
|
|
|
|
#ifndef vtkCocoaRenderWindow_h
|
|
#define vtkCocoaRenderWindow_h
|
|
|
|
#include "vtkRenderingOpenGLModule.h" // For export macro
|
|
#include "vtkOpenGLRenderWindow.h"
|
|
|
|
class VTKRENDERINGOPENGL_EXPORT vtkCocoaRenderWindow : public vtkOpenGLRenderWindow
|
|
{
|
|
public:
|
|
static vtkCocoaRenderWindow *New();
|
|
vtkTypeMacro(vtkCocoaRenderWindow,vtkOpenGLRenderWindow);
|
|
void PrintSelf(ostream& os, vtkIndent indent);
|
|
|
|
/**
|
|
* Begin the rendering process.
|
|
*/
|
|
virtual void Start();
|
|
|
|
/**
|
|
* Finish the rendering process.
|
|
*/
|
|
virtual void Frame();
|
|
|
|
/**
|
|
* Specify various window parameters.
|
|
*/
|
|
virtual void WindowConfigure();
|
|
|
|
/**
|
|
* Initialize the window for rendering.
|
|
* virtual void WindowInitialize();
|
|
*/
|
|
|
|
/**
|
|
* Initialize the rendering window.
|
|
*/
|
|
virtual void Initialize();
|
|
|
|
/**
|
|
* Change the window to fill the entire screen. This is only partially
|
|
* implemented for the vtkCocoaRenderWindow. It can only be called
|
|
* before the window has been created, and it might not work on all
|
|
* versions of OS X.
|
|
*/
|
|
virtual void SetFullScreen(int);
|
|
|
|
/**
|
|
* Remap the window. This is not implemented for the vtkCocoaRenderWindow.
|
|
*/
|
|
virtual void WindowRemap();
|
|
|
|
/**
|
|
* Set the preferred window size to full screen. This is not implemented
|
|
* for the vtkCocoaRenderWindow.
|
|
*/
|
|
virtual void PrefFullScreen();
|
|
|
|
//@{
|
|
/**
|
|
* Set the size of the window in pixels.
|
|
*/
|
|
virtual void SetSize(int a[2]);
|
|
virtual void SetSize(int,int);
|
|
//@}
|
|
|
|
/**
|
|
* Get the current size of the window in pixels.
|
|
*/
|
|
virtual int *GetSize();
|
|
|
|
//@{
|
|
/**
|
|
* Set the position of the window.
|
|
*/
|
|
virtual void SetPosition(int a[2]);
|
|
virtual void SetPosition(int,int);
|
|
//@}
|
|
|
|
/**
|
|
* Get the current size of the screen in pixels.
|
|
*/
|
|
virtual int *GetScreenSize();
|
|
|
|
/**
|
|
* Get the position in screen coordinates of the window.
|
|
*/
|
|
virtual int *GetPosition();
|
|
|
|
/**
|
|
* Set the name of the window. This appears at the top of the window
|
|
* normally.
|
|
*/
|
|
virtual void SetWindowName(const char *);
|
|
|
|
void SetNextWindowInfo(char *)
|
|
{
|
|
vtkWarningMacro("SetNextWindowInfo not implemented (WindowRemap not implemented).");
|
|
}
|
|
virtual void* GetGenericDrawable()
|
|
{
|
|
vtkWarningMacro("Method not implemented.");
|
|
return 0;
|
|
}
|
|
virtual void SetDisplayId(void*)
|
|
{
|
|
vtkWarningMacro("Method not implemented.");
|
|
}
|
|
virtual void *GetGenericDisplayId()
|
|
{
|
|
vtkWarningMacro("Method not implemented.");
|
|
return 0;
|
|
}
|
|
|
|
/**
|
|
* Set this RenderWindow's window id to a pre-existing window.
|
|
* The paramater is an ASCII string of a decimal number representing
|
|
* a pointer to the window.
|
|
*/
|
|
virtual void SetWindowInfo(char*);
|
|
|
|
/**
|
|
* See the documenation for SetParentId(). This method allows the ParentId
|
|
* to be set as an ASCII string of a decimal number that is the memory
|
|
* address of the parent NSView.
|
|
*/
|
|
virtual void SetParentInfo(char*);
|
|
|
|
void SetNextWindowId(void*)
|
|
{
|
|
vtkWarningMacro("SetNextWindowId not implemented (WindowRemap not implemented).");
|
|
}
|
|
|
|
/**
|
|
* Initialize the render window from the information associated
|
|
* with the currently activated OpenGL context.
|
|
*/
|
|
virtual bool InitializeFromCurrentContext();
|
|
|
|
/**
|
|
* Update system if needed due to stereo rendering.
|
|
*/
|
|
virtual void StereoUpdate();
|
|
|
|
/**
|
|
* Prescribe that the window be created in a stereo-capable mode. This
|
|
* method must be called before the window is realized. This method
|
|
* overrrides the superclass method since this class can actually check
|
|
* whether the window has been realized yet.
|
|
*/
|
|
virtual void SetStereoCapableWindow(int capable);
|
|
|
|
/**
|
|
* Make this windows OpenGL context the current context.
|
|
*/
|
|
virtual void MakeCurrent();
|
|
|
|
/**
|
|
* Tells if this window is the current OpenGL context for the calling thread.
|
|
*/
|
|
virtual bool IsCurrent();
|
|
|
|
/**
|
|
* Test if the window has a valid drawable. This is
|
|
* currently only an issue on Mac OS X Cocoa where rendering
|
|
* to an invalid drawable results in all OpenGL calls to fail
|
|
* with "invalid framebuffer operation".
|
|
*/
|
|
virtual bool IsDrawable();
|
|
|
|
/**
|
|
* Update this window's OpenGL context, e.g. when the window is resized.
|
|
*/
|
|
void UpdateContext();
|
|
|
|
/**
|
|
* Get report of capabilities for the render window
|
|
*/
|
|
const char *ReportCapabilities();
|
|
|
|
/**
|
|
* Does this render window support OpenGL? 0-false, 1-true
|
|
*/
|
|
int SupportsOpenGL();
|
|
|
|
/**
|
|
* Is this render window using hardware acceleration? 0-false, 1-true
|
|
*/
|
|
int IsDirect();
|
|
|
|
/**
|
|
* If called, allow MakeCurrent() to skip cache-check when called.
|
|
* MakeCurrent() reverts to original behavior of cache-checking
|
|
* on the next render.
|
|
*/
|
|
virtual void SetForceMakeCurrent();
|
|
|
|
/**
|
|
* Check to see if an event is pending for this window.
|
|
* This is a useful check to abort a long render.
|
|
*/
|
|
virtual int GetEventPending();
|
|
|
|
//@{
|
|
/**
|
|
* Initialize OpenGL for this window.
|
|
*/
|
|
virtual void SetupPalette(void *hDC);
|
|
virtual void SetupPixelFormat(void *hDC, void *dwFlags, int debug,
|
|
int bpp=16, int zbpp=16);
|
|
//@}
|
|
|
|
/**
|
|
* Clean up device contexts, rendering contexts, etc.
|
|
*/
|
|
void Finalize();
|
|
|
|
/**
|
|
* Get the size of the depth buffer.
|
|
*/
|
|
int GetDepthBufferSize();
|
|
|
|
//@{
|
|
/**
|
|
* Hide or Show the mouse cursor, it is nice to be able to hide the
|
|
* default cursor if you want VTK to display a 3D cursor instead.
|
|
* Set cursor position in window (note that (0,0) is the lower left
|
|
* corner).
|
|
*/
|
|
virtual void HideCursor();
|
|
virtual void ShowCursor();
|
|
virtual void SetCursorPosition(int x, int y);
|
|
//@}
|
|
|
|
/**
|
|
* Change the shape of the cursor.
|
|
*/
|
|
virtual void SetCurrentCursor(int);
|
|
|
|
/**
|
|
* Get the ViewCreated flag. It is 1 if this object created an instance
|
|
* of NSView, 0 otherwise.
|
|
*/
|
|
virtual int GetViewCreated();
|
|
|
|
/**
|
|
* Get the WindowCreated flag. It is 1 if this object created an instance
|
|
* of NSWindow, 0 otherwise.
|
|
*/
|
|
virtual int GetWindowCreated();
|
|
|
|
//@{
|
|
/**
|
|
* Accessors for the OpenGL context (Really an NSOpenGLContext*).
|
|
*/
|
|
void SetContextId(void *);
|
|
void *GetContextId();
|
|
virtual void *GetGenericContext() {return this->GetContextId();}
|
|
//@}
|
|
|
|
/**
|
|
* Sets the NSWindow* associated with this vtkRenderWindow.
|
|
* This class' default behaviour, that is, if you never call
|
|
* SetWindowId()/SetRootWindow() is to create an NSWindow and a
|
|
* vtkCocoaGLView (NSView subclass) which are used together to draw
|
|
* all vtk stuff into. If you already have an NSWindow and NSView and
|
|
* you want this class to use them you must call both SetRootWindow()
|
|
* and SetWindowId(), respectively, early on (before WindowInitialize()
|
|
* is executed). In the case of Java, you should call only SetWindowId().
|
|
*/
|
|
virtual void SetRootWindow(void *);
|
|
|
|
/**
|
|
* Returns the NSWindow* associated with this vtkRenderWindow.
|
|
*/
|
|
virtual void *GetRootWindow();
|
|
|
|
/**
|
|
* Sets the NSView* associated with this vtkRenderWindow.
|
|
* This class' default behaviour, that is, if you never call this
|
|
* SetWindowId()/SetRootWindow() is to create an NSWindow and a
|
|
* vtkCocoaGLView (NSView subclass) which are used together to draw all
|
|
* vtk stuff into. If you already have an NSWindow and NSView and you
|
|
* want this class to use them you must call both SetRootWindow()
|
|
* and SetWindowId(), respectively, early on (before WindowInitialize()
|
|
* is executed). In the case of Java, you should call only SetWindowId().
|
|
*/
|
|
virtual void SetWindowId(void *);
|
|
|
|
/**
|
|
* Returns the NSView* associated with this vtkRenderWindow.
|
|
*/
|
|
virtual void *GetWindowId();
|
|
virtual void *GetGenericWindowId() {return this->GetWindowId();}
|
|
|
|
/**
|
|
* Set the NSView* for the vtkRenderWindow to be parented within. The
|
|
* Position and Size of the RenderWindow will set the rectangle of the
|
|
* NSView that the vtkRenderWindow will create within this parent.
|
|
* If you set the WindowId, then this ParentId will be ignored.
|
|
*/
|
|
virtual void SetParentId(void *nsview);
|
|
|
|
/**
|
|
* Get the parent NSView* for this vtkRenderWindow. This method will
|
|
* return "NULL" if the parent was not set with SetParentId() or
|
|
* SetParentInfo().
|
|
*/
|
|
virtual void *GetParentId();
|
|
virtual void *GetGenericParentId() { return this->GetParentId(); }
|
|
|
|
//@{
|
|
/**
|
|
* Accessors for the pixel format object (Really an NSOpenGLPixelFormat*).
|
|
*/
|
|
void SetPixelFormat(void *pixelFormat);
|
|
void *GetPixelFormat();
|
|
//@}
|
|
|
|
protected:
|
|
vtkCocoaRenderWindow();
|
|
~vtkCocoaRenderWindow();
|
|
|
|
void CreateGLContext();
|
|
|
|
void CreateAWindow();
|
|
void DestroyWindow();
|
|
void DestroyOffScreenWindow();
|
|
|
|
int OffScreenInitialized;
|
|
int OnScreenInitialized;
|
|
|
|
//@{
|
|
/**
|
|
* Accessors for the cocoa manager (Really an NSMutableDictionary*).
|
|
* It manages all Cocoa objects in this C++ class.
|
|
*/
|
|
void SetCocoaManager(void *manager);
|
|
void *GetCocoaManager();
|
|
//@}
|
|
|
|
void SetCocoaServer(void *server); // Really a vtkCocoaServer*
|
|
void *GetCocoaServer();
|
|
|
|
private:
|
|
vtkCocoaRenderWindow(const vtkCocoaRenderWindow&) VTK_DELETE_FUNCTION;
|
|
void operator=(const vtkCocoaRenderWindow&) VTK_DELETE_FUNCTION;
|
|
|
|
private:
|
|
// Important: this class cannot contain Objective-C instance
|
|
// variables for 2 reasons:
|
|
// 1) C++ files include this header
|
|
// 2) because of garbage collection (the GC scanner does not scan objects create by C++'s new)
|
|
// Instead, use the CocoaManager dictionary to keep a collection
|
|
// of what would otherwise be Objective-C instance variables.
|
|
void *CocoaManager; // Really an NSMutableDictionary*
|
|
|
|
int WindowCreated;
|
|
int ViewCreated;
|
|
int CursorHidden;
|
|
|
|
int ForceMakeCurrent;
|
|
char *Capabilities;
|
|
};
|
|
|
|
#endif
|