Avogadro::QtGui::MeshGenerator#

class MeshGenerator : public QThread#

Class that can generate Mesh objects from Cube objects.

This class implements a method of generating an isosurface Mesh from volumetric data using the marching cubes algorithm. In the case of the MeshGenerator class it expects a Cube as an input and an isosurface value. The tables and the basic code is taken from the public domain code written by Cory Bloyd (marchingsource.cpp) and available at, http://local.wasp.uwa.edu.au/~pbourke/geometry/polygonise/

Author

Marcus D. Hanwell

You must first initialize the class and then call run() to actually polygonize the isosurface. Connect to the classes finished() signal to do something once the polygonization is complete.

Public Functions

explicit MeshGenerator(QObject *parent = nullptr)#

Constructor.

MeshGenerator(const Core::Cube *cube, Core::Mesh *mesh, float iso, int passes = 6, bool reverse = false, QObject *parent = nullptr)#

Constructor. Can be used to initialize the MeshGenerator.

Parameters:
  • cube – The source Cube with the volumetric data.

  • mesh – The Mesh that will hold the isosurface.

  • iso – The iso value of the surface.

  • passes – Number of smoothing passes to perform.

Returns:

True if the MeshGenerator was successfully initialized.

~MeshGenerator() override#

Destructor.

bool initialize(const Core::Cube *cube, Core::Mesh *mesh, float iso, int passes = 6, bool reverse = false)#

Initialization function, set up the MeshGenerator ready to find an isosurface of the supplied Cube.

Parameters:
  • cube – The source Cube with the volumetric data.

  • mesh – The Mesh that will hold the isosurface.

  • iso – The iso value of the surface.

  • passes – Number of smoothing passes to perform.

void run() override#

Use this function to begin Mesh generation. Uses an asynchronous thread, and so avoids locking the user interface while the isosurface is found.

inline const Core::Cube *cube() const#
Returns:

The Cube being used by the class.

inline Core::Mesh *mesh() const#
Returns:

The Mesh being generated by the class.

void clear()#

Clears the contents of the MeshGenerator.

inline int progressMinimum()#
Returns:

The minimum value of the progress value.

inline int progressMaximum()#
Returns:

The maximum value of the progress value.

Signals

void progressValueChanged(int)#

The current value of the calculation’s progress.

Protected Functions

Vector3f normal(const Vector3f &pos)#

Get the normal to the supplied point. This operation is quite expensive and so should be avoided wherever possible.

Parameters:

pos – The position of the vertex whose normal is needed.

Returns:

The normal vector for the supplied point.

float offset(float val1, float val2)#

Get the offset, i.e. the approximate point of intersection of the surface between two points.

Parameters:

val1 – The position of the vertex whose normal is needed.

Returns:

The normal vector for the supplied point.

unsigned long duplicate(const Vector3i &c, const Vector3f &pos)#
bool marchingCube(const Vector3i &pos)#

Perform a marching cubes step on a single cube.

Protected Attributes

float m_iso#
int m_passes#

The value of the isosurface.

bool m_reverseWinding#

Number of smoothing passes to perform.

const Core::Cube *m_cube#

Whether the winding and normals are reversed.

Core::Mesh *m_mesh#

The cube that we are generating a Mesh from.

Vector3f m_stepSize#

The mesh that is being generated.

Vector3f m_min#

The step size vector for cube.

Vector3i m_dim#

The minimum point in the cube.

Core::Array<Vector3f> m_vertices#

The dimensions of the cube.

Core::Array<Vector3f> m_normals#
Core::Array<unsigned int> m_indices#
int m_progmin#
int m_progmax#

Protected Static Attributes

static const float a2fVertexOffset[8][3]#

These are the tables of constants for the marching cubes and tetrahedra algorithms. They are taken from the public domain source at http://local.wasp.uwa.edu.au/~pbourke/geometry/polygonise/

static const int a2iVertexOffset[8][3]#
static const int a2iEdgeConnection[12][2]#
static const float a2fEdgeDirection[12][3]#
static const int a2iTetrahedronEdgeConnection[6][2]#
static const int a2iTetrahedronsInACube[6][4]#
static const long aiTetrahedronEdgeFlags[16]#
static const int a2iTetrahedronTriangles[16][7]#
static const long aiCubeEdgeFlags[256]#
static const int a2iTriangleConnectionTable[256][16]#