/*========================================================================= Program: Visualization Toolkit Module: $RCSfile: vtkMapper.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 vtkMapper - abstract class specifies interface to map data to graphics primitives // .SECTION Description // vtkMapper is an abstract class to specify interface between data and // graphics primitives. Subclasses of vtkMapper map data through a // lookuptable and control the creation of rendering primitives that // interface to the graphics library. The mapping can be controlled by // supplying a lookup table and specifying a scalar range to map data // through. // // There are several important control mechanisms affecting the behavior of // this object. The ScalarVisibility flag controls whether scalar data (if // any) controls the color of the associated actor(s) that refer to the // mapper. The ScalarMode ivar is used to determine whether scalar point data // or cell data is used to color the object. By default, point data scalars // are used unless there are none, in which cell scalars are used. Or you can // explicitly control whether to use point or cell scalar data. Finally, the // mapping of scalars through the lookup table varies depending on the // setting of the ColorMode flag. See the documentation for the appropriate // methods for an explanation. // // Another important feature of this class is whether to use immediate mode // rendering (ImmediateModeRenderingOn) or display list rendering // (ImmediateModeRenderingOff). If display lists are used, a data structure // is constructed (generally in the rendering library) which can then be // rapidly traversed and rendered by the rendering library. The disadvantage // of display lists is that they require additionally memory which may affect // the performance of the system. // // Another important feature of the mapper is the ability to shift the // z-buffer to resolve coincident topology. For example, if you'd like to // draw a mesh with some edges a different color, and the edges lie on the // mesh, this feature can be useful to get nice looking lines. (See the // ResolveCoincidentTopology-related methods.) // .SECTION See Also // vtkDataSetMapper vtkPolyDataMapper #ifndef __vtkMapper_h #define __vtkMapper_h #include "vtkAbstractMapper3D.h" #include "vtkScalarsToColors.h" // For VTK_COLOR_MODE_DEFAULT and _MAP_SCALARS #define VTK_RESOLVE_OFF 0 #define VTK_RESOLVE_POLYGON_OFFSET 1 #define VTK_RESOLVE_SHIFT_ZBUFFER 2 #define VTK_GET_ARRAY_BY_ID 0 #define VTK_GET_ARRAY_BY_NAME 1 #define VTK_MATERIALMODE_DEFAULT 0 #define VTK_MATERIALMODE_AMBIENT 1 #define VTK_MATERIALMODE_DIFFUSE 2 #define VTK_MATERIALMODE_AMBIENT_AND_DIFFUSE 3 class vtkWindow; class vtkRenderer; class vtkActor; class vtkDataSet; class vtkFloatArray; class vtkImageData; class VTK_RENDERING_EXPORT vtkMapper : public vtkAbstractMapper3D { public: vtkTypeRevisionMacro(vtkMapper,vtkAbstractMapper3D); void PrintSelf(ostream& os, vtkIndent indent); // Description: // Make a shallow copy of this mapper. void ShallowCopy(vtkAbstractMapper *m); // Description: // Overload standard modified time function. If lookup table is modified, // then this object is modified as well. unsigned long GetMTime(); // Description: // Method initiates the mapping process. Generally sent by the actor // as each frame is rendered. virtual void Render(vtkRenderer *ren, vtkActor *a) = 0; // Description: // Release any graphics resources that are being consumed by this mapper. // The parameter window could be used to determine which graphic // resources to release. virtual void ReleaseGraphicsResources(vtkWindow *) {}; // Description: // Specify a lookup table for the mapper to use. void SetLookupTable(vtkScalarsToColors *lut); vtkScalarsToColors *GetLookupTable(); // Description: // Create default lookup table. Generally used to create one when none // is available with the scalar data. virtual void CreateDefaultLookupTable(); // Description: // Turn on/off flag to control whether scalar data is used to color objects. vtkSetMacro(ScalarVisibility,int); vtkGetMacro(ScalarVisibility,int); vtkBooleanMacro(ScalarVisibility,int); // Description: // Turn on/off flag to control whether the mapper's data is static. Static data // means that the mapper does not propagate updates down the pipeline, greatly // decreasing the time it takes to update many mappers. This should only be // used if the data never changes. vtkSetMacro(Static,int); vtkGetMacro(Static,int); vtkBooleanMacro(Static,int); // Description: // Control how the scalar data is mapped to colors. By default // (ColorModeToDefault), unsigned char scalars are treated as colors, and // NOT mapped through the lookup table, while everything else is. Setting // ColorModeToMapScalars means that all scalar data will be mapped through // the lookup table. (Note that for multi-component scalars, the // particular component to use for mapping can be specified using the // SelectColorArray() method.) vtkSetMacro(ColorMode,int); vtkGetMacro(ColorMode,int); void SetColorModeToDefault() {this->SetColorMode(VTK_COLOR_MODE_DEFAULT);}; void SetColorModeToMapScalars() {this->SetColorMode(VTK_COLOR_MODE_MAP_SCALARS);}; // Description: // Return the method of coloring scalar data. const char *GetColorModeAsString(); // Description: // By default, vertex color is used to map colors to a surface. // Colors are interpolated after being mapped. // This option avoids color interpolation by using a one dimensional // texture map for the colors. vtkSetMacro(InterpolateScalarsBeforeMapping,int); vtkGetMacro(InterpolateScalarsBeforeMapping,int); vtkBooleanMacro(InterpolateScalarsBeforeMapping,int); // Description: // Control whether the mapper sets the lookuptable range based on its // own ScalarRange, or whether it will use the LookupTable ScalarRange // regardless of it's own setting. By default the Mapper is allowed to set // the LookupTable range, but users who are sharing LookupTables between // mappers/actors will probably wish to force the mapper to use the // LookupTable unchanged. vtkSetMacro(UseLookupTableScalarRange,int); vtkGetMacro(UseLookupTableScalarRange,int); vtkBooleanMacro(UseLookupTableScalarRange,int); // Description: // Specify range in terms of scalar minimum and maximum (smin,smax). These // values are used to map scalars into lookup table. Has no effect when // UseLookupTableScalarRange is true. vtkSetVector2Macro(ScalarRange,double); vtkGetVectorMacro(ScalarRange,double,2); // Description: // Turn on/off flag to control whether data is rendered using // immediate mode or note. Immediate mode rendering // tends to be slower but it can handle larger datasets. // The default value is immediate mode off. If you are // having problems rendering a large dataset you might // want to consider using immediate more rendering. vtkSetMacro(ImmediateModeRendering,int); vtkGetMacro(ImmediateModeRendering,int); vtkBooleanMacro(ImmediateModeRendering,int); // Description: // Turn on/off flag to control whether data is rendered using // immediate mode or note. Immediate mode rendering // tends to be slower but it can handle larger datasets. // The default value is immediate mode off. If you are // having problems rendering a large dataset you might // want to consider using immediate more rendering. static void SetGlobalImmediateModeRendering(int val); static void GlobalImmediateModeRenderingOn() {vtkMapper::SetGlobalImmediateModeRendering(1);}; static void GlobalImmediateModeRenderingOff() {vtkMapper::SetGlobalImmediateModeRendering(0);}; static int GetGlobalImmediateModeRendering(); // Description: // Control how the filter works with scalar point data and cell attribute // data. By default (ScalarModeToDefault), the filter will use point data, // and if no point data is available, then cell data is used. Alternatively // you can explicitly set the filter to use point data // (ScalarModeToUsePointData) or cell data (ScalarModeToUseCellData). // You can also choose to get the scalars from an array in point field // data (ScalarModeToUsePointFieldData) or cell field data // (ScalarModeToUseCellFieldData). If scalars are coming from a field // data array, you must call SelectColorArray before you call // GetColors. // When ScalarMode is set to use Field Data (ScalarModeToFieldData), you // must call SelectColorArray to choose the field data array to be used to // color cells. In this mode, if the poly data has triangle strips, // the field data is treated as the celldata for each mini-cell formed by // a triangle in the strip rather than the entire strip. vtkSetMacro(ScalarMode,int); vtkGetMacro(ScalarMode,int); void SetScalarModeToDefault() { this->SetScalarMode(VTK_SCALAR_MODE_DEFAULT);}; void SetScalarModeToUsePointData() { this->SetScalarMode(VTK_SCALAR_MODE_USE_POINT_DATA);}; void SetScalarModeToUseCellData() { this->SetScalarMode(VTK_SCALAR_MODE_USE_CELL_DATA);}; void SetScalarModeToUsePointFieldData() { this->SetScalarMode(VTK_SCALAR_MODE_USE_POINT_FIELD_DATA);}; void SetScalarModeToUseCellFieldData() { this->SetScalarMode(VTK_SCALAR_MODE_USE_CELL_FIELD_DATA);}; void SetScalarModeToUseFieldData() { this->SetScalarMode(VTK_SCALAR_MODE_USE_FIELD_DATA); } // Description: // When ScalarMode is set to UsePointFileData or UseCellFieldData, // you can specify which array to use for coloring using these methods. // The lookup table will decide how to convert vectors to colors. void SelectColorArray(int arrayNum); void SelectColorArray(const char* arrayName); // Description: // Legacy: // These methods used to be used to specify the array component. // It is better to do this in the lookup table. void ColorByArrayComponent(int arrayNum, int component); void ColorByArrayComponent(const char* arrayName, int component); // Description: // Get the array name or number and component to color by. char* GetArrayName() { return this->ArrayName; } int GetArrayId() { return this->ArrayId; } int GetArrayAccessMode() { return this->ArrayAccessMode; } int GetArrayComponent() { return this->ArrayComponent; } // Description: // Return the method for obtaining scalar data. const char *GetScalarModeAsString(); // Description: // Set/Get a global flag that controls whether coincident topology (e.g., a // line on top of a polygon) is shifted to avoid z-buffer resolution (and // hence rendering problems). If not off, there are two methods to choose // from. PolygonOffset uses graphics systems calls to shift polygons, but // does not distinguish vertices and lines from one another. ShiftZBuffer // remaps the z-buffer to distinguish vertices, lines, and polygons, but // does not always produce acceptable results. If you use the ShiftZBuffer // approach, you may also want to set the ResolveCoincidentTopologyZShift // value. (Note: not all mappers/graphics systems implement this // functionality.) static void SetResolveCoincidentTopology(int val); static int GetResolveCoincidentTopology(); static void SetResolveCoincidentTopologyToDefault(); static void SetResolveCoincidentTopologyToOff() {SetResolveCoincidentTopology(VTK_RESOLVE_OFF);} static void SetResolveCoincidentTopologyToPolygonOffset() {SetResolveCoincidentTopology(VTK_RESOLVE_POLYGON_OFFSET);} static void SetResolveCoincidentTopologyToShiftZBuffer() {SetResolveCoincidentTopology(VTK_RESOLVE_SHIFT_ZBUFFER);} // Description: // Used to set the polygon offset scale factor and units. // Used when ResolveCoincidentTopology is set to PolygonOffset. // These are global variables. static void SetResolveCoincidentTopologyPolygonOffsetParameters( double factor, double units); static void GetResolveCoincidentTopologyPolygonOffsetParameters( double& factor, double& units); // Description: // Used to set the z-shift if ResolveCoincidentTopology is set to // ShiftZBuffer. This is a global variable. static void SetResolveCoincidentTopologyZShift(double val); static double GetResolveCoincidentTopologyZShift(); // Description: // Return bounding box (array of six doubles) of data expressed as // (xmin,xmax, ymin,ymax, zmin,zmax). virtual double *GetBounds(); virtual void GetBounds(double bounds[6]) {this->vtkAbstractMapper3D::GetBounds(bounds);}; // Description: // This instance variable is used by vtkLODActor to determine which // mapper to use. It is an estimate of the time necessary to render. // Setting the render time does not modify the mapper. void SetRenderTime(double time) {this->RenderTime = time;} vtkGetMacro(RenderTime, double); //BTX // Description: // Get the input as a vtkDataSet. This method is overridden in // the specialized mapper classes to return more specific data types. vtkDataSet *GetInput(); //ETX // Description: // Get the input to this mapper as a vtkDataSet, instead of as a // more specialized data type that the subclass may return from // GetInput(). This method is provided for use in the wrapper languages, // C++ programmers should use GetInput() instead. vtkDataSet *GetInputAsDataSet() {return this->GetInput();} // Description: // Map the scalars (if there are any scalars and ScalarVisibility is on) // through the lookup table, returning an unsigned char RGBA array. This is // typically done as part of the rendering process. The alpha parameter // allows the blending of the scalars with an additional alpha (typically // which comes from a vtkActor, etc.) vtkUnsignedCharArray *MapScalars(double alpha); // Description: // Set/Get the light-model color mode. vtkSetMacro(ScalarMaterialMode,int); vtkGetMacro(ScalarMaterialMode,int); void SetScalarMaterialModeToDefault() {this->SetScalarMaterialMode(VTK_MATERIALMODE_DEFAULT);}; void SetScalarMaterialModeToAmbient() {this->SetScalarMaterialMode(VTK_MATERIALMODE_AMBIENT);}; void SetScalarMaterialModeToDiffuse() {this->SetScalarMaterialMode(VTK_MATERIALMODE_DIFFUSE);}; void SetScalarMaterialModeToAmbientAndDiffuse() {this->SetScalarMaterialMode(VTK_MATERIALMODE_AMBIENT_AND_DIFFUSE);}; // Description: // Return the light-model color mode. const char *GetScalarMaterialModeAsString(); protected: vtkMapper(); ~vtkMapper(); vtkUnsignedCharArray *Colors; // Use texture coordinates for coloring. int InterpolateScalarsBeforeMapping; // Coordinate for each point. vtkFloatArray *ColorCoordinates; // 1D ColorMap used for the texture image. vtkImageData* ColorTextureMap; void MapScalarsToTexture(vtkDataArray* scalars, double alpha); vtkScalarsToColors *LookupTable; int ScalarVisibility; vtkTimeStamp BuildTime; double ScalarRange[2]; int UseLookupTableScalarRange; int ImmediateModeRendering; int ColorMode; int ScalarMode; int ScalarMaterialMode; double RenderTime; // for coloring by a component of a field data array int ArrayId; char ArrayName[256]; int ArrayComponent; int ArrayAccessMode; int Static; private: vtkMapper(const vtkMapper&); // Not implemented. void operator=(const vtkMapper&); // Not implemented. }; #endif