/****************************************************************************
**
** Copyright (C) 1991-2007 Heinz van Saanen
**
** This file is part of the function viewer Zhu3D.
**
** This file may be used under the terms of the GNU General Public
** License version 2 as published by the Free Software Foundation
** and appearing in the file LICENSE.GPL included in the packaging of
** this file.
**
** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
**
****************************************************************************/
/****************************************************************************
**
** Most of the code for the Marching Cubes and Tetrahedras and the tables are
** from an exemplary implementation of Cory Gene Bloyd. In a first step I
** made just minor adoptions like reformatting, interfacing or optimizations
** in the code. Later on I made it reentrant and thread-safe with some more
** adaptions.
**
** Thanks to Cory Gene Bloyd for publishing this excellent and understandable
** piece of software. For a description of the original algorithm look at:
**
** http://astronomy.swin.edu.au/pbourke/modelling/polygonise/
**
****************************************************************************/
/**********************************************************************
Iso - Iso class for displaying surfaces using OpenGL
Copyright (C) 2008 Marcus D. Hanwell
Copyright (C) 2008 Tim Vandermeersch
The original copyright headers are shown above. This source was originally
part of the Zhu3D project. Subsequent changes were made to adapt the source
in order to be used in the Avogadro molecular editor project.
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 ISO_H
#define ISO_H
#include
#include
#include
#include
#include
#include // Shouldn't need this but get compilation error without
#include
#include
namespace Avogadro
{
/* Add implicit functions and a Grid class in order to use OpenBabel grids */
class ImplicitFunction
{
public:
virtual float eval(float, float, float) = 0;
virtual ~ImplicitFunction() { }
};
// Attach to a grid and set
class Grid : public ImplicitFunction
{
public:
Grid(): m_iso(0.), m_gd(0) { ; }
~Grid()
{
if (m_gd)
{
// delete m_gd;
m_gd = 0;
}
}
void setIsoValue(float i) { m_iso = i; }
float isoValue() { return m_iso; }
void setGrid(OpenBabel::OBGridData *gd) { m_gd = gd; }
OpenBabel::OBGridData* grid() { return m_gd; }
float eval(float x, float y, float z)
{
OpenBabel::vector3 v(x, y, z);
return m_gd->GetValue(v) - m_iso;
}
float eval(int i, int j, int k)
{
return m_gd->GetValue(i, j, k) - m_iso;
}
private:
double m_iso;
OpenBabel::OBGridData *m_gd;
};
// Triangle structure
struct triangle
{
Eigen::Vector3f p0;
Eigen::Vector3f p1;
Eigen::Vector3f p2;
};
// Does isosurface tessellation. Called from gldraw only
class IsoGen : public QThread
{
public:
// General stuff
IsoGen(QObject *parent = 0) : QThread(parent) { ; }
~IsoGen() { ; }
// Vertex/normal-lists
QList m_normList, m_normListCopy;
QList m_vertList, m_vertListCopy;
void run();
// Central functions
void init(Grid *grid, const PainterDevice *pd, bool interpolate = false,
double stepSize = 0.0);
int numTriangles();
triangle getTriangle(int i);
triangle getNormal(int i);
private:
Grid *m_grid; // OpenBabel Grid
bool m_interpolate; // Should we interpolate or just use grid points?
float m_stepSize; // Grid density == 2.0f/sta.tgrids;
long m_totTri; // Triangles calculated in total; currently not used
Eigen::Vector3f m_min; // Minimum grid coordinate
Eigen::Vector3f m_max; // Maximum grid coordinate
QMutex m_mutex;
// Constants/tables
static const float fTargetValue;
static const float a2fVertexOffset[8][3];
static const int a2iVertexOffset[8][3];
static const long a2iEdgeConnection[12][2];
static const float a2fEdgeDirection[12][3];
static const long a2iTetrahedronEdgeConnection[6][2];
static const long a2iTetrahedronsInACube[6][4];
static const long aiTetrahedronEdgeFlags[16];
static const long a2iTetrahedronTriangles[16][7];
static const long aiCubeEdgeFlags[256];
static const long a2iTriangleConnectionTable[256][16];
void vGetNormal(Eigen::Vector3f &rfNormal, const float fX, const float fY,
const float fZ);
void vMarchCube1(const float fX, const float fY, const float fZ);
void vMarchCube1(int i, int j, int k);
// void vMarchCube2(const float fX, const float fY, const float fZ);
// void vMarchTetrahedron(Eigen::Vector3f *pasTetrahedronPosition,
// const float *pafTetrahedronValue);
void (IsoGen::*m_tessellation)(const float fX, const float fY, const float fZ);
// Multithreading stuff:
// Using own class-instance of standard iso-parsers and own calc-function
// Copies of Warp-instances are not reentrant/threadsafe by itself
// FunctionParser isoInstance;
// float isoPar(const float xpar, const float ypar, const float zpar);
};
}
// ISO_H
#endif