Files
2025-09-18 17:55:52 -04:00

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