mirror of
https://github.com/copyrighttxt/watrbx-game-engine.git
synced 2026-09-04 20:57:49 +00:00
376 lines
9.2 KiB
C++
376 lines
9.2 KiB
C++
#ifndef __sg3D__
|
|
#define __sg3D__
|
|
|
|
/************************************************************************/
|
|
/* 3DObject */
|
|
/************************************************************************/
|
|
typedef struct
|
|
{
|
|
unsigned short begin_vertex_index;
|
|
unsigned short end_vertex_index;
|
|
unsigned short edge_type;
|
|
} SG_EDGE;
|
|
|
|
typedef struct
|
|
{
|
|
long ver_indexes[3];
|
|
} SG_INDEX_TRIANGLE;
|
|
|
|
/* edge_type:*/
|
|
#define SG_EDGE_1_LEVEL 0x0001
|
|
#define SG_EDGE_2_LEVEL 0x0002
|
|
#define SG_EDGE_3_LEVEL 0x0004
|
|
|
|
typedef enum
|
|
{
|
|
SG_UNKNOWN_3D=0,
|
|
SG_BODY,
|
|
SG_SURFACE,
|
|
} SG_3DOBJECT_TYPE;
|
|
|
|
typedef enum
|
|
{
|
|
SG_VERTEX_TRIANGULATION,
|
|
SG_DELAUNAY_TRIANGULATION
|
|
} SG_TRIANGULATION_TYPE;
|
|
|
|
typedef struct
|
|
{
|
|
int nTr;
|
|
SG_POINT* allVertex;
|
|
SG_VECTOR* allNormals;
|
|
SG_POINT* allColors;
|
|
sgFloat* allUV;
|
|
} SG_ALL_TRIANGLES;
|
|
|
|
typedef enum
|
|
{
|
|
SG_MODULATE_MIX_TYPE=1,
|
|
SG_BLEND_MIX_TYPE =2,
|
|
SG_REPLACE_MIX_TYPE =3
|
|
} SG_MIX_COLOR_TYPE;
|
|
|
|
typedef enum
|
|
{
|
|
SG_CUBE_UV_TYPE =1,
|
|
SG_SPHERIC_UV_TYPE =2,
|
|
SG_CYLINDER_UV_TYPE =3
|
|
} SG_UV_TYPE;
|
|
|
|
typedef struct
|
|
{
|
|
int MaterialIndex;
|
|
sgFloat TextureScaleU;
|
|
sgFloat TextureScaleV;
|
|
sgFloat TextureShiftU;
|
|
sgFloat TextureShiftV;
|
|
sgFloat TextureAngle;
|
|
bool TextureSmooth;
|
|
bool TextureMult;
|
|
SG_MIX_COLOR_TYPE MixColorType;
|
|
SG_UV_TYPE TextureUVType;
|
|
} SG_MATERIAL;
|
|
|
|
class sgC3DObject;
|
|
class sgCBRep;
|
|
|
|
/************************************************************************/
|
|
/* Boundary representation piece */
|
|
/************************************************************************/
|
|
class sgCore_API sgCBRepPiece
|
|
{
|
|
friend class sgCBRep;
|
|
PRIVATE_ACCESS
|
|
private:
|
|
void* m_brep_piece_handle;
|
|
|
|
SG_POINT* m_vertexes;
|
|
unsigned int m_vertexes_count;
|
|
|
|
SG_EDGE* m_edges;
|
|
unsigned int m_edges_count;
|
|
|
|
SG_POINT m_min;
|
|
SG_POINT m_max;
|
|
|
|
int m_min_triangle_number;
|
|
int m_max_triangle_number;
|
|
|
|
sgCBRepPiece();
|
|
~sgCBRepPiece();
|
|
public:
|
|
void GetLocalGabarits(SG_POINT& p_min, SG_POINT& p_max) const;
|
|
|
|
const SG_POINT* GetVertexes() const;
|
|
unsigned int GetVertexesCount() const;
|
|
|
|
const SG_EDGE* GetEdges() const;
|
|
unsigned int GetEdgesCount() const;
|
|
|
|
void GetTrianglesRange(int& min_numb, int& max_numb) const;
|
|
};
|
|
|
|
/************************************************************************/
|
|
/* Boundary representation */
|
|
/************************************************************************/
|
|
class sgCore_API sgCBRep
|
|
{
|
|
friend class sgC3DObject;
|
|
PRIVATE_ACCESS
|
|
private:
|
|
sgCBRep();
|
|
~sgCBRep();
|
|
|
|
sgCBRepPiece** m_pieces;
|
|
unsigned int m_pieces_count;
|
|
public:
|
|
sgCBRepPiece* GetPiece(unsigned int) const;
|
|
unsigned int GetPiecesCount() const;
|
|
};
|
|
|
|
/************************************************************************/
|
|
/* 3D object base class */
|
|
/************************************************************************/
|
|
class sgCore_API sgC3DObject : public sgCObject
|
|
{
|
|
protected:
|
|
sgC3DObject();
|
|
sgC3DObject(SG_OBJ_HANDLE);
|
|
|
|
virtual ~sgC3DObject();
|
|
|
|
public:
|
|
static void AutoTriangulate(bool,SG_TRIANGULATION_TYPE);
|
|
|
|
bool Triangulate(SG_TRIANGULATION_TYPE);
|
|
|
|
SG_3DOBJECT_TYPE Get3DObjectType() const;
|
|
|
|
sgCBRep* GetBRep() const;
|
|
const SG_ALL_TRIANGLES* GetTriangles() const;
|
|
|
|
virtual bool ApplyTempMatrix();
|
|
const sgFloat* GetWorldMatrixData() const;
|
|
|
|
void SetMaterial(const SG_MATERIAL&);
|
|
const SG_MATERIAL* GetMaterial();
|
|
bool CalculateOptimalUV(sgFloat& optU, sgFloat& optV);
|
|
|
|
sgFloat GetVolume();
|
|
sgFloat GetSquare();
|
|
|
|
void SetColor(const SG_POINT& color);
|
|
void Scale(const SG_POINT& scale);
|
|
void Translate(const SG_POINT& translation);
|
|
void Transform(const sgCMatrix& matrix);
|
|
|
|
private:
|
|
SG_3DOBJECT_TYPE m_objectType;
|
|
sgCBRep* m_brep;
|
|
bool CopyBRepStructure();
|
|
SG_ALL_TRIANGLES* m_triangles;
|
|
void CalcUV();
|
|
sgCMatrix* m_world_matrix;
|
|
SG_MATERIAL* m_material;
|
|
|
|
PRIVATE_ACCESS
|
|
};
|
|
|
|
|
|
|
|
/************************************************************************/
|
|
/* Box */
|
|
/************************************************************************/
|
|
|
|
typedef struct
|
|
{
|
|
sgFloat SizeX;
|
|
sgFloat SizeY;
|
|
sgFloat SizeZ;
|
|
} SG_BOX;
|
|
|
|
class sgCore_API sgCBox : public sgC3DObject
|
|
{
|
|
private:
|
|
sgCBox();
|
|
sgCBox(SG_OBJ_HANDLE);
|
|
virtual ~sgCBox();
|
|
|
|
public:
|
|
static sgCBox* Create(sgFloat sizeX, sgFloat sizeY, sgFloat sizeZ);
|
|
void GetGeometry(SG_BOX& ) const;
|
|
PRIVATE_ACCESS
|
|
};
|
|
#define sgCreateBox sgCBox::Create
|
|
|
|
|
|
|
|
/************************************************************************/
|
|
/* Sphere */
|
|
/************************************************************************/
|
|
|
|
typedef struct
|
|
{
|
|
sgFloat Radius;
|
|
short MeridiansCount;
|
|
short ParallelsCount;
|
|
} SG_SPHERE;
|
|
|
|
class sgCore_API sgCSphere : public sgC3DObject
|
|
{
|
|
private:
|
|
sgCSphere();
|
|
sgCSphere(SG_OBJ_HANDLE);
|
|
virtual ~sgCSphere();
|
|
|
|
public:
|
|
static sgCSphere* Create(sgFloat rad, short merid, short parall);
|
|
void GetGeometry(SG_SPHERE&) const;
|
|
PRIVATE_ACCESS
|
|
};
|
|
#define sgCreateSphere sgCSphere::Create
|
|
|
|
|
|
|
|
/************************************************************************/
|
|
/* Cylinder */
|
|
/************************************************************************/
|
|
|
|
typedef struct
|
|
{
|
|
sgFloat Radius;
|
|
sgFloat Height;
|
|
short MeridiansCount;
|
|
} SG_CYLINDER;
|
|
|
|
class sgCore_API sgCCylinder : public sgC3DObject
|
|
{
|
|
private:
|
|
sgCCylinder();
|
|
sgCCylinder(SG_OBJ_HANDLE);
|
|
virtual ~sgCCylinder();
|
|
|
|
public:
|
|
|
|
static sgCCylinder* Create(sgFloat rad, sgFloat heig, short merid);
|
|
void GetGeometry(SG_CYLINDER&) const;
|
|
PRIVATE_ACCESS
|
|
};
|
|
#define sgCreateCylinder sgCCylinder::Create
|
|
|
|
|
|
|
|
|
|
/************************************************************************/
|
|
/* Cone */
|
|
/************************************************************************/
|
|
|
|
typedef struct
|
|
{
|
|
sgFloat Radius1;
|
|
sgFloat Radius2;
|
|
sgFloat Height;
|
|
short MeridiansCount;
|
|
} SG_CONE;
|
|
|
|
class sgCore_API sgCCone : public sgC3DObject
|
|
{
|
|
private:
|
|
sgCCone();
|
|
sgCCone(SG_OBJ_HANDLE);
|
|
virtual ~sgCCone();
|
|
|
|
public:
|
|
static sgCCone* Create(sgFloat rad_1,sgFloat rad_2,sgFloat heig, short merid);
|
|
void GetGeometry(SG_CONE&) const;
|
|
PRIVATE_ACCESS
|
|
};
|
|
#define sgCreateCone sgCCone::Create
|
|
|
|
/************************************************************************/
|
|
/* Torus */
|
|
/************************************************************************/
|
|
|
|
typedef struct
|
|
{
|
|
sgFloat Radius1;
|
|
sgFloat Radius2;
|
|
short MeridiansCount1;
|
|
short MeridiansCount2;
|
|
} SG_TORUS;
|
|
|
|
class sgCore_API sgCTorus : public sgC3DObject
|
|
{
|
|
private:
|
|
sgCTorus();
|
|
sgCTorus(SG_OBJ_HANDLE);
|
|
virtual ~sgCTorus();
|
|
|
|
public:
|
|
|
|
static sgCTorus* Create(sgFloat r1,sgFloat r2,short m1,short m2);
|
|
void GetGeometry(SG_TORUS&) const;
|
|
PRIVATE_ACCESS
|
|
};
|
|
#define sgCreateTorus sgCTorus::Create
|
|
|
|
/************************************************************************/
|
|
/* Ellipsoid */
|
|
/************************************************************************/
|
|
|
|
typedef struct
|
|
{
|
|
sgFloat Radius1;
|
|
sgFloat Radius2;
|
|
sgFloat Radius3;
|
|
short MeridiansCount;
|
|
short ParallelsCount;
|
|
} SG_ELLIPSOID;
|
|
|
|
class sgCore_API sgCEllipsoid : public sgC3DObject
|
|
{
|
|
private:
|
|
sgCEllipsoid();
|
|
sgCEllipsoid(SG_OBJ_HANDLE);
|
|
virtual ~sgCEllipsoid();
|
|
|
|
public:
|
|
|
|
static sgCEllipsoid* Create(sgFloat radius1, sgFloat radius2, sgFloat radius3,
|
|
short merid_cnt, short parall_cnt);
|
|
void GetGeometry(SG_ELLIPSOID&) const;
|
|
PRIVATE_ACCESS
|
|
};
|
|
#define sgCreateEllipsoid sgCEllipsoid::Create
|
|
|
|
/************************************************************************/
|
|
/* SphericBand */
|
|
/************************************************************************/
|
|
|
|
typedef struct
|
|
{
|
|
sgFloat Radius;
|
|
sgFloat BeginCoef;
|
|
sgFloat EndCoef;
|
|
short MeridiansCount;
|
|
} SG_SPHERIC_BAND;
|
|
|
|
class sgCore_API sgCSphericBand : public sgC3DObject
|
|
{
|
|
private:
|
|
sgCSphericBand();
|
|
sgCSphericBand(SG_OBJ_HANDLE);
|
|
virtual ~sgCSphericBand();
|
|
|
|
public:
|
|
static sgCSphericBand* Create(sgFloat radius, sgFloat beg_koef,
|
|
sgFloat end_koef,
|
|
short merid_cnt);
|
|
void GetGeometry(SG_SPHERIC_BAND&) const;
|
|
|
|
PRIVATE_ACCESS
|
|
};
|
|
#define sgCreateSphericBand sgCSphericBand::Create
|
|
|
|
|
|
#endif |