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.
288 lines
8.9 KiB
C++
288 lines
8.9 KiB
C++
/*=========================================================================
|
|
|
|
Program: Visualization Toolkit
|
|
Module: vtkPainter.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.
|
|
|
|
=========================================================================*/
|
|
|
|
/*
|
|
* Copyright 2004 Sandia Corporation.
|
|
* Under the terms of Contract DE-AC04-94AL85000, there is a non-exclusive
|
|
* license for use of this work by or on behalf of the
|
|
* U.S. Government. Redistribution and use in source and binary forms, with
|
|
* or without modification, are permitted provided that this Notice and any
|
|
* statement of authorship are reproduced on all copies.
|
|
*/
|
|
|
|
/**
|
|
* @class vtkPainter
|
|
* @brief Abstract class for drawing poly data.
|
|
*
|
|
*
|
|
* This defines the interface for a Painter. Painters are helpers used
|
|
* by Mapper to perform the rendering. The mapper sets up a chain of painters
|
|
* and passes the render request to the painter. Every painter may have a
|
|
* delegate painter to which the render request is forwarded. The Painter may
|
|
* modify the request or data before passing it to the delegate painter.
|
|
* All the information to control the rendering must be passed to the painter
|
|
* using the vtkInformation object. A concrete painter may read special keys
|
|
* from the vtkInformation object and affect the rendering.
|
|
*
|
|
* @sa
|
|
* vtkPainterPolyDataMapper
|
|
*/
|
|
|
|
#ifndef vtkPainter_h
|
|
#define vtkPainter_h
|
|
|
|
#include "vtkRenderingOpenGLModule.h" // For export macro
|
|
#include "vtkObject.h"
|
|
#include "vtkWeakPointer.h" // needed for vtkWeakPointer.
|
|
|
|
class vtkAbstractArray;
|
|
class vtkActor;
|
|
class vtkDataObject;
|
|
class vtkDataSet;
|
|
class vtkInformation;
|
|
class vtkInformationIntegerKey;
|
|
class vtkPainterObserver;
|
|
class vtkRenderer;
|
|
class vtkTimerLog;
|
|
class vtkWindow;
|
|
|
|
class VTKRENDERINGOPENGL_EXPORT vtkPainter : public vtkObject
|
|
{
|
|
public:
|
|
vtkTypeMacro(vtkPainter, vtkObject);
|
|
virtual void PrintSelf(ostream &os, vtkIndent indent);
|
|
|
|
/**
|
|
* Keys used to specify control the behaviour of the painter.
|
|
* When on, the painter assumes that the poly data changes infrequently.
|
|
* It is thus more likely to take time and memory to build auxiliary data
|
|
* structures for faster frame rates. Is off by default.
|
|
*/
|
|
static vtkInformationIntegerKey* STATIC_DATA();
|
|
|
|
/**
|
|
* Keys used to specify control the behaviour of the painter.
|
|
* When on, the painter avoids using more memory than it has to. Thus,
|
|
* auxiliary data structures for faster rendering may not be built. Is off
|
|
* by default.
|
|
*/
|
|
static vtkInformationIntegerKey* CONSERVE_MEMORY();
|
|
|
|
/**
|
|
* Keys used to specify control the behaviour of the painter.
|
|
* When off, the painter may make approximations that will make the rendering
|
|
* go faster but may degrade image quality. Is on by default.
|
|
*/
|
|
static vtkInformationIntegerKey* HIGH_QUALITY();
|
|
|
|
//@{
|
|
/**
|
|
* Get/Set the information object associated with this painter.
|
|
*/
|
|
vtkGetObjectMacro(Information, vtkInformation);
|
|
virtual void SetInformation(vtkInformation*);
|
|
//@}
|
|
|
|
//@{
|
|
/**
|
|
* Set/Get the painter to which this painter should propagare its draw calls.
|
|
*/
|
|
vtkGetObjectMacro(DelegatePainter, vtkPainter);
|
|
virtual void SetDelegatePainter(vtkPainter*);
|
|
//@}
|
|
|
|
//@{
|
|
/**
|
|
* Take part in garbage collection.
|
|
*/
|
|
void Register(vtkObjectBase *o) VTK_OVERRIDE;
|
|
void UnRegister(vtkObjectBase *o) VTK_OVERRIDE;
|
|
//@}
|
|
|
|
enum {
|
|
VERTS = 0x1,
|
|
LINES = 0x2,
|
|
POLYS = 0x4,
|
|
STRIPS = 0x8
|
|
};
|
|
|
|
/**
|
|
* Generates rendering primitives of appropriate type(s). Multiple types
|
|
* of primitives can be requested by or-ring the primitive flags.
|
|
* Default implementation calls UpdateDelegatePainter() to update the
|
|
* deletagate painter and then calls RenderInternal().
|
|
* forceCompileOnly is passed to the display list painters.
|
|
*/
|
|
virtual void Render(vtkRenderer* renderer, vtkActor* actor,
|
|
unsigned long typeflags, bool forceCompileOnly);
|
|
|
|
/**
|
|
* Release any graphics resources that are being consumed by this painter.
|
|
* The parameter window could be used to determine which graphic
|
|
* resources to release.
|
|
* The call is propagated to the delegate painter, if any.
|
|
*/
|
|
virtual void ReleaseGraphicsResources(vtkWindow *);
|
|
|
|
//@{
|
|
/**
|
|
* Set/Get the execution progress of a process object.
|
|
*/
|
|
vtkSetClampMacro(Progress,double,0.0,1.0);
|
|
vtkGetMacro(Progress,double);
|
|
//@}
|
|
|
|
/**
|
|
* Get the time required to draw the geometry last time it was rendered.
|
|
* Default implementation adds the current TimeToDraw with that of the
|
|
* delegate painter.
|
|
*/
|
|
virtual double GetTimeToDraw();
|
|
|
|
/**
|
|
* Expand or shrink the estimated bounds of the object based on the
|
|
* geometric transformations performed in the painter. If the painter
|
|
* does not modify the geometry, the bounds are passed through.
|
|
*/
|
|
virtual void UpdateBounds(double bounds[6]);
|
|
|
|
//@{
|
|
/**
|
|
* Set the data object to paint. Currently we only support one data object per
|
|
* painter chain.
|
|
*/
|
|
void SetInput(vtkDataObject*);
|
|
vtkGetObjectMacro(Input, vtkDataObject);
|
|
//@}
|
|
|
|
/**
|
|
* Get the output data object from this painter. The default implementation
|
|
* simply forwards the input data object as the output.
|
|
*/
|
|
virtual vtkDataObject* GetOutput()
|
|
{ return this->Input; }
|
|
|
|
protected:
|
|
vtkPainter();
|
|
~vtkPainter();
|
|
|
|
/**
|
|
* Take part in garbage collection.
|
|
*/
|
|
void ReportReferences(vtkGarbageCollector *collector) VTK_OVERRIDE;
|
|
|
|
/**
|
|
* Updates the delegate painter. This method is called just before
|
|
* the Render call is passed on to the DelegatePainter.
|
|
* Hence, it gets called only if the DelegatePainter is set.
|
|
* Internally calls PassInformation with argument as
|
|
* this->DelegatePainter. Subclasses must not override this method,
|
|
* instead override PassInformation().
|
|
*/
|
|
void UpdateDelegatePainter();
|
|
|
|
/**
|
|
* Pass on the information and data (output) from the
|
|
* this to the argument painter. The method passes
|
|
* the information only if it has changed.
|
|
*/
|
|
virtual void PassInformation(vtkPainter* toPainter);
|
|
|
|
/**
|
|
* Some subclasses may need to do some preprocessing
|
|
* before the actual rendering can be done eg. build efficient
|
|
* representation for the data etc. This should be done here.
|
|
* This method get called after the ProcessInformation()
|
|
* but before RenderInternal().
|
|
*/
|
|
virtual void PrepareForRendering(vtkRenderer*, vtkActor*) { }
|
|
|
|
/**
|
|
* Performs the actual rendering. Subclasses may override this method.
|
|
* default implementation merely call a Render on the DelegatePainter,
|
|
* if any. When RenderInternal() is called, it is assured that the
|
|
* DelegatePainter is in sync with this painter i.e. UpdateDelegatePainter()
|
|
* has been called.
|
|
*/
|
|
virtual void RenderInternal(vtkRenderer* renderer, vtkActor* actor,
|
|
unsigned long typeflags, bool forceCompileOnly);
|
|
|
|
/**
|
|
* Called when the delegate painter reports its progress.
|
|
* Default implementation reports the delegate's progress
|
|
* as its own.
|
|
*/
|
|
virtual void UpdateDelegateProgress(vtkPainter* delegate, double amount);
|
|
|
|
/**
|
|
* Called before RenderInternal() if the Information has been changed
|
|
* since the last time this method was called.
|
|
*/
|
|
virtual void ProcessInformation(vtkInformation*) { }
|
|
|
|
/**
|
|
* Adds a progress event observer to toObserve. This provides a means
|
|
* for the subclasses to observe progress events from painters.
|
|
*/
|
|
virtual void ObserverPainterProgress(vtkPainter* toObserve);
|
|
|
|
/**
|
|
* Update the progress of the process object. Then set the Progress ivar to
|
|
* amount. The parameter amount should range between (0,1).
|
|
* Raises vtkCommand::ProgressEvent.
|
|
*/
|
|
void UpdateProgress(double amount);
|
|
|
|
//@{
|
|
/**
|
|
* Helper method to get input array to process.
|
|
*/
|
|
vtkAbstractArray* GetInputArrayToProcess(int fieldAssociation,
|
|
int fieldAttributeType,
|
|
vtkDataSet* ds,
|
|
bool *use_cell_data=0);
|
|
vtkAbstractArray* GetInputArrayToProcess(int fieldAssociation,
|
|
const char* name, vtkDataSet* dsl,
|
|
bool *use_cell_data=0);
|
|
//@}
|
|
|
|
// Time of most recent call to ProcessInformation().
|
|
vtkTimeStamp InformationProcessTime;
|
|
friend class vtkPainterObserver;
|
|
vtkPainterObserver* Observer;
|
|
|
|
vtkInformation* Information;
|
|
vtkPainter* DelegatePainter;
|
|
|
|
double Progress;
|
|
double ProgressOffset;
|
|
double ProgressScaleFactor;
|
|
|
|
double TimeToDraw;
|
|
vtkTimerLog* Timer;
|
|
|
|
|
|
vtkWeakPointer<vtkWindow> LastWindow; // Window used for previous render.
|
|
// This is not reference counted.
|
|
private:
|
|
vtkPainter(const vtkPainter &) VTK_DELETE_FUNCTION;
|
|
void operator=(const vtkPainter &) VTK_DELETE_FUNCTION;
|
|
|
|
vtkDataObject* Input;
|
|
|
|
};
|
|
|
|
#endif //vtkPainter_h
|