summaryrefslogtreecommitdiff
path: root/hammer/mapsolid.h
diff options
context:
space:
mode:
Diffstat (limited to 'hammer/mapsolid.h')
-rw-r--r--hammer/mapsolid.h189
1 files changed, 189 insertions, 0 deletions
diff --git a/hammer/mapsolid.h b/hammer/mapsolid.h
new file mode 100644
index 0000000..2e9e389
--- /dev/null
+++ b/hammer/mapsolid.h
@@ -0,0 +1,189 @@
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// Purpose:
+//
+// $NoKeywords: $
+//=============================================================================//
+
+#ifndef MAPSOLID_H
+#define MAPSOLID_H
+#pragma once
+
+
+#include "BlockArray.h"
+#include "MapClass.h"
+#include "MapFace.h"
+
+
+enum TextureAlignment_t;
+struct ExportDXFInfo_s;
+
+
+//
+// Flags for CreateFromPlanes:
+//
+#define CREATE_BUILD_PLANE_POINTS 0x0001 // Whether to regenerate the 3 plane points from the generated face points.
+#define CREATE_FROM_PLANES_CLIPPING 0x0002
+
+#define MAPSOLID_MAX_FACES 512 // Maximum number of faces a solid can have.
+
+
+enum HL1_SolidType_t
+{
+ btSolid,
+ btWater,
+ btSlime,
+ btLava
+};
+
+
+typedef BlockArray <CMapFace, 6, (MAPSOLID_MAX_FACES / 6) + 1> CSolidFaces;
+
+
+class CMapSolid : public CMapClass
+{
+ friend CSSolid;
+
+public:
+
+ //
+ // construction/deconstruction
+ //
+ DECLARE_MAPCLASS( CMapSolid, CMapClass );
+ CMapSolid( CMapClass *Parent0 = NULL );
+ ~CMapSolid();
+
+ //
+ // Serialization.
+ //
+ static void PreloadWorld( void );
+ static int GetBadSolidCount( void );
+ virtual void PostloadWorld(CMapWorld *pWorld);
+ ChunkFileResult_t LoadVMF( CChunkFile *pFile, bool &bValid );
+ ChunkFileResult_t SaveVMF( CChunkFile *pFile, CSaveInfo *pSaveInfo );
+ int SerializeRMF( std::fstream &, BOOL );
+ int SerializeMAP( std::fstream &, BOOL );
+
+ //
+ // Selection/Hit testing.
+ //
+ bool HitTest2D(CMapView2D *pView, const Vector2D &point, HitInfo_t &HitData);
+ CMapClass *PrepareSelection(SelectMode_t eSelectMode);
+ bool SaveDXF(ExportDXFInfo_s *pInfo);
+
+ //
+ // creation/copy/editing
+ //
+ int CreateFromPlanes(DWORD dwFlags = 0);
+ void InitializeTextureAxes( TextureAlignment_t eAlignment, DWORD dwFlags );
+ void CalcBounds( BOOL bFullUpdate = FALSE );
+ virtual CMapClass *Copy(bool bUpdateDependencies);
+ virtual CMapClass *CopyFrom(CMapClass *pFrom, bool bUpdateDependencies);
+ int Split(PLANE *pPlane, CMapSolid **pFront = NULL, CMapSolid **pBack = NULL);
+ bool Subtract(CMapObjectList *pInside, CMapObjectList *pOutside, CMapClass *pSubtractWith);
+
+ virtual bool ShouldAppearInLightingPreview(void);
+ virtual bool ShouldAppearInRaytracedLightingPreview(void);
+
+ //
+ // rendering
+ //
+ bool ShouldRenderLast();
+ void Render3D(CRender3D *pRender);
+ void Render2D(CRender2D *pRender);
+
+ //
+ // solid info
+ //
+ size_t GetSize();
+ const char* GetDescription();
+ inline bool IsValid( void ) { return( m_bValid ); }
+ inline void SetValid( bool bValid ) { m_bValid = bValid; }
+ void SetTexture( LPCTSTR pszTex, int iFace = -1 );
+ LPCTSTR GetTexture( int iFace = -1 );
+ bool HasDisp( void );
+ virtual bool IsSolid( ) { return true; }
+
+ //
+ // Half-Life 1 solid types.
+ //
+ inline HL1_SolidType_t GetHL1SolidType(void) { return(m_eSolidType); }
+ inline void SetHL1SolidType(HL1_SolidType_t eSolidType) { m_eSolidType = eSolidType; }
+ HL1_SolidType_t HL1SolidTypeFromTextureName(const char *pszTexture);
+
+ virtual bool IsScaleable(void) { return(true); }
+ virtual bool IsVisualElement(void) { return(true); }
+
+ // Overridden to set the render color of each of our faces.
+ virtual void SetRenderColor(unsigned char uchRed, unsigned char uchGreen, unsigned char uchBlue);
+ virtual void SetRenderColor(color32 rgbColor);
+
+ //
+ // face info
+ //
+ inline int GetFaceCount( void ) { return( Faces.GetCount() ); }
+ inline void SetFaceCount( int nFaceCount ) { Faces.SetCount( nFaceCount ); }
+ inline CMapFace *GetFace( int nFace ) { return( &Faces[nFace] ); }
+ int GetFaceIndex( CMapFace *pFace ); // Returns the index (you could use it with GetFace) or -1 if the face doesn't exist in this solid.
+ void AddFace( CMapFace *pFace );
+ void DeleteFace( int iIndex );
+ CMapFace *FindFaceID(int nFaceID);
+
+ //
+ // Notifications.
+ //
+ virtual void OnAddToWorld(CMapWorld *pWorld);
+ virtual void OnPreClone(CMapClass *pClone, CMapWorld *pWorld, const CMapObjectList &OriginalList, CMapObjectList &NewList);
+ virtual void OnPrePaste(CMapClass *pCopy, CMapWorld *pSourceWorld, CMapWorld *pDestWorld, const CMapObjectList &OriginalList, CMapObjectList &NewList);
+ virtual void OnRemoveFromWorld(CMapWorld *pWorld, bool bNotifyChildren);
+ virtual void OnUndoRedo();
+
+ inline bool IsCordonBrush() const;
+ void SetCordonBrush(bool bSet);
+
+ virtual void AddShadowingTriangles( CUtlVector<Vector> &tri_list );
+
+#ifdef _DEBUG
+ void DebugSolid(void);
+#endif // _DEBUG
+
+protected:
+
+ void GenerateNewFaceIDs(CMapWorld *pWorld);
+
+ void PickRandomColor();
+ color32 GetLineColor( CRender2D *pRender );
+
+ //
+ // Implements CMapAtom transformation functions.
+ //
+ void DoTransform(const VMatrix &matrix);
+
+ // dvs: brought in from old carve code; should be reconciled with AddFace, Split, Subtract
+ bool AddPlane(const CMapFace *p);
+ bool Carve(CMapObjectList *pInside, CMapObjectList *pOutside, CMapSolid *pCarver);
+ void ClipByFace(const CMapFace *fa, CMapSolid **f, CMapSolid **b);
+ void RemoveEmptyFaces(void);
+
+ //
+ // Serialization.
+ //
+ static ChunkFileResult_t LoadSideCallback(CChunkFile *pFile, CMapSolid *pSolid);
+ ChunkFileResult_t SaveEditorData(CChunkFile *pFile);
+ static int g_nBadSolidCount;
+
+ CSolidFaces Faces; // The list of faces on this solid.
+
+ bool m_bValid : 1; // Is it a proper convex solid?
+ bool m_bIsCordonBrush : 1; // Whether this brush was added by the cordon tool.
+
+ HL1_SolidType_t m_eSolidType; // Used for HalfLife 1 maps only - solid, water, slime, lava.
+};
+
+
+inline bool CMapSolid::IsCordonBrush() const
+{
+ return m_bIsCordonBrush;
+}
+
+#endif // MAPSOLID_H