/*========================================================================= Program: Visualization Toolkit Module: vtkExtentTranslator.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 vtkExtentTranslator * @brief Generates a structured extent from unstructured. * * * vtkExtentTranslator generates a structured extent from an unstructured * extent. It uses a recursive scheme that splits the largest axis. A hard * coded extent can be used for a starting point. */ #ifndef vtkExtentTranslator_h #define vtkExtentTranslator_h #include "vtkCommonExecutionModelModule.h" // For export macro #include "vtkObject.h" class vtkInformationIntegerRequestKey; class vtkInformationIntegerKey; class VTKCOMMONEXECUTIONMODEL_EXPORT vtkExtentTranslator : public vtkObject { public: static vtkExtentTranslator* New(); vtkTypeMacro(vtkExtentTranslator, vtkObject); void PrintSelf(ostream& os, vtkIndent indent) override; //@{ /** * Set the Piece/NumPieces. Set the WholeExtent and then call PieceToExtent. * The result can be obtained from the Extent ivar. */ vtkSetVector6Macro(WholeExtent, int); vtkGetVector6Macro(WholeExtent, int); vtkSetVector6Macro(Extent, int); vtkGetVector6Macro(Extent, int); vtkSetMacro(Piece, int); vtkGetMacro(Piece, int); vtkSetMacro(NumberOfPieces, int); vtkGetMacro(NumberOfPieces, int); vtkSetMacro(GhostLevel, int); vtkGetMacro(GhostLevel, int); //@} //@{ /** * These are the main methods that should be called. These methods * are responsible for converting a piece to an extent. The signatures * without arguments are only thread safe when each thread accesses a * different instance. The signatures with arguments are fully thread * safe. */ virtual int PieceToExtent(); virtual int PieceToExtentByPoints(); virtual int PieceToExtentThreadSafe(int piece, int numPieces, int ghostLevel, int* wholeExtent, int* resultExtent, int splitMode, int byPoints); //@} /** * How should the streamer break up extents. Block mode * tries to break an extent up into cube blocks. It always chooses * the largest axis to split. * Slab mode first breaks up the Z axis. If it gets to one slice, * then it starts breaking up other axes. */ void SetSplitModeToBlock() { this->SplitMode = vtkExtentTranslator::BLOCK_MODE; } void SetSplitModeToXSlab() { this->SplitMode = vtkExtentTranslator::X_SLAB_MODE; } void SetSplitModeToYSlab() { this->SplitMode = vtkExtentTranslator::Y_SLAB_MODE; } void SetSplitModeToZSlab() { this->SplitMode = vtkExtentTranslator::Z_SLAB_MODE; } vtkGetMacro(SplitMode, int); /** * By default the translator creates N structured subextents by repeatedly * splitting the largest current dimension until there are N pieces. * If you do not want it always split the largest dimension, for instance when the * shortest dimension is the slowest changing and thus least coherent in memory, * use this to tell the translator which dimensions to split. */ void SetSplitPath(int len, int* splitpath); // Don't change the numbers here - they are used in the code // to indicate array indices. enum Modes { X_SLAB_MODE = 0, Y_SLAB_MODE = 1, Z_SLAB_MODE = 2, BLOCK_MODE = 3 }; /** * Key used to request a particular split mode. * This is used by vtkStreamingDemandDrivenPipeline. */ static vtkInformationIntegerRequestKey* UPDATE_SPLIT_MODE(); protected: vtkExtentTranslator(); ~vtkExtentTranslator() override; static vtkInformationIntegerKey* DATA_SPLIT_MODE(); friend class vtkInformationSplitModeRequestKey; //@{ /** * Returns 0 if no data exist for a piece. * The whole extent Should be passed in as the extent. * It is modified to return the result. */ int SplitExtent(int piece, int numPieces, int* extent, int splitMode); int SplitExtentByPoints(int piece, int numPieces, int* extent, int splitMode); //@} int Piece; int NumberOfPieces; int GhostLevel; int Extent[6]; int WholeExtent[6]; int SplitMode; int* SplitPath; int SplitLen; private: vtkExtentTranslator(const vtkExtentTranslator&) = delete; void operator=(const vtkExtentTranslator&) = delete; }; #endif