first commit

This commit is contained in:
2026-06-22 11:49:35 +02:00
commit d805f2ba86
619 changed files with 126873 additions and 0 deletions

View 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__