/*========================================================================= Program: Visualization Toolkit Module: vtkCompositePolyDataMapper2.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 vtkCompositePolyDataMapper2 * @brief mapper for composite dataset consisting * of polygonal data. * * vtkCompositePolyDataMapper2 is similar to vtkCompositePolyDataMapper except * that instead of creating individual mapper for each block in the composite * dataset, it iterates over the blocks internally. */ #ifndef vtkCompositePolyDataMapper2_h #define vtkCompositePolyDataMapper2_h #include "vtkOpenGLPolyDataMapper.h" #include "vtkRenderingOpenGL2Module.h" // For export macro #include "vtkSmartPointer.h" // for vtkSmartPointer #include "vtkColor.h" // used for ivars #include // use for ivars #include // used for ivars #include // used for ivars class vtkCompositeDataDisplayAttributes; class vtkCompositeMapperHelper2; class vtkCompositeMapperHelperData; class VTKRENDERINGOPENGL2_EXPORT vtkCompositePolyDataMapper2 : public vtkOpenGLPolyDataMapper { public: static vtkCompositePolyDataMapper2* New(); vtkTypeMacro(vtkCompositePolyDataMapper2, vtkOpenGLPolyDataMapper); void PrintSelf(ostream& os, vtkIndent indent) override; ///@{ /** * Some introspection on the type of data the mapper will render * used by props to determine if they should invoke the mapper * on a specific rendering pass. */ bool HasOpaqueGeometry() override; bool HasTranslucentPolygonalGeometry() override; ///@} ///@{ /** * Set/get the composite data set attributes. */ void SetCompositeDataDisplayAttributes(vtkCompositeDataDisplayAttributes* attributes); vtkCompositeDataDisplayAttributes* GetCompositeDataDisplayAttributes(); ///@} ///@{ /** * Set/get the visibility for a block given its flat index. */ void SetBlockVisibility(unsigned int index, bool visible); bool GetBlockVisibility(unsigned int index); void RemoveBlockVisibility(unsigned int index); void RemoveBlockVisibilities(); ///@} ///@{ /** * Set/get the color for a block given its flat index. */ void SetBlockColor(unsigned int index, const double color[3]); void SetBlockColor(unsigned int index, double r, double g, double b) { double color[3] = { r, g, b }; this->SetBlockColor(index, color); } double* GetBlockColor(unsigned int index); void RemoveBlockColor(unsigned int index); void RemoveBlockColors(); ///@} ///@{ /** * Set/get the opacity for a block given its flat index. */ void SetBlockOpacity(unsigned int index, double opacity); double GetBlockOpacity(unsigned int index); void RemoveBlockOpacity(unsigned int index); void RemoveBlockOpacities(); ///@} /** * If the current 'color by' array is missing on some datasets, color these * dataset by the LookupTable's NaN color, if the lookup table supports it. * Default is false. * @{ */ vtkSetMacro(ColorMissingArraysWithNanColor, bool); vtkGetMacro(ColorMissingArraysWithNanColor, bool); vtkBooleanMacro(ColorMissingArraysWithNanColor, bool); /**@}*/ /** * Release any graphics resources that are being consumed by this mapper. * The parameter window could be used to determine which graphic * resources to release. */ void ReleaseGraphicsResources(vtkWindow*) override; /** * This calls RenderPiece (in a for loop if streaming is necessary). */ void Render(vtkRenderer* ren, vtkActor* act) override; /**\brief A convenience method for enabling/disabling * the VBO's shift+scale transform. */ void SetVBOShiftScaleMethod(int m) override; /**\brief Pause updates of shift-scale parameters based on camera position. * * This override passes the information to all instances in \a Helpers . */ void SetPauseShiftScale(bool pauseShiftScale) override; ///@{ /** * Call SetInputArrayToProcess on helpers. */ using vtkAlgorithm::SetInputArrayToProcess; void SetInputArrayToProcess( int idx, int port, int connection, int fieldAssociation, const char* name) override; void SetInputArrayToProcess( int idx, int port, int connection, int fieldAssociation, int fieldAttributeType) override; void SetInputArrayToProcess(int idx, vtkInformation* info) override; ///@} /** * Accessor to the ordered list of PolyData that we end last drew. */ std::vector GetRenderedList() { return this->RenderedList; } /** * allows a mapper to update a selections color buffers * Called from a prop which in turn is called from the selector */ void ProcessSelectorPixelBuffers( vtkHardwareSelector* sel, std::vector& pixeloffsets, vtkProp* prop) override; /** * Overridden to include vtkCompositeDataDisplayAttributes' mtime. */ vtkMTimeType GetMTime() override; protected: vtkCompositePolyDataMapper2(); ~vtkCompositePolyDataMapper2() override; /** * We need to override this method because the standard streaming * demand driven pipeline is not what we want - we are expecting * hierarchical data as input */ vtkExecutive* CreateDefaultExecutive() override; /** * Need to define the type of data handled by this mapper. */ int FillInputPortInformation(int port, vtkInformation* info) override; /** * Need to loop over the hierarchy to compute bounds */ void ComputeBounds() override; /** * This method is called before RenderPiece is called on helpers. * One can override it to initialize the helpers. */ virtual void InitializeHelpersBeforeRendering( vtkRenderer* vtkNotUsed(ren), vtkActor* vtkNotUsed(act)) { } /** * Time stamp for computation of bounds. */ vtkTimeStamp BoundsMTime; // what "index" are we currently rendering, -1 means none int CurrentFlatIndex; std::map Helpers; std::map HelperDataMap; vtkTimeStamp HelperMTime; virtual vtkCompositeMapperHelper2* CreateHelper(); // copy values to the helpers virtual void CopyMapperValuesToHelper(vtkCompositeMapperHelper2* helper); class RenderBlockState { public: std::stack Visibility; std::stack Pickability; std::stack Opacity; std::stack AmbientColor; std::stack DiffuseColor; std::stack SpecularColor; std::stack SelectionColor; std::stack SelectionOpacity; }; bool RecursiveHasTranslucentGeometry(vtkDataObject* dobj, unsigned int& flat_index); vtkStateStorage TranslucentState; bool HasTranslucentGeometry; void BuildRenderValues( vtkRenderer* renderer, vtkActor* actor, vtkDataObject* dobj, unsigned int& flat_index); vtkStateStorage RenderValuesState; RenderBlockState BlockState; void RenderBlock( vtkRenderer* renderer, vtkActor* actor, vtkDataObject* dobj, unsigned int& flat_index); /** * Composite data set attributes. */ vtkSmartPointer CompositeAttributes; friend class vtkCompositeMapperHelper2; /** * If the current 'color by' array is missing on some datasets, color these * dataset by the LookupTable's NaN color, if the lookup table supports it. */ bool ColorMissingArraysWithNanColor; std::vector RenderedList; private: double ColorResult[3]; vtkCompositePolyDataMapper2(const vtkCompositePolyDataMapper2&) = delete; void operator=(const vtkCompositePolyDataMapper2&) = delete; }; #endif