/**********************************************************************
Mesh - Primitive class to encapsulate triangular meshes/
Copyright (C) 2008 Marcus D. Hanwell
This file is part of the Avogadro molecular editor project.
For more information, see
Avogadro is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
Avogadro is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301, USA.
**********************************************************************/
#ifndef MESH_H
#define MESH_H
#include
#include
#include
class QColor;
namespace Avogadro {
class Molecule;
/**
* @class Mesh mesh.h
* @brief Encapsulation of a triangular mesh that makes up a surface.
* @author Marcus D. Hanwell
*
* The Mesh class is a Primitive subclass that provides an Mesh object. All
* meshes must be owned by a Molecule. It should also be removed by the
* Molecule that owns it. Meshes encapsulate triangular meshes that can also
* have colors associated with each vertex.
*/
class MeshPrivate;
class A_EXPORT Mesh : public Primitive
{
Q_OBJECT
public:
/**
* Constructor.
*/
Mesh(QObject *parent=0);
/**
* Destructor.
*/
~Mesh();
/**
* Reserve the expected space for the mesh. This causes all member vector
* storage to call the reserve function with the number specified.
* @param size Expected size of the mesh.
* @param colors Should the colors vector reserve this space too? Defaults
* to false.
* @return True on success.
*/
bool reserve(unsigned int size, bool colors = false);
/**
* This function allows long running calculations to mark the mesh as in
* progress.
* @param stable Indicate that the Mesh is currently being modified.
*/
void setStable(bool stable);
/**
* Indicate whether the Mesh is complete or currently being modified. In
* general using Mesh values from an unstable Mesh is not advisable.
* @return True if the Mesh is complete, false if it is being modified.
*/
bool stable();
/**
* Set the iso value that was used to generate the Mesh.
*/
void setIsoValue(float value) { m_isoValue = value; }
/**
* @return The iso value used to generate the Mesh.
*/
float isoValue() const { return m_isoValue; }
/**
* Set the unique id of the other Mesh if this Mesh is part of a pair.
*/
void setOtherMesh(unsigned int other) { m_other = other; }
/**
* @return The unique id of the other Mesh if this is part of a pair.
*/
unsigned int otherMesh() const { return m_other; }
/**
* Set the unique id of the Cube the Mesh was generated from.
*/
void setCube(unsigned int cube) { m_cube = cube; }
/**
* @return The unique id of the Cube the Mesh was generated from.
*/
unsigned int cube() const { return m_cube; }
/**
* @return Vector containing all of the vertices in a one dimensional array.
*/
const std::vector & vertices() const;
/**
* @return Pointer to the first vertex of the specified triangle.
*/
const Eigen::Vector3f * vertex(int n) const;
/**
* Clear the vertices vector and assign new values.
*/
bool setVertices(const std::vector &values);
/**
* Add one or more vertices, i.e., the vector is expected to be of length
* 3 x n where n is an integer.
*/
bool addVertices(const std::vector &values);
/**
* @return Vector containing all of the normals in a one-dimensional array.
*/
const std::vector & normals() const;
/**
* @return Pointer to the first normal of the specified triangle.
*/
const Eigen::Vector3f * normal(int n) const;
/**
* Clear the normals vector and assign new values.
*/
bool setNormals(const std::vector &values);
/**
* Add one or more normals, i.e., the vector is expected to be of length
* 3 x n where n is an integer.
*/
bool addNormals(const std::vector &values);
/**
* @return Vector containing all of the colors in a one-dimensional array.
*/
const std::vector & colors() const;
/**
* @return Pointer to the first color of the specified triangle.
*/
const QColor * color(int n) const;
/**
* Clear the colors vector and assign new values.
*/
bool setColors(const std::vector &values);
/**
* Add one or more normals, i.e., the vector is expected to be of length
* 3 x n where n is an integer.
*/
bool addColors(const std::vector &values);
/**
* Sanity checking function - is the mesh sane?
* @return True if the Mesh object is sane and composed of the right number
* of elements.
*/
bool valid() const;
/**
* Clear all mesh data.
* @return True on success.
*/
bool clear();
/**
* Overloaded operator.
*/
Mesh& operator=(const Mesh& other);
/**
* Set the name of the Mesh.
*/
void setName(QString name) { m_name = name; }
/**
* @return The name of the Mesh.
*/
QString name() { return m_name; }
friend class Molecule;
private:
std::vector m_vertices;
std::vector m_normals;
std::vector m_colors;
QString m_name;
bool m_stable;
float m_isoValue;
unsigned int m_other; // Unique id of the other mesh if this is part of a pair
unsigned int m_cube; // Unique id of the cube this mesh was generated from
Q_DECLARE_PRIVATE(Mesh)
};
} // End namespace Avogadro
#endif