124 lines
3.2 KiB
C++
124 lines
3.2 KiB
C++
/* -----------------------------------------------------------------------------
|
|
GSFramework
|
|
Copyright 2001-2013 Emmanuel Julien. All Rights Reserved.
|
|
----------------------------------------------------------------------------- */
|
|
|
|
|
|
#ifndef __NISOSURFACE__
|
|
#define __NISOSURFACE__
|
|
|
|
|
|
#include "math/vector.h"
|
|
#include "thread/mutex.h"
|
|
|
|
|
|
namespace GS {
|
|
namespace Core {
|
|
class Geometry;
|
|
|
|
/*!
|
|
@short Isosurface.
|
|
@author Thomas Simonnet (scorpheus@hotmail.com)
|
|
*/
|
|
class Isosurface
|
|
{
|
|
private:
|
|
|
|
static const int EdgeArray[256];
|
|
static const int TriTable[256][16];
|
|
|
|
Vector4 m_Pos;
|
|
|
|
// grid definition
|
|
Vector4 m_NbGridCase;
|
|
float *m_Grid;
|
|
Vector4 m_GridSize;
|
|
|
|
float m_IsoValue;
|
|
|
|
// to know on which point of the grid we have to create a triangle
|
|
Vector4 * m_TabIndexValid;
|
|
int m_NbIndexValid;
|
|
|
|
// to precalculate
|
|
Vector4 m_CaseSizeDivNbCase;
|
|
|
|
|
|
struct STriangle
|
|
{
|
|
Vector4 m_Vertex[3]; // the 3 vertex of the triangle
|
|
int m_Num[3]; // number of the side who have each vertex
|
|
};
|
|
|
|
struct TVertex
|
|
{
|
|
float x, y, z; // Position
|
|
float nx, ny, nz; // Normal
|
|
float u, v; // UV coordinate
|
|
unsigned long Color; // Color
|
|
|
|
TVertex(){x=y=z=nx=ny=u=0; nz=v=1; Color =0xFF19E395;};
|
|
};
|
|
|
|
inline void CalcNormalX(float &_x, float &_y, float &_z, Vector4 &_Normal);
|
|
inline void CalcNormalY(float &_x, float &_y, float &_z, Vector4 &_Normal);
|
|
inline void CalcNormalZ(float &_x, float &_y, float &_z, Vector4 &_Normal);
|
|
|
|
// function permit to linear interpolate between vector
|
|
void interpolateVect(Vector4 &_Vect1, Vector4 &_Vect2, float &_Val1, float &_Val2, Vector4&_Vect);
|
|
|
|
// function permit to linear interpolate between val
|
|
float interpolateVal(float &_Val1, float &_Val2, float _Val_cible1, float _Val_cible2);
|
|
|
|
// Set the value of the vertex
|
|
void EvalPos(float &_x, float &_y, float &_z, Vector4 &_CasePosition);
|
|
|
|
// return the good float with the 3d parameter in the grid
|
|
int GridIndex(float &_x, float &_y, float &_z)const;
|
|
|
|
/// calcul the polygon for one case, and return the number of triangle for the polygon
|
|
int CalculPolygon(float &_x, float &_y, float &_z, STriangle* _TriangleList);
|
|
|
|
// draw the triangle in the cellule x,y, z
|
|
void RenderCell(uint &vtx_count, float &_x, float &_y, float &_z);
|
|
|
|
// compute the metaball array to fill the grid with ball
|
|
void ComputeMetaball(int nb_metaball, Vector4* pos_metaball, float* value_metaball);
|
|
|
|
Threading::Mutex m_Mutex;
|
|
|
|
public:
|
|
|
|
//max vertex to build the mesh
|
|
static uint m_MaxNbVertex;
|
|
|
|
// temp for build the mesh
|
|
static int m_MaxIdx;
|
|
int m_CountIdxBuffer;
|
|
static int* m_TempIdxBuffer ; // index buffer containing the geometry
|
|
|
|
// temp for build the mesh
|
|
static TVertex* m_TempVertexBuffer ; // Vertex buffer containing the geometry
|
|
|
|
/// Initialize the iso-surface field
|
|
bool Init(const Vector4 &_pos, const Vector4 &size, const Vector4 &step);
|
|
|
|
/// Get the iso-surface field size
|
|
void GetFieldSize(int &x, int &y, int &z);
|
|
|
|
/// Get the iso-surface field
|
|
void GetField(float *_Grid);
|
|
|
|
/// Triangularize the iso-surface
|
|
void Triangularize(Geometry* geometry, int nb_metaball, Vector4* pos_metaball, float* value_metaball);
|
|
|
|
Isosurface();
|
|
virtual ~Isosurface();
|
|
};
|
|
|
|
} // Core
|
|
} // GS
|
|
|
|
|
|
#endif // __NISOSURFACE__
|