Cloned library of VTK-5.0.0 with extra build files for internal package management.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

525 lines
19 KiB

/*=========================================================================
Program: Visualization Toolkit
Module: $RCSfile: vtkRenderWindow.h,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.
=========================================================================*/
// .NAME vtkRenderWindow - create a window for renderers to draw into
// .SECTION Description
// vtkRenderWindow is an abstract object to specify the behavior of a
// rendering window. A rendering window is a window in a graphical user
// interface where renderers draw their images. Methods are provided to
// synchronize the rendering process, set window size, and control double
// buffering. The window also allows rendering in stereo. The interlaced
// render stereo type is for output to a VRex stereo projector. All of the
// odd horizontal lines are from the left eye, and the even lines are from
// the right eye. The user has to make the render window aligned with the
// VRex projector, or the eye will be swapped.
// .SECTION Caveats
// In VTK versions 4 and later, the vtkWindowToImageFilter class is
// part of the canonical way to output an image of a window to a file
// (replacing the obsolete SaveImageAsPPM method for vtkRenderWindows
// that existed in 3.2 and earlier). Connect one of these filters to
// the output of the window, and filter's output to a writer such as
// vtkPNGWriter.
// .SECTION see also
// vtkRenderer vtkRenderWindowInteractor vtkWindowToImageFilter
#ifndef __vtkRenderWindow_h
#define __vtkRenderWindow_h
#include "vtkWindow.h"
class vtkFloatArray;
class vtkRenderWindowInteractor;
class vtkRenderer;
class vtkRendererCollection;
class vtkUnsignedCharArray;
// lets define the different types of stereo
#define VTK_STEREO_CRYSTAL_EYES 1
#define VTK_STEREO_RED_BLUE 2
#define VTK_STEREO_INTERLACED 3
#define VTK_STEREO_LEFT 4
#define VTK_STEREO_RIGHT 5
#define VTK_STEREO_DRESDEN 6
#define VTK_STEREO_ANAGLYPH 7
#define VTK_CURSOR_DEFAULT 0
#define VTK_CURSOR_ARROW 1
#define VTK_CURSOR_SIZENE 2
#define VTK_CURSOR_SIZENW 3
#define VTK_CURSOR_SIZESW 4
#define VTK_CURSOR_SIZESE 5
#define VTK_CURSOR_SIZENS 6
#define VTK_CURSOR_SIZEWE 7
#define VTK_CURSOR_SIZEALL 8
#define VTK_CURSOR_HAND 9
class VTK_RENDERING_EXPORT vtkRenderWindow : public vtkWindow
{
public:
vtkTypeRevisionMacro(vtkRenderWindow,vtkWindow);
void PrintSelf(ostream& os, vtkIndent indent);
// Description:
// Construct an instance of vtkRenderWindow with its screen size
// set to 300x300, borders turned on, positioned at (0,0), double
// buffering turned on.
static vtkRenderWindow *New();
// Description:
// Add a renderer to the list of renderers.
virtual void AddRenderer(vtkRenderer *);
// Description:
// Remove a renderer from the list of renderers.
void RemoveRenderer(vtkRenderer *);
// Description:
// Query if a renderer is in the list of renderers.
int HasRenderer(vtkRenderer *);
// Description:
// What rendering library has the user requested
static const char *GetRenderLibrary();
// Description:
// Return the collection of renderers in the render window.
vtkRendererCollection *GetRenderers() {return this->Renderers;};
// Description:
// Ask each renderer owned by this RenderWindow to render its image and
// synchronize this process.
virtual void Render();
// Description:
// Initialize the rendering process.
virtual void Start() = 0;
// Description:
// Finalize the rendering process.
virtual void Finalize() = 0;
// Description:
// A termination method performed at the end of the rendering process
// to do things like swapping buffers (if necessary) or similar actions.
virtual void Frame() = 0;
// Description:
// Performed at the end of the rendering process to generate image.
// This is typically done right before swapping buffers.
virtual void CopyResultFrame();
// Description:
// Create an interactor to control renderers in this window. We need
// to know what type of interactor to create, because we might be in
// X Windows or MS Windows.
virtual vtkRenderWindowInteractor *MakeRenderWindowInteractor();
// Description:
// 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() = 0;
virtual void ShowCursor() = 0;
virtual void SetCursorPosition(int , int ) {};
// Description:
// Change the shape of the cursor
vtkSetMacro(CurrentCursor,int);
vtkGetMacro(CurrentCursor,int);
// Description:
// Turn on/off rendering full screen window size.
virtual void SetFullScreen(int) = 0;
vtkGetMacro(FullScreen,int);
vtkBooleanMacro(FullScreen,int);
// Description:
// Turn on/off window manager borders. Typically, you shouldn't turn the
// borders off, because that bypasses the window manager and can cause
// undesirable behavior.
vtkSetMacro(Borders,int);
vtkGetMacro(Borders,int);
vtkBooleanMacro(Borders,int);
// Description:
// Prescribe that the window be created in a stereo-capable mode. This
// method must be called before the window is realized. Default is off.
vtkGetMacro(StereoCapableWindow,int);
vtkBooleanMacro(StereoCapableWindow,int);
virtual void SetStereoCapableWindow(int capable);
// Description:
// Turn on/off stereo rendering.
vtkGetMacro(StereoRender,int);
void SetStereoRender(int stereo);
vtkBooleanMacro(StereoRender,int);
// Description:
// Turn on/off the use of alpha bitplanes.
vtkSetMacro(AlphaBitPlanes, int);
vtkGetMacro(AlphaBitPlanes, int);
vtkBooleanMacro(AlphaBitPlanes, int);
// Description:
// Turn on/off point smoothing. Default is off.
// This must be applied before the first Render.
vtkSetMacro(PointSmoothing,int);
vtkGetMacro(PointSmoothing,int);
vtkBooleanMacro(PointSmoothing,int);
// Description:
// Turn on/off line smoothing. Default is off.
// This must be applied before the first Render.
vtkSetMacro(LineSmoothing,int);
vtkGetMacro(LineSmoothing,int);
vtkBooleanMacro(LineSmoothing,int);
// Description:
// Turn on/off polygon smoothing. Default is off.
// This must be applied before the first Render.
vtkSetMacro(PolygonSmoothing,int);
vtkGetMacro(PolygonSmoothing,int);
vtkBooleanMacro(PolygonSmoothing,int);
// Description:
// Set/Get what type of stereo rendering to use. CrystalEyes
// mode uses frame-sequential capabilities available in OpenGL
// to drive LCD shutter glasses and stereo projectors. RedBlue
// mode is a simple type of stereo for use with red-blue glasses.
// Anaglyph mode is a superset of RedBlue mode, but the color
// output channels can be configured using the AnaglyphColorMask
// and the color of the original image can be (somewhat) maintained
// using AnaglyphColorSaturation; the default colors for Anaglyph
// mode is red-cyan. Interlaced stereo mode produces a composite
// image where horizontal lines alternate between left and right
// views. StereoLeft and StereoRight modes choose one or the other
// stereo view. Dresden mode is yet another stereoscopic
// interleaving.
vtkGetMacro(StereoType,int);
vtkSetMacro(StereoType,int);
void SetStereoTypeToCrystalEyes()
{this->SetStereoType(VTK_STEREO_CRYSTAL_EYES);};
void SetStereoTypeToRedBlue()
{this->SetStereoType(VTK_STEREO_RED_BLUE);};
void SetStereoTypeToInterlaced()
{this->SetStereoType(VTK_STEREO_INTERLACED);};
void SetStereoTypeToLeft()
{this->SetStereoType(VTK_STEREO_LEFT);};
void SetStereoTypeToRight()
{this->SetStereoType(VTK_STEREO_RIGHT);};
void SetStereoTypeToDresden()
{this->SetStereoType(VTK_STEREO_DRESDEN);};
void SetStereoTypeToAnaglyph()
{this->SetStereoType(VTK_STEREO_ANAGLYPH);};
char *GetStereoTypeAsString();
// Description:
// Update the system, if needed, due to stereo rendering. For some stereo
// methods, subclasses might need to switch some hardware settings here.
virtual void StereoUpdate();
// Description:
// Intermediate method performs operations required between the rendering
// of the left and right eye.
virtual void StereoMidpoint();
// Description:
// Handles work required once both views have been rendered when using
// stereo rendering.
virtual void StereoRenderComplete();
//Description:
// Set/get the anaglyph color saturation factor. This number ranges from
// 0.0 to 1.0: 0.0 means that no color from the original object is
// maintained, 1.0 means all of the color is maintained. The default
// value is 0.65. Too much saturation can produce uncomfortable 3D
// viewing because anaglyphs also use color to encode 3D.
vtkSetClampMacro(AnaglyphColorSaturation,float, 0.0, 1.0);
vtkGetMacro(AnaglyphColorSaturation,float);
//Description:
// Set/get the anaglyph color mask values. These two numbers are bits
// mask that control which color channels of the original stereo
// images are used to produce the final anaglyph image. The first
// value is the color mask for the left view, the second the mask
// for the right view. If a bit in the mask is on for a particular
// color for a view, that color is passed on to the final view; if
// it is not set, that channel for that view is ignored.
// The bits are arranged as r, g, and b, so r = 4, g = 2, and b = 1.
// By default, the first value (the left view) is set to 4, and the
// second value is set to 3. That means that the red output channel
// comes from the left view, and the green and blue values come from
// the right view.
vtkSetVector2Macro(AnaglyphColorMask,int);
vtkGetVectorMacro(AnaglyphColorMask,int,2);
// Description:
// Remap the rendering window. This probably only works on UNIX right now.
// It is useful for changing properties that can't normally be changed
// once the window is up.
virtual void WindowRemap() = 0;
// Description:
// Turn on/off buffer swapping between images.
vtkSetMacro(SwapBuffers,int);
vtkGetMacro(SwapBuffers,int);
vtkBooleanMacro(SwapBuffers,int);
// Description:
// Set/Get the pixel data of an image, transmitted as RGBRGBRGB. The
// front argument indicates if the front buffer should be used or the back
// buffer. It is the caller's responsibility to delete the resulting
// array. It is very important to realize that the memory in this array
// is organized from the bottom of the window to the top. The origin
// of the screen is in the lower left corner. The y axis increases as
// you go up the screen. So the storage of pixels is from left to right
// and from bottom to top.
virtual int SetPixelData(int, int, int, int, unsigned char *,int) = 0;
virtual int SetPixelData(int, int, int, int, vtkUnsignedCharArray*,
int ) = 0;
// Description:
// Same as Get/SetPixelData except that the image also contains an alpha
// component. The image is transmitted as RGBARGBARGBA... each of which is a
// float value. The "blend" parameter controls whether the SetRGBAPixelData
// method blends the data with the previous contents of the frame buffer
// or completely replaces the frame buffer data.
virtual float *GetRGBAPixelData(int ,int ,int ,int ,int ) = 0;
virtual int GetRGBAPixelData(int, int, int, int, int, vtkFloatArray* ) = 0;
virtual int SetRGBAPixelData(int ,int ,int ,int ,float *,int,
int blend=0) = 0;
virtual int SetRGBAPixelData(int, int, int, int, vtkFloatArray*,
int, int blend=0) = 0;
virtual void ReleaseRGBAPixelData(float *data)=0;
virtual unsigned char *GetRGBACharPixelData(int ,int ,int ,int ,int ) = 0;
virtual int GetRGBACharPixelData(int ,int, int, int, int,
vtkUnsignedCharArray*) = 0;
virtual int SetRGBACharPixelData(int ,int ,int ,int ,unsigned char *, int,
int blend=0) = 0;
virtual int SetRGBACharPixelData(int, int, int, int,
vtkUnsignedCharArray *,
int, int blend=0) = 0;
// Description:
// Set/Get the zbuffer data from the frame buffer.
virtual float *GetZbufferData(int, int, int, int ) = 0;
virtual int GetZbufferData( int, int, int, int, float*) = 0;
virtual int GetZbufferData( int, int, int, int, vtkFloatArray*) = 0;
virtual int SetZbufferData(int, int, int, int, float *) = 0;
virtual int SetZbufferData( int, int, int, int, vtkFloatArray * ) = 0;
// Description:
// Set the number of frames for doing antialiasing. The default is
// zero. Typically five or six will yield reasonable results without
// taking too long.
vtkGetMacro(AAFrames,int);
vtkSetMacro(AAFrames,int);
// Description:
// Set the number of frames for doing focal depth. The default is zero.
// Depending on how your scene is organized you can get away with as
// few as four frames for focal depth or you might need thirty.
// One thing to note is that if you are using focal depth frames,
// then you will not need many (if any) frames for antialiasing.
vtkGetMacro(FDFrames,int);
vtkSetMacro(FDFrames,int);
// Description:
// Set the number of sub frames for doing motion blur. The default is zero.
// Once this is set greater than one, you will no longer see a new frame
// for every Render(). If you set this to five, you will need to do
// five Render() invocations before seeing the result. This isn't
// very impressive unless something is changing between the Renders.
// Changing this value may reset the current subframe count.
vtkGetMacro(SubFrames,int);
virtual void SetSubFrames(int subFrames);
// Description:
// This flag is set if the window hasn't rendered since it was created
vtkGetMacro(NeverRendered,int);
// Description:
// This is a flag that can be set to interrupt a rendering that is in
// progress.
vtkGetMacro(AbortRender,int);
vtkSetMacro(AbortRender,int);
vtkGetMacro(InAbortCheck,int);
vtkSetMacro(InAbortCheck,int);
virtual int CheckAbortStatus();
vtkGetMacro(IsPicking,int);
vtkSetMacro(IsPicking,int);
vtkBooleanMacro(IsPicking,int);
// Description:
// Check to see if a mouse button has been pressed. All other events
// are ignored by this method. Ideally, you want to abort the render
// on any event which causes the DesiredUpdateRate to switch from
// a high-quality rate to a more interactive rate.
virtual int GetEventPending() = 0;
// Description:
// Are we rendering at the moment
virtual int CheckInRenderStatus() { return this->InRender; }
// Description:
// Clear status (after an exception was thrown for example)
virtual void ClearInRenderStatus() { this->InRender = 0; }
// Description:
// Set/Get the desired update rate. This is used with
// the vtkLODActor class. When using level of detail actors you
// need to specify what update rate you require. The LODActors then
// will pick the correct resolution to meet your desired update rate
// in frames per second. A value of zero indicates that they can use
// all the time they want to.
virtual void SetDesiredUpdateRate(double);
vtkGetMacro(DesiredUpdateRate,double);
// Description:
// Get the number of layers for renderers. Each renderer should have
// its layer set individually. Some algorithms iterate through all layers,
// so it is not wise to set the number of layers to be exorbitantly large
// (say bigger than 100).
vtkGetMacro(NumberOfLayers, int);
vtkSetClampMacro(NumberOfLayers, int, 1, VTK_LARGE_INTEGER);
// Description:
// Get the interactor associated with this render window
vtkGetObjectMacro(Interactor,vtkRenderWindowInteractor);
// Description:
// Set the interactor to the render window
void SetInteractor(vtkRenderWindowInteractor *);
// Description:
// This Method detects loops of RenderWindow<->Interactor,
// so objects are freed properly.
virtual void UnRegister(vtkObjectBase *o);
// Description:
// Dummy stubs for vtkWindow API.
virtual void SetDisplayId(void *) = 0;
virtual void SetWindowId(void *) = 0;
virtual void SetNextWindowId(void *) = 0;
virtual void SetParentId(void *) = 0;
virtual void *GetGenericDisplayId() = 0;
virtual void *GetGenericWindowId() = 0;
virtual void *GetGenericParentId() = 0;
virtual void *GetGenericContext() = 0;
virtual void *GetGenericDrawable() = 0;
virtual void SetWindowInfo(char *) = 0;
virtual void SetNextWindowInfo(char *) = 0;
virtual void SetParentInfo(char *) = 0;
// Description:
// Make this the current window.
virtual void MakeCurrent() = 0;
// Description:
// 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() {};
// Description:
// Get report of capabilities for the render window
virtual const char *ReportCapabilities() { return "Not Implemented";};
// Description:
// Does this render window support OpenGL? 0-false, 1-true
virtual int SupportsOpenGL() { return 0;};
// Description:
// Is this render window using hardware acceleration? 0-false, 1-true
virtual int IsDirect() { return 0;};
// Description:
// This method should be defined by the subclass. How many bits of
// precision are there in the zbuffer?
virtual int GetDepthBufferSize() = 0;
protected:
vtkRenderWindow();
~vtkRenderWindow();
virtual void DoStereoRender();
virtual void DoFDRender();
virtual void DoAARender();
vtkRendererCollection *Renderers;
int Borders;
int FullScreen;
int OldScreen[5];
int PointSmoothing;
int LineSmoothing;
int PolygonSmoothing;
int StereoRender;
int StereoType;
int StereoStatus; // used for keeping track of what's going on
int StereoCapableWindow;
int AlphaBitPlanes;
vtkRenderWindowInteractor *Interactor;
unsigned char* StereoBuffer; // used for red blue stereo
float *AccumulationBuffer; // used for many techniques
unsigned int AccumulationBufferSize;
int AAFrames;
int FDFrames;
int SubFrames; // number of sub frames
int CurrentSubFrame; // what one are we on
unsigned char *ResultFrame; // used for any non immediate rendering
int SwapBuffers;
double DesiredUpdateRate;
int AbortRender;
int InAbortCheck;
int InRender;
int NeverRendered;
int NumberOfLayers;
int CurrentCursor;
int IsPicking;
float AnaglyphColorSaturation;
int AnaglyphColorMask[2];
private:
vtkRenderWindow(const vtkRenderWindow&); // Not implemented.
void operator=(const vtkRenderWindow&); // Not implemented.
};
// Description:
// Return the stereo type as a character string.
inline char *vtkRenderWindow::GetStereoTypeAsString(void)
{
switch ( this->StereoType )
{
case VTK_STEREO_CRYSTAL_EYES:
return (char *)"CrystalEyes";
case VTK_STEREO_RED_BLUE:
return (char *)"RedBlue";
case VTK_STEREO_LEFT:
return (char *)"Left";
case VTK_STEREO_RIGHT:
return (char *)"Right";
case VTK_STEREO_DRESDEN:
return (char *)"DresdenDisplay";
case VTK_STEREO_ANAGLYPH:
return (char *)"Anaglyph";
default:
return (char *)"";
}
}
#endif