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.
189 lines
5.7 KiB
C
189 lines
5.7 KiB
C
3 weeks ago
|
/*=========================================================================
|
||
|
|
||
|
Program: Visualization Toolkit
|
||
|
Module: vtkMCubesReader.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 vtkMCubesReader
|
||
|
* @brief read binary marching cubes file
|
||
|
*
|
||
|
* vtkMCubesReader is a source object that reads binary marching cubes
|
||
|
* files. (Marching cubes is an isosurfacing technique that generates
|
||
|
* many triangles.) The binary format is supported by W. Lorensen's
|
||
|
* marching cubes program (and the vtkSliceCubes object). The format
|
||
|
* repeats point coordinates, so this object will merge the points
|
||
|
* with a vtkLocator object. You can choose to supply the vtkLocator
|
||
|
* or use the default.
|
||
|
*
|
||
|
* @warning
|
||
|
* Binary files assumed written in sun/hp/sgi (i.e., Big Endian) form.
|
||
|
*
|
||
|
* @warning
|
||
|
* Because points are merged when read, degenerate triangles may be removed.
|
||
|
* Thus the number of triangles read may be fewer than the number of triangles
|
||
|
* actually created.
|
||
|
*
|
||
|
* @warning
|
||
|
* The point merging does not take into account that the same point may have
|
||
|
* different normals. For example, running vtkPolyDataNormals after
|
||
|
* vtkContourFilter may split triangles because of the FeatureAngle
|
||
|
* ivar. Subsequent reading with vtkMCubesReader will merge the points and
|
||
|
* use the first point's normal. For the most part, this is undesirable.
|
||
|
*
|
||
|
* @warning
|
||
|
* Normals are generated from the gradient of the data scalar values. Hence
|
||
|
* the normals may on occasion point in a direction inconsistent with the
|
||
|
* ordering of the triangle vertices. If this happens, the resulting surface
|
||
|
* may be "black". Reverse the sense of the FlipNormals boolean flag to
|
||
|
* correct this.
|
||
|
*
|
||
|
* @sa
|
||
|
* vtkContourFilter vtkMarchingCubes vtkSliceCubes vtkLocator
|
||
|
*/
|
||
|
|
||
|
#ifndef vtkMCubesReader_h
|
||
|
#define vtkMCubesReader_h
|
||
|
|
||
|
#include "vtkIOGeometryModule.h" // For export macro
|
||
|
#include "vtkPolyDataAlgorithm.h"
|
||
|
|
||
|
#define VTK_FILE_BYTE_ORDER_BIG_ENDIAN 0
|
||
|
#define VTK_FILE_BYTE_ORDER_LITTLE_ENDIAN 1
|
||
|
|
||
|
class vtkIncrementalPointLocator;
|
||
|
|
||
|
class VTKIOGEOMETRY_EXPORT vtkMCubesReader : public vtkPolyDataAlgorithm
|
||
|
{
|
||
|
public:
|
||
|
vtkTypeMacro(vtkMCubesReader, vtkPolyDataAlgorithm);
|
||
|
void PrintSelf(ostream& os, vtkIndent indent) override;
|
||
|
|
||
|
/**
|
||
|
* Construct object with FlipNormals turned off and Normals set to true.
|
||
|
*/
|
||
|
static vtkMCubesReader* New();
|
||
|
|
||
|
//@{
|
||
|
/**
|
||
|
* Specify file name of marching cubes file.
|
||
|
*/
|
||
|
vtkSetStringMacro(FileName);
|
||
|
vtkGetStringMacro(FileName);
|
||
|
//@}
|
||
|
|
||
|
//@{
|
||
|
/**
|
||
|
* Set / get the file name of the marching cubes limits file.
|
||
|
*/
|
||
|
vtkSetStringMacro(LimitsFileName);
|
||
|
vtkGetStringMacro(LimitsFileName);
|
||
|
//@}
|
||
|
|
||
|
//@{
|
||
|
/**
|
||
|
* Specify a header size if one exists. The header is skipped and not used at this time.
|
||
|
*/
|
||
|
vtkSetClampMacro(HeaderSize, int, 0, VTK_INT_MAX);
|
||
|
vtkGetMacro(HeaderSize, int);
|
||
|
//@}
|
||
|
|
||
|
//@{
|
||
|
/**
|
||
|
* Specify whether to flip normals in opposite direction. Flipping ONLY
|
||
|
* changes the direction of the normal vector. Contrast this with flipping
|
||
|
* in vtkPolyDataNormals which flips both the normal and the cell point
|
||
|
* order.
|
||
|
*/
|
||
|
vtkSetMacro(FlipNormals, vtkTypeBool);
|
||
|
vtkGetMacro(FlipNormals, vtkTypeBool);
|
||
|
vtkBooleanMacro(FlipNormals, vtkTypeBool);
|
||
|
//@}
|
||
|
|
||
|
//@{
|
||
|
/**
|
||
|
* Specify whether to read normals.
|
||
|
*/
|
||
|
vtkSetMacro(Normals, vtkTypeBool);
|
||
|
vtkGetMacro(Normals, vtkTypeBool);
|
||
|
vtkBooleanMacro(Normals, vtkTypeBool);
|
||
|
//@}
|
||
|
|
||
|
//@{
|
||
|
/**
|
||
|
* These methods should be used instead of the SwapBytes methods.
|
||
|
* They indicate the byte ordering of the file you are trying
|
||
|
* to read in. These methods will then either swap or not swap
|
||
|
* the bytes depending on the byte ordering of the machine it is
|
||
|
* being run on. For example, reading in a BigEndian file on a
|
||
|
* BigEndian machine will result in no swapping. Trying to read
|
||
|
* the same file on a LittleEndian machine will result in swapping.
|
||
|
* As a quick note most UNIX machines are BigEndian while PC's
|
||
|
* and VAX tend to be LittleEndian. So if the file you are reading
|
||
|
* in was generated on a VAX or PC, SetDataByteOrderToLittleEndian otherwise
|
||
|
* SetDataByteOrderToBigEndian.
|
||
|
*/
|
||
|
void SetDataByteOrderToBigEndian();
|
||
|
void SetDataByteOrderToLittleEndian();
|
||
|
int GetDataByteOrder();
|
||
|
void SetDataByteOrder(int);
|
||
|
const char* GetDataByteOrderAsString();
|
||
|
//@}
|
||
|
|
||
|
//@{
|
||
|
/**
|
||
|
* Turn on/off byte swapping.
|
||
|
*/
|
||
|
vtkSetMacro(SwapBytes, vtkTypeBool);
|
||
|
vtkGetMacro(SwapBytes, vtkTypeBool);
|
||
|
vtkBooleanMacro(SwapBytes, vtkTypeBool);
|
||
|
//@}
|
||
|
|
||
|
//@{
|
||
|
/**
|
||
|
* Set / get a spatial locator for merging points. By default,
|
||
|
* an instance of vtkMergePoints is used.
|
||
|
*/
|
||
|
void SetLocator(vtkIncrementalPointLocator* locator);
|
||
|
vtkGetObjectMacro(Locator, vtkIncrementalPointLocator);
|
||
|
//@}
|
||
|
|
||
|
/**
|
||
|
* Create default locator. Used to create one when none is specified.
|
||
|
*/
|
||
|
void CreateDefaultLocator();
|
||
|
|
||
|
/**
|
||
|
* Return the mtime also considering the locator.
|
||
|
*/
|
||
|
vtkMTimeType GetMTime() override;
|
||
|
|
||
|
protected:
|
||
|
vtkMCubesReader();
|
||
|
~vtkMCubesReader() override;
|
||
|
|
||
|
int RequestData(vtkInformation*, vtkInformationVector**, vtkInformationVector*) override;
|
||
|
|
||
|
char* FileName;
|
||
|
char* LimitsFileName;
|
||
|
vtkIncrementalPointLocator* Locator;
|
||
|
vtkTypeBool SwapBytes;
|
||
|
int HeaderSize;
|
||
|
vtkTypeBool FlipNormals;
|
||
|
vtkTypeBool Normals;
|
||
|
|
||
|
private:
|
||
|
vtkMCubesReader(const vtkMCubesReader&) = delete;
|
||
|
void operator=(const vtkMCubesReader&) = delete;
|
||
|
};
|
||
|
|
||
|
#endif
|