/*========================================================================= Program: Visualization Toolkit Module: $RCSfile: vtkRenderer.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 vtkRenderer - abstract specification for renderers // .SECTION Description // vtkRenderer provides an abstract specification for renderers. A renderer // is an object that controls the rendering process for objects. Rendering // is the process of converting geometry, a specification for lights, and // a camera view into an image. vtkRenderer also performs coordinate // transformation between world coordinates, view coordinates (the computer // graphics rendering coordinate system), and display coordinates (the // actual screen coordinates on the display device). Certain advanced // rendering features such as two-sided lighting can also be controlled. // .SECTION See Also // vtkRenderWindow vtkActor vtkCamera vtkLight vtkVolume #ifndef __vtkRenderer_h #define __vtkRenderer_h #include "vtkViewport.h" #include "vtkVolumeCollection.h" // Needed for access in inline members #include "vtkActorCollection.h" // Needed for access in inline members class vtkRenderWindow; class vtkVolume; class vtkCuller; class vtkActor; class vtkActor2D; class vtkCamera; class vtkLightCollection; class vtkCullerCollection; class vtkLight; class VTK_RENDERING_EXPORT vtkRenderer : public vtkViewport { public: vtkTypeRevisionMacro(vtkRenderer,vtkViewport); void PrintSelf(ostream& os, vtkIndent indent); // Description: // Create a vtkRenderer with a black background, a white ambient light, // two-sided lighting turned on, a viewport of (0,0,1,1), and backface // culling turned off. static vtkRenderer *New(); // Description: // Add/Remove different types of props to the renderer. // These methods are all synonyms to AddViewProp and RemoveViewProp. // They are here for convenience and backwards compatibility. void AddActor(vtkProp *p); void AddVolume(vtkProp *p); void RemoveActor(vtkProp *p); void RemoveVolume(vtkProp *p); // Description: // Add a light to the list of lights. void AddLight(vtkLight *); // Description: // Remove a light from the list of lights. void RemoveLight(vtkLight *); // Description: // Return the collection of lights. vtkLightCollection *GetLights(); // Description: // Create and add a light to renderer. void CreateLight(void); // Description: // Create a new Light sutible for use with this type of Renderer. // For example, a vtkMesaRenderer should create a vtkMesaLight // in this function. The default is to just call vtkLight::New. virtual vtkLight *MakeLight(); // Description: // Turn on/off two-sided lighting of surfaces. If two-sided lighting is // off, then only the side of the surface facing the light(s) will be lit, // and the other side dark. If two-sided lighting on, both sides of the // surface will be lit. vtkGetMacro(TwoSidedLighting,int); vtkSetMacro(TwoSidedLighting,int); vtkBooleanMacro(TwoSidedLighting,int); // Description: // Turn on/off the automatic repositioning of lights as the camera moves. // If LightFollowCamera is on, lights that are designated as Headlights // or CameraLights will be adjusted to move with this renderer's camera. // If LightFollowCamera is off, the lights will not be adjusted. // // (Note: In previous versions of vtk, this light-tracking // functionality was part of the interactors, not the renderer. For // backwards compatibility, the older, more limited interactor // behavior is enabled by default. To disable this mode, turn the // interactor's LightFollowCamera flag OFF, and leave the renderer's // LightFollowCamera flag ON.) vtkSetMacro(LightFollowCamera,int); vtkGetMacro(LightFollowCamera,int); vtkBooleanMacro(LightFollowCamera,int); // Description: // Turn on/off a flag which disables the automatic light creation capability. // Normally in VTK if no lights are associated with the renderer, then a light // is automatically created. However, in special circumstances this feature is // undesirable, so the following boolean is provided to disable automatic // light creation. (Turn AutomaticLightCreation off if you do not want lights // to be created.) vtkGetMacro(AutomaticLightCreation,int); vtkSetMacro(AutomaticLightCreation,int); vtkBooleanMacro(AutomaticLightCreation,int); // Description: // Ask the lights in the scene that are not in world space // (for instance, Headlights or CameraLights that are attached to the // camera) to update their geometry to match the active camera. virtual int UpdateLightsGeometryToFollowCamera(void); // Description: // Return the collection of volumes. vtkVolumeCollection *GetVolumes(); // Description: // Return any actors in this renderer. vtkActorCollection *GetActors(); // Description: // Specify the camera to use for this renderer. void SetActiveCamera(vtkCamera *); // Description: // Get the current camera. If there is not camera assigned to the // renderer already, a new one is created automatically. // This does *not* reset the camera. vtkCamera *GetActiveCamera(); // Description: // Create a new Camera sutible for use with this type of Renderer. // For example, a vtkMesaRenderer should create a vtkMesaCamera // in this function. The default is to just call vtkCamera::New. virtual vtkCamera *MakeCamera(); // Description: // When this flag is off, the renderer will not erase the background // or the Zbuffer. It is used to have overlapping renderers. // Both the RenderWindow Erase and Render Erase must be on // for the camera to clear the renderer. By default, Erase is on. vtkSetMacro(Erase, int); vtkGetMacro(Erase, int); vtkBooleanMacro(Erase, int); // Description: // Add an culler to the list of cullers. void AddCuller(vtkCuller *); // Description: // Remove an actor from the list of cullers. void RemoveCuller(vtkCuller *); // Description: // Return the collection of cullers. vtkCullerCollection *GetCullers(); // Description: // Set the intensity of ambient lighting. vtkSetVector3Macro(Ambient,double); vtkGetVectorMacro(Ambient,double,3); // Description: // Set/Get the amount of time this renderer is allowed to spend // rendering its scene. This is used by vtkLODActor's. vtkSetMacro(AllocatedRenderTime,double); virtual double GetAllocatedRenderTime(); // Description: // Get the ratio between allocated time and actual render time. // TimeFactor has been taken out of the render process. // It is still computed in case someone finds it useful. // It may be taken away in the future. virtual double GetTimeFactor(); // Description: // Create an image. This is a superclass method which will in turn // call the DeviceRender method of Subclasses of vtkRenderer virtual void Render(); // Description: // Create an image. Subclasses of vtkRenderer must implement this method. virtual void DeviceRender() =0; // Description: // Clear the image to the background color. virtual void Clear() {}; // Description: // Returns the number of visible actors. int VisibleActorCount(); // Description: // Returns the number of visible volumes. int VisibleVolumeCount(); // Description: // Compute the bounding box of all the visible props // Used in ResetCamera() and ResetCameraClippingRange() void ComputeVisiblePropBounds( double bounds[6] ); // Description: // Wrapper-friendly version of ComputeVisiblePropBounds double *ComputeVisiblePropBounds(); // Description: // Reset the camera clipping range based on the bounds of the // visible actors. This ensures that no props are cut off void ResetCameraClippingRange(); // Description: // Reset the camera clipping range based on a bounding box. // This method is called from ResetCameraClippingRange() void ResetCameraClippingRange( double bounds[6] ); void ResetCameraClippingRange( double xmin, double xmax, double ymin, double ymax, double zmin, double zmax); // Description: // Specify tolerance for near clipping plane distance to the camera as a // percentage of the far clipping plane distance. By default this will be // set to 0.01 for 16 bit zbuffers and 0.001 for higher depth z buffers vtkSetClampMacro(NearClippingPlaneTolerance,double,0,0.99); vtkGetMacro(NearClippingPlaneTolerance,double); // Description: // Automatically set up the camera based on the visible actors. // The camera will reposition itself to view the center point of the actors, // and move along its initial view plane normal (i.e., vector defined from // camera position to focal point) so that all of the actors can be seen. void ResetCamera(); // Description: // Automatically set up the camera based on a specified bounding box // (xmin,xmax, ymin,ymax, zmin,zmax). Camera will reposition itself so // that its focal point is the center of the bounding box, and adjust its // distance and position to preserve its initial view plane normal // (i.e., vector defined from camera position to focal point). Note: is // the view plane is parallel to the view up axis, the view up axis will // be reset to one of the three coordinate axes. void ResetCamera(double bounds[6]); // Description: // Alternative version of ResetCamera(bounds[6]); void ResetCamera(double xmin, double xmax, double ymin, double ymax, double zmin, double zmax); // Description: // Specify the rendering window in which to draw. This is automatically set // when the renderer is created by MakeRenderer. The user probably // shouldn't ever need to call this method. void SetRenderWindow(vtkRenderWindow *); vtkRenderWindow *GetRenderWindow() {return this->RenderWindow;}; virtual vtkWindow *GetVTKWindow(); // Description: // Turn on/off using backing store. This may cause the re-rendering // time to be slightly slower when the view changes. But it is // much faster when the image has not changed, such as during an // expose event. vtkSetMacro(BackingStore,int); vtkGetMacro(BackingStore,int); vtkBooleanMacro(BackingStore,int); // Description: // Turn on/off interactive status. An interactive renderer is one that // can receive events from an interactor. Should only be set if // there are multiple renderers in the same section of the viewport. vtkSetMacro(Interactive,int); vtkGetMacro(Interactive,int); vtkBooleanMacro(Interactive,int); // Description: // Set/Get the layer that this renderer belongs to. This is only used if // there are layered renderers. vtkSetMacro(Layer, int); vtkGetMacro(Layer, int); // Description: // Returns a boolean indicating if this renderer is transparent. It is // transparent if it is not in the deepest layer of its render window. int Transparent(); // Description: // Convert world point coordinates to view coordinates. void WorldToView(); // Description: // Convert view point coordinates to world coordinates. void ViewToWorld(); virtual void ViewToWorld(double &wx, double &wy, double &wz); // Description: // Convert world point coordinates to view coordinates. virtual void WorldToView(double &wx, double &wy, double &wz); // Description: // Given a pixel location, return the Z value. The z value is // normalized (0,1) between the front and back clipping planes. double GetZ (int x, int y); // Description: // Return the MTime of the renderer also considering its ivars. unsigned long GetMTime(); // Description: // Get the time required, in seconds, for the last Render call. vtkGetMacro( LastRenderTimeInSeconds, double ); // Description: // Should be used internally only during a render // Get the number of props that were rendered using a // RenderOpaqueGeometry or RenderTranslucentGeometry call. // This is used to know if something is in the frame buffer. vtkGetMacro( NumberOfPropsRendered, int ); // Description: // Return the prop (via a vtkAssemblyPath) that has the highest z value // at the given x, y position in the viewport. Basically, the top most // prop that renders the pixel at selectionX, selectionY will be returned. // If nothing was picked then NULL is returned. This method selects from // the renderers Prop list. vtkAssemblyPath* PickProp(double selectionX, double selectionY); // Description: // Do anything necessary between rendering the left and right viewpoints // in a stereo render. Doesn't do anything except in the derived // vtkIceTRenderer in ParaView. virtual void StereoMidpoint() { return; }; // Description: // Compute the aspect ratio of this renderer for the current tile. When // tiled displays are used the aspect ratio of the renderer for a given // tile may be diferent that the aspect ratio of the renderer when rendered // in it entirity double GetTiledAspectRatio(); protected: vtkRenderer(); ~vtkRenderer(); // internal method for doing a render for picking purposes virtual void PickRender(vtkPropCollection *props); virtual void PickGeometry(); vtkCamera *ActiveCamera; vtkLight *CreatedLight; vtkLightCollection *Lights; vtkCullerCollection *Cullers; vtkActorCollection *Actors; vtkVolumeCollection *Volumes; double Ambient[3]; vtkRenderWindow *RenderWindow; double AllocatedRenderTime; double TimeFactor; int TwoSidedLighting; int AutomaticLightCreation; int BackingStore; unsigned char *BackingImage; int BackingStoreSize[2]; vtkTimeStamp RenderTime; double LastRenderTimeInSeconds; int LightFollowCamera; // Allocate the time for each prop void AllocateTime(); // Internal variables indicating the number of props // that have been or will be rendered in each category. int NumberOfPropsRendered; // A temporary list of props used for culling, and traversal // of all props when rendering vtkProp **PropArray; int PropArrayCount; // A temporary list used for picking vtkAssemblyPath **PathArray; int PathArrayCount; // Indicates if the renderer should receive events from an interactor. // Typically only used in conjunction with transparent renderers. int Interactive; // Shows what layer this renderer belongs to. Only of interested when // there are layered renderers. int Layer; // Holds the result of ComputeVisiblePropBounds so that it is visible from // wrapped languages double ComputedVisiblePropBounds[6]; // Description: // Specifies the minimum distance of the near clipping // plane as a percentage of the far clipping plane distance. Values below // this threshold are clipped to NearClippingPlaneTolerance*range[1]. // Note that values which are too small may cause problems on systems // with low z-buffer resolution. double NearClippingPlaneTolerance; // Description: // When this flag is off, the renderer will not erase the background // or the Zbuffer. It is used to have overlapping renderers. // Both the RenderWindow Erase and Render Erase must be on // for the camera to clear the renderer. By default, Erase is on. int Erase; // Description: // Ask all props to update and draw any opaque and translucent // geometry. This includes both vtkActors and vtkVolumes // Returns the number of props that rendered geometry. virtual int UpdateGeometry(void); // Description: // Ask the active camera to do whatever it needs to do prior to rendering. // Creates a camera if none found active. virtual int UpdateCamera(void); // Description: // Update the geometry of the lights in the scene that are not in world // space (for instance, Headlights or CameraLights that are attached to the // camera). virtual int UpdateLightGeometry(void); // Description: // Ask all lights to load themselves into rendering pipeline. // This method will return the actual number of lights that were on. virtual int UpdateLights(void) {return 0;}; // Description: // Get the current camera and eventually reset it if it gets created // automatically (see GetActiveCamera). // This is mainly used internally. vtkCamera *GetActiveCameraAndEventuallyReset(); private: vtkRenderer(const vtkRenderer&); // Not implemented. void operator=(const vtkRenderer&); // Not implemented. }; inline vtkLightCollection *vtkRenderer::GetLights() { return this->Lights; } // Description: // Get the list of cullers for this renderer. inline vtkCullerCollection *vtkRenderer::GetCullers(){return this->Cullers;} #endif