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.

173 lines
5.4 KiB
C++

/*=========================================================================
Program: Visualization Toolkit
Module: vtkLODActor.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 vtkLODActor
* @brief an actor that supports multiple levels of detail
*
* vtkLODActor is an actor that stores multiple levels of detail (LOD) and
* can automatically switch between them. It selects which level of detail to
* use based on how much time it has been allocated to render. Currently a
* very simple method of TotalTime/NumberOfActors is used. (In the future
* this should be modified to dynamically allocate the rendering time between
* different actors based on their needs.)
*
* There are three levels of detail by default. The top level is just the
* normal data. The lowest level of detail is a simple bounding box outline
* of the actor. The middle level of detail is a point cloud of a fixed
* number of points that have been randomly sampled from the mapper's input
* data. Point attributes are copied over to the point cloud. These two
* lower levels of detail are accomplished by creating instances of a
* vtkOutlineFilter (low-res) and vtkMaskPoints (medium-res). Additional
* levels of detail can be add using the AddLODMapper() method.
*
* To control the frame rate, you typically set the vtkRenderWindowInteractor
* DesiredUpdateRate and StillUpdateRate. This then will cause vtkLODActor
* to adjust its LOD to fulfill the requested update rate.
*
* For greater control on levels of detail, see also vtkLODProp3D. That
* class allows arbitrary definition of each LOD.
*
* @warning
* If you provide your own mappers, you are responsible for setting its
* ivars correctly, such as ScalarRange, LookupTable, and so on.
*
* @warning
* On some systems the point cloud rendering (the default, medium level of
* detail) can result in points so small that they can hardly be seen. In
* this case, use the GetProperty()->SetPointSize() method to increase the
* rendered size of the points.
*
* @sa
* vtkActor vtkRenderer vtkLODProp3D
*/
#ifndef vtkLODActor_h
#define vtkLODActor_h
#include "vtkActor.h"
#include "vtkRenderingLODModule.h" // For export macro
class vtkMapper;
class vtkMapperCollection;
class vtkPolyDataAlgorithm;
class vtkPolyDataMapper;
class vtkRenderer;
class vtkViewport;
class vtkWindow;
class VTKRENDERINGLOD_EXPORT vtkLODActor : public vtkActor
{
public:
vtkTypeMacro(vtkLODActor, vtkActor);
void PrintSelf(ostream& os, vtkIndent indent) override;
/**
* Creates a vtkLODActor with the following defaults: origin(0,0,0)
* position=(0,0,0) scale=(1,1,1) visibility=1 pickable=1 dragable=1
* orientation=(0,0,0). NumberOfCloudPoints is set to 150.
*/
static vtkLODActor* New();
/**
* This causes the actor to be rendered.
* It, in turn, will render the actor's property and then mapper.
*/
void Render(vtkRenderer*, vtkMapper*) override;
/**
* This method is used internally by the rendering process. We override
* the superclass method to properly set the estimated render time.
*/
int RenderOpaqueGeometry(vtkViewport* viewport) override;
/**
* Release any graphics resources that are being consumed by this actor.
* The parameter window could be used to determine which graphic
* resources to release.
*/
void ReleaseGraphicsResources(vtkWindow*) override;
/**
* Add another level of detail.
* They do not have to be in any order of complexity.
*/
void AddLODMapper(vtkMapper* mapper);
//@{
/**
* You may plug in your own filters to decimate/subsample the input.
* The default is to use a vtkOutlineFilter (low-res) and vtkMaskPoints
* (medium-res).
*/
virtual void SetLowResFilter(vtkPolyDataAlgorithm*);
virtual void SetMediumResFilter(vtkPolyDataAlgorithm*);
vtkGetObjectMacro(LowResFilter, vtkPolyDataAlgorithm);
vtkGetObjectMacro(MediumResFilter, vtkPolyDataAlgorithm);
//@}
//@{
/**
* Set/Get the number of random points for the point cloud.
*/
vtkGetMacro(NumberOfCloudPoints, int);
vtkSetMacro(NumberOfCloudPoints, int);
//@}
//@{
/**
* All the mappers for different LODs are stored here.
* The order is not important.
*/
vtkGetObjectMacro(LODMappers, vtkMapperCollection);
//@}
/**
* When this objects gets modified, this method also modifies the object.
*/
void Modified() override;
/**
* Shallow copy of an LOD actor. Overloads the virtual vtkProp method.
*/
void ShallowCopy(vtkProp* prop) override;
protected:
vtkLODActor();
~vtkLODActor() override;
vtkActor* Device;
vtkMapperCollection* LODMappers;
// We can create our own LOD filters. The default is to use a
//
vtkPolyDataAlgorithm* LowResFilter;
vtkPolyDataAlgorithm* MediumResFilter;
vtkPolyDataMapper* LowMapper;
vtkPolyDataMapper* MediumMapper;
vtkTimeStamp BuildTime;
int NumberOfCloudPoints;
virtual void CreateOwnLODs();
virtual void UpdateOwnLODs();
virtual void DeleteOwnLODs();
private:
vtkLODActor(const vtkLODActor&) = delete;
void operator=(const vtkLODActor&) = delete;
};
#endif