Class Avogadro::QtGui::MeshGenerator

class Avogadro::QtGui::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, 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.

Returns

True if the MeshGenerator was successfully initialized.

~MeshGenerator() override

Destructor.

bool initialize(const Core::Cube *cube, Core::Mesh *mesh, float iso, 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.

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
bool m_reverseWinding

The value of the isosurface.

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]