first commit
This commit is contained in:
123
include/engine/core/iso_surface.h
Normal file
123
include/engine/core/iso_surface.h
Normal file
@ -0,0 +1,123 @@
|
||||
/* -----------------------------------------------------------------------------
|
||||
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__
|
||||
Reference in New Issue
Block a user