csgo-2018-source/hammer/ssolid.h
2021-07-24 21:11:47 -07:00

244 lines
5.3 KiB
C++

//========= Copyright © 1996-2005, Valve Corporation, All rights reserved. ============//
//
// Purpose: Structured Solid Class definition
//
// $Workfile: $
// $Date: $
// $NoKeywords: $
//=============================================================================//
#ifndef SSOLID_H
#define SSOLID_H
#ifdef _WIN32
#pragma once
#endif
#include "MapFace.h"
#define MAX_FACES 120
#define MAX_EDGES 512
class Morph3D;
class CSSolid;
class CSSEdge;
typedef DWORD SSHANDLE;
class C2DHandle
{
public:
C2DHandle(void) { m_bVisible = FALSE; m_bSelected = FALSE; m_bUse = TRUE; }
BOOL m_bVisible; // visible?
BOOL m_bSelected; // selected?
BOOL m_bUse; // use this?
// only valid if (m_bVisible):
short m_x, m_y; // 2d position in 3d view
RECT m_r; // 2d bound box in 3d view
};
// for GetHandleInfo():
typedef enum
{
shtNothing = -1,
shtVertex,
shtEdge,
shtFace
} SSHANDLETYPE;
typedef struct
{
SSHANDLETYPE Type;
int iIndex;
PVOID pData;
C2DHandle *p2DHandle;
Vector pos; // 3d position of handle
} SSHANDLEINFO;
// define a face:
class CSSFace : public C2DHandle
{
public:
CSSFace();
~CSSFace();
void Init(void);
inline int GetEdgeCount(void) { return(nEdges); }
inline SSHANDLE GetEdgeHandle(int nEdge) { Assert(nEdge < GetEdgeCount()); return(Edges[nEdge]); }
// edge IDs:
SSHANDLE Edges[MAX_FACES];
int nEdges;
BOOL bModified;
Vector PlanePts[3];
Vector normal;
TEXTURE texture; // Original face's texture info.
int m_nFaceID; // Original face's unique ID.
EditDispHandle_t m_hDisp; // Copy of the original faces displacement.
Vector ptCenter;
DWORD id;
};
class CSSEdge : public C2DHandle
{
public:
CSSEdge();
~CSSEdge();
void GetCenterPoint(Vector& Point);
// vertex IDs:
SSHANDLE hvStart;
SSHANDLE hvEnd;
Vector ptCenter;
// faces this edge belongs to.
SSHANDLE Faces[2];
DWORD id;
};
class CSSVertex : public C2DHandle
{
public:
CSSVertex();
~CSSVertex();
void GetPosition(Vector& Position);
Vector pos; // Position.
DWORD id;
};
class CSSolid
{
friend Morph3D;
public:
// construction/destruction:
CSSolid();
~CSSolid();
// attach/detach mapsolid:
void Attach(CMapSolid *pMapSolid);
CMapSolid* Detach();
// Verify that the solid (with displaced surfaces) is valid to convert back into a map solid.
bool IsValidWithDisps( void );
bool HasDisps( void );
void DestroyDisps( void );
// conversion to/from editing format:
void Convert(BOOL bFromMapSolid = TRUE, bool bSkipDisplacementFaces = false);
// move selected handles by a delta:
void MoveSelectedHandles(const Vector &Delta);
// attached map solid:
CMapSolid *m_pMapSolid;
inline int GetFaceCount(void) { return(m_nFaces); }
inline CSSFace *GetFace(int nFace) { Assert(nFace < m_nFaces); return(&m_Faces[nFace]); }
BOOL GetHandleInfo(SSHANDLEINFO * pInfo, SSHANDLE id);
PVOID GetHandleData(SSHANDLE id);
BOOL SplitFace(SSHANDLE h1, SSHANDLE h2);
BOOL SplitFaceByVertices(CSSVertex *pVertex1, CSSVertex *pVertex2);
BOOL SplitFaceByEdges(CSSEdge *pEdge1, CSSEdge *pEdge2);
inline BOOL ShowEdges(void) { return(m_bShowEdges); }
inline BOOL ShowVertices(void) { return(m_bShowVertices); }
// check faces and report errors:
void CheckFaces();
// save to .dxf:
void SerializeDXF(FILE* stream, int nObject);
SSHANDLE GetConnectionVertex(CSSEdge *pEdge1, CSSEdge *pEdge2);
private:
// called by Convert():
void ToMapSolid(CMapSolid* = NULL);
void FromMapSolid(CMapSolid* = NULL, bool bSkipDisplacementFaces = false);
void AssignFace(CSSEdge* pEdge, SSHANDLE hFace, BOOL = FALSE);
// delete face/edge/vertex:
void DeleteFace(int);
void DeleteVertex(int);
void DeleteEdge(int);
SSHANDLE * MergeSameVertices(int& nDeleted);
BOOL CanMergeVertices();
// add face/edge/vertex:
CSSFace* AddFace(int* = NULL);
CSSEdge* AddEdge(int* = NULL);
CSSVertex* AddVertex(int* = NULL);
// get the index to the vertex at this point -
// return -1 if no matching vertex.
int GetVertexIndex(const Vector &Point, float fLeniency = 0.0f);
// ditto for edge
int GetEdgeIndex(const Vector &Point, float fLeniency = 0.0f);
int GetEdgeIndex(SSHANDLE v1, SSHANDLE v2);
// ditto for face
int GetFaceIndex(const Vector &Point, float fLeniency = 0.0f);
SSHANDLE GetNewID();
void CalcEdgeCenter(CSSEdge *pEdge);
CSSEdge ** FindAffectedEdges(SSHANDLE *pHandles, int iNumHandles,
int& iNumEdges);
Vector * CreatePointList(CSSFace & face);
PINT CreatePointIndexList(CSSFace & face, PINT piPoints = NULL);
SSHANDLE* CreatePointHandleList(CSSFace & face, SSHANDLE* phPoints = NULL);
void SetVertexPosition(int iVertex, float x, float y, float z);
SSHANDLE* CreateNewVertexList(CSSFace *pFace, CSSEdge *pEdge1,
CSSEdge *pEdge2, int& nv1index, int& nv2index,
CSSVertex *pNewVertex1, CSSVertex *pNewVertex2);
void ShowHandles(BOOL bShowVertices, BOOL bShowEdges);
int m_nVertices; // number of unique vertices
BlockArray<CSSVertex, 16, 32> m_Vertices; // vertices
int m_nEdges; // number of unique edges
BlockArray<CSSEdge, 16, 32> m_Edges; // edges
int m_nFaces; // number of faces
BlockArray<CSSFace, 16, 10> m_Faces; // faces
SSHANDLE m_curid;
BOOL m_bShowVertices, m_bShowEdges;
};
#endif SSOLID_H