diff options
Diffstat (limited to 'mp/src/utils/vbsp/vbsp.h')
| -rw-r--r-- | mp/src/utils/vbsp/vbsp.h | 1314 |
1 files changed, 657 insertions, 657 deletions
diff --git a/mp/src/utils/vbsp/vbsp.h b/mp/src/utils/vbsp/vbsp.h index 9b994d38..689bbaa8 100644 --- a/mp/src/utils/vbsp/vbsp.h +++ b/mp/src/utils/vbsp/vbsp.h @@ -1,657 +1,657 @@ -//========= Copyright Valve Corporation, All rights reserved. ============//
-//
-// Purpose:
-//
-// $NoKeywords: $
-//
-//=============================================================================//
-
-#if !defined( VBSP_H )
-#define VBSP_H
-
-
-#include "cmdlib.h"
-#include "mathlib/vector.h"
-#include "scriplib.h"
-#include "polylib.h"
-#include "threads.h"
-#include "bsplib.h"
-#include "qfiles.h"
-#include "utilmatlib.h"
-#include "ChunkFile.h"
-
-#ifdef WIN32
-#pragma warning( disable: 4706 )
-#endif
-
-class CUtlBuffer;
-
-#define MAX_BRUSH_SIDES 128
-#define CLIP_EPSILON 0.1
-
-#define TEXINFO_NODE -1 // side is allready on a node
-
-// this will output glview files for the given brushmodel. Brushmodel 1 is the world, 2 is the first brush entity, etc.
-#define DEBUG_BRUSHMODEL 0
-
-struct portal_t;
-struct node_t;
-
-struct plane_t : public dplane_t
-{
- plane_t *hash_chain;
-
- plane_t() { normal.Init(); }
-};
-
-
-struct brush_texture_t
-{
- Vector UAxis;
- Vector VAxis;
- vec_t shift[2];
- vec_t rotate;
- vec_t textureWorldUnitsPerTexel[2];
- vec_t lightmapWorldUnitsPerLuxel;
- char name[TEXTURE_NAME_LENGTH];
- int flags;
-
- brush_texture_t() : UAxis(0,0,0), VAxis(0,0,0) {}
-};
-
-struct mapdispinfo_t;
-
-struct side_t
-{
- int planenum;
- int texinfo;
- mapdispinfo_t *pMapDisp;
-
- winding_t *winding;
- side_t *original; // bspbrush_t sides will reference the mapbrush_t sides
- int contents; // from miptex
- int surf; // from miptex
- qboolean visible; // choose visble planes first
- qboolean tested; // this plane allready checked as a split
- qboolean bevel; // don't ever use for bsp splitting
-
- side_t *next;
- int origIndex;
- int id; // This is the unique id generated by worldcraft for this side.
- unsigned int smoothingGroups;
- CUtlVector<int> aOverlayIds; // List of overlays that reside on this side.
- CUtlVector<int> aWaterOverlayIds; // List of water overlays that reside on this side.
- bool m_bDynamicShadowsEnabled; // Goes into dface_t::SetDynamicShadowsEnabled().
-};
-
-struct mapbrush_t
-{
- int entitynum;
- int brushnum;
- int id; // The unique ID of this brush in the editor, used for reporting errors.
- int contents;
- Vector mins, maxs;
- int numsides;
- side_t *original_sides;
-};
-
-#define PLANENUM_LEAF -1
-
-#define MAXEDGES 32
-
-struct face_t
-{
- int id;
-
- face_t *next; // on node
-
- // the chain of faces off of a node can be merged or split,
- // but each face_t along the way will remain in the chain
- // until the entire tree is freed
- face_t *merged; // if set, this face isn't valid anymore
- face_t *split[2]; // if set, this face isn't valid anymore
-
- portal_t *portal;
- int texinfo;
- int dispinfo;
- // This is only for surfaces that are the boundaries of fog volumes
- // (ie. water surfaces)
- // All of the rest of the surfaces can look at their leaf to find out
- // what fog volume they are in.
- node_t *fogVolumeLeaf;
-
- int planenum;
- int contents; // faces in different contents can't merge
- int outputnumber;
- winding_t *w;
- int numpoints;
- qboolean badstartvert; // tjunctions cannot be fixed without a midpoint vertex
- int vertexnums[MAXEDGES];
- side_t *originalface; // save the "side" this face came from
- int firstPrimID;
- int numPrims;
- unsigned int smoothingGroups;
-};
-
-void EmitFace( face_t *f, qboolean onNode );
-
-struct mapdispinfo_t
-{
- face_t face;
- int entitynum;
- int power;
- int minTess;
- float smoothingAngle;
- Vector uAxis;
- Vector vAxis;
- Vector startPosition;
- float alphaValues[MAX_DISPVERTS];
- float maxDispDist;
- float dispDists[MAX_DISPVERTS];
- Vector vectorDisps[MAX_DISPVERTS];
- Vector vectorOffsets[MAX_DISPVERTS];
- int contents;
- int brushSideID;
- unsigned short triTags[MAX_DISPTRIS];
- int flags;
-
-#ifdef VSVMFIO
- float m_elevation; // "elevation"
- Vector m_offsetNormals[ MAX_DISPTRIS ]; // "offset_normals"
-#endif // VSVMFIO
-
-};
-
-extern int nummapdispinfo;
-extern mapdispinfo_t mapdispinfo[MAX_MAP_DISPINFO];
-
-extern float g_defaultLuxelSize;
-extern float g_luxelScale;
-extern float g_minLuxelScale;
-extern bool g_BumpAll;
-extern int g_nDXLevel;
-
-int GetDispInfoEntityNum( mapdispinfo_t *pDisp );
-void ComputeBoundsNoSkybox( );
-
-struct bspbrush_t
-{
- int id;
- bspbrush_t *next;
- Vector mins, maxs;
- int side, testside; // side of node during construction
- mapbrush_t *original;
- int numsides;
- side_t sides[6]; // variably sized
-};
-
-
-#define MAX_NODE_BRUSHES 8
-
-struct leafface_t
-{
- face_t *pFace;
- leafface_t *pNext;
-};
-
-struct node_t
-{
- int id;
-
- // both leafs and nodes
- int planenum; // -1 = leaf node
- node_t *parent;
- Vector mins, maxs; // valid after portalization
- bspbrush_t *volume; // one for each leaf/node
-
- // nodes only
- side_t *side; // the side that created the node
- node_t *children[2];
- face_t *faces; // these are the cutup ones that live in the plane of "side".
-
- // leafs only
- bspbrush_t *brushlist; // fragments of all brushes in this leaf
- leafface_t *leaffacelist;
- int contents; // OR of all brush contents
- int occupied; // 1 or greater can reach entity
- entity_t *occupant; // for leak file testing
- int cluster; // for portalfile writing
- int area; // for areaportals
- portal_t *portals; // also on nodes during construction
- int diskId; // dnodes or dleafs index after this has been emitted
-};
-
-
-struct portal_t
-{
- int id;
- plane_t plane;
- node_t *onnode; // NULL = outside box
- node_t *nodes[2]; // [0] = front side of plane
- portal_t *next[2];
- winding_t *winding;
- qboolean sidefound; // false if ->side hasn't been checked
- side_t *side; // NULL = non-visible
- face_t *face[2]; // output face in bsp file
-};
-
-
-struct tree_t
-{
- node_t *headnode;
- node_t outside_node;
- Vector mins, maxs;
- bool leaked;
-};
-
-
-extern int entity_num;
-
-struct LoadSide_t;
-struct LoadEntity_t;
-class CManifest;
-
-class CMapFile
-{
-public:
- CMapFile( void ) { Init(); }
-
- void Init( void );
-
- void AddPlaneToHash (plane_t *p);
- int CreateNewFloatPlane (Vector& normal, vec_t dist);
- int FindFloatPlane (Vector& normal, vec_t dist);
- int PlaneFromPoints(const Vector &p0, const Vector &p1, const Vector &p2);
- void AddBrushBevels (mapbrush_t *b);
- qboolean MakeBrushWindings (mapbrush_t *ob);
- void MoveBrushesToWorld( entity_t *mapent );
- void MoveBrushesToWorldGeneral( entity_t *mapent );
- void RemoveContentsDetailFromEntity( entity_t *mapent );
- int SideIDToIndex( int brushSideID );
- void AddLadderKeys( entity_t *mapent );
- ChunkFileResult_t LoadEntityCallback(CChunkFile *pFile, int nParam);
- void ForceFuncAreaPortalWindowContents();
- ChunkFileResult_t LoadSideCallback(CChunkFile *pFile, LoadSide_t *pSideInfo);
- ChunkFileResult_t LoadConnectionsKeyCallback(const char *szKey, const char *szValue, LoadEntity_t *pLoadEntity);
- ChunkFileResult_t LoadSolidCallback(CChunkFile *pFile, LoadEntity_t *pLoadEntity);
- void TestExpandBrushes(void);
-
- static char m_InstancePath[ MAX_PATH ];
- static void SetInstancePath( const char *pszInstancePath );
- static const char *GetInstancePath( void ) { return m_InstancePath; }
- static bool DeterminePath( const char *pszBaseFileName, const char *pszInstanceFileName, char *pszOutFileName );
-
- void CheckForInstances( const char *pszFileName );
- void MergeInstance( entity_t *pInstanceEntity, CMapFile *Instance );
- void MergePlanes( entity_t *pInstanceEntity, CMapFile *Instance, Vector &InstanceOrigin, QAngle &InstanceAngle, matrix3x4_t &InstanceMatrix );
- void MergeBrushes( entity_t *pInstanceEntity, CMapFile *Instance, Vector &InstanceOrigin, QAngle &InstanceAngle, matrix3x4_t &InstanceMatrix );
- void MergeBrushSides( entity_t *pInstanceEntity, CMapFile *Instance, Vector &InstanceOrigin, QAngle &InstanceAngle, matrix3x4_t &InstanceMatrix );
- void ReplaceInstancePair( epair_t *pPair, entity_t *pInstanceEntity );
- void MergeEntities( entity_t *pInstanceEntity, CMapFile *Instance, Vector &InstanceOrigin, QAngle &InstanceAngle, matrix3x4_t &InstanceMatrix );
- void MergeOverlays( entity_t *pInstanceEntity, CMapFile *Instance, Vector &InstanceOrigin, QAngle &InstanceAngle, matrix3x4_t &InstanceMatrix );
-
- static int m_InstanceCount;
- static int c_areaportals;
-
- plane_t mapplanes[MAX_MAP_PLANES];
- int nummapplanes;
-
- #define PLANE_HASHES 1024
- plane_t *planehash[PLANE_HASHES];
-
- int nummapbrushes;
- mapbrush_t mapbrushes[MAX_MAP_BRUSHES];
-
- Vector map_mins, map_maxs;
-
- int nummapbrushsides;
- side_t brushsides[MAX_MAP_BRUSHSIDES];
-
- brush_texture_t side_brushtextures[MAX_MAP_BRUSHSIDES];
-
- int num_entities;
- entity_t entities[MAX_MAP_ENTITIES];
-
- int c_boxbevels;
- int c_edgebevels;
- int c_clipbrushes;
- int g_ClipTexinfo;
-
- class CConnectionPairs
- {
- public:
- CConnectionPairs( epair_t *pair, CConnectionPairs *next )
- {
- m_Pair = pair;
- m_Next = next;
- }
-
- epair_t *m_Pair;
- CConnectionPairs *m_Next;
- };
-
- CConnectionPairs *m_ConnectionPairs;
-
- int m_StartMapOverlays;
- int m_StartMapWaterOverlays;
-};
-
-extern CMapFile *g_MainMap;
-extern CMapFile *g_LoadingMap;
-
-extern CUtlVector< CMapFile * > g_Maps;
-
-extern int g_nMapFileVersion;
-
-extern qboolean noprune;
-extern qboolean nodetail;
-extern qboolean fulldetail;
-extern qboolean nomerge;
-extern qboolean nomergewater;
-extern qboolean nosubdiv;
-extern qboolean nowater;
-extern qboolean noweld;
-extern qboolean noshare;
-extern qboolean notjunc;
-extern qboolean nocsg;
-extern qboolean noopt;
-extern qboolean dumpcollide;
-extern qboolean nodetailcuts;
-extern qboolean g_DumpStaticProps;
-extern qboolean g_bSkyVis;
-extern vec_t microvolume;
-extern bool g_snapAxialPlanes;
-extern bool g_NodrawTriggers;
-extern bool g_DisableWaterLighting;
-extern bool g_bAllowDetailCracks;
-extern bool g_bNoVirtualMesh;
-extern char outbase[32];
-
-extern char source[1024];
-extern char mapbase[ 64 ];
-extern CUtlVector<int> g_SkyAreas;
-
-bool LoadMapFile( const char *pszFileName );
-int GetVertexnum( Vector& v );
-bool Is3DSkyboxArea( int area );
-
-//=============================================================================
-
-// textures.c
-
-struct textureref_t
-{
- char name[TEXTURE_NAME_LENGTH];
- int flags;
- float lightmapWorldUnitsPerLuxel;
- int contents;
-};
-
-extern textureref_t textureref[MAX_MAP_TEXTURES];
-
-int FindMiptex (const char *name);
-
-int TexinfoForBrushTexture (plane_t *plane, brush_texture_t *bt, const Vector& origin);
-int GetSurfaceProperties2( MaterialSystemMaterial_t matID, const char *pMatName );
-
-extern int g_SurfaceProperties[MAX_MAP_TEXDATA];
-void LoadSurfaceProperties( void );
-
-int PointLeafnum ( dmodel_t* pModel, const Vector& p );
-
-//=============================================================================
-
-void FindGCD (int *v);
-
-mapbrush_t *Brush_LoadEntity (entity_t *ent);
-int PlaneTypeForNormal (Vector& normal);
-qboolean MakeBrushPlanes (mapbrush_t *b);
-int FindIntPlane (int *inormal, int *iorigin);
-void CreateBrush (int brushnum);
-
-
-//=============================================================================
-// detail objects
-//=============================================================================
-
-void LoadEmitDetailObjectDictionary( char const* pGameDir );
-void EmitDetailObjects();
-
-//=============================================================================
-// static props
-//=============================================================================
-
-void EmitStaticProps();
-bool LoadStudioModel( char const* pFileName, char const* pEntityType, CUtlBuffer& buf );
-
-//=============================================================================
-//=============================================================================
-// procedurally created .vmt files
-//=============================================================================
-
-void EmitStaticProps();
-
-// draw.c
-
-extern Vector draw_mins, draw_maxs;
-extern bool g_bLightIfMissing;
-
-void Draw_ClearWindow (void);
-void DrawWinding (winding_t *w);
-
-void GLS_BeginScene (void);
-void GLS_Winding (winding_t *w, int code);
-void GLS_EndScene (void);
-
-//=============================================================================
-
-// csg
-
-enum detailscreen_e
-{
- FULL_DETAIL = 0,
- ONLY_DETAIL = 1,
- NO_DETAIL = 2,
-};
-
-#define TRANSPARENT_CONTENTS (CONTENTS_GRATE|CONTENTS_WINDOW)
-
-#include "csg.h"
-
-//=============================================================================
-
-// brushbsp
-
-void WriteBrushList (char *name, bspbrush_t *brush, qboolean onlyvis);
-
-bspbrush_t *CopyBrush (bspbrush_t *brush);
-
-void SplitBrush (bspbrush_t *brush, int planenum,
- bspbrush_t **front, bspbrush_t **back);
-
-tree_t *AllocTree (void);
-node_t *AllocNode (void);
-bspbrush_t *AllocBrush (int numsides);
-int CountBrushList (bspbrush_t *brushes);
-void FreeBrush (bspbrush_t *brushes);
-vec_t BrushVolume (bspbrush_t *brush);
-node_t *NodeForPoint (node_t *node, Vector& origin);
-
-void BoundBrush (bspbrush_t *brush);
-void FreeBrushList (bspbrush_t *brushes);
-node_t *PointInLeaf (node_t *node, Vector& point);
-
-tree_t *BrushBSP (bspbrush_t *brushlist, Vector& mins, Vector& maxs);
-
-#define PSIDE_FRONT 1
-#define PSIDE_BACK 2
-#define PSIDE_BOTH (PSIDE_FRONT|PSIDE_BACK)
-#define PSIDE_FACING 4
-int BrushBspBoxOnPlaneSide (const Vector& mins, const Vector& maxs, dplane_t *plane);
-extern qboolean WindingIsTiny (winding_t *w);
-
-//=============================================================================
-
-// portals.c
-
-int VisibleContents (int contents);
-
-void MakeHeadnodePortals (tree_t *tree);
-void MakeNodePortal (node_t *node);
-void SplitNodePortals (node_t *node);
-
-qboolean Portal_VisFlood (portal_t *p);
-
-qboolean FloodEntities (tree_t *tree);
-void FillOutside (node_t *headnode);
-void FloodAreas (tree_t *tree);
-void MarkVisibleSides (tree_t *tree, int start, int end, int detailScreen);
-void MarkVisibleSides (tree_t *tree, mapbrush_t **ppBrushes, int nCount );
-void FreePortal (portal_t *p);
-void EmitAreaPortals (node_t *headnode);
-
-void MakeTreePortals (tree_t *tree);
-
-//=============================================================================
-
-// glfile.c
-
-void OutputWinding (winding_t *w, FileHandle_t glview);
-void OutputWindingColor (winding_t *w, FileHandle_t glview, int r, int g, int b);
-void WriteGLView (tree_t *tree, char *source);
-void WriteGLViewFaces (tree_t *tree, const char *source);
-void WriteGLViewBrushList( bspbrush_t *pList, const char *pName );
-//=============================================================================
-
-// leakfile.c
-
-void LeakFile (tree_t *tree);
-void AreaportalLeakFile( tree_t *tree, portal_t *pStartPortal, portal_t *pEndPortal, node_t *pStart );
-
-//=============================================================================
-
-// prtfile.c
-
-void AddVisCluster( entity_t *pFuncVisCluster );
-void WritePortalFile (tree_t *tree);
-
-//=============================================================================
-
-// writebsp.c
-
-void SetModelNumbers (void);
-void SetLightStyles (void);
-
-void BeginBSPFile (void);
-void WriteBSP (node_t *headnode, face_t *pLeafFaceList);
-void EndBSPFile (void);
-void BeginModel (void);
-void EndModel (void);
-
-extern int firstmodeledge;
-extern int firstmodelface;
-
-//=============================================================================
-
-// faces.c
-
-void MakeFaces (node_t *headnode);
-void MakeDetailFaces (node_t *headnode);
-face_t *FixTjuncs( node_t *headnode, face_t *pLeafFaceList );
-
-face_t *AllocFace (void);
-void FreeFace (face_t *f);
-void FreeFaceList( face_t *pFaces );
-
-void MergeFaceList(face_t **pFaceList);
-void SubdivideFaceList(face_t **pFaceList);
-
-extern face_t *edgefaces[MAX_MAP_EDGES][2];
-
-
-//=============================================================================
-
-// tree.c
-
-void FreeTree (tree_t *tree);
-void FreeTree_r (node_t *node);
-void PrintTree_r (node_t *node, int depth);
-void FreeTreePortals_r (node_t *node);
-void PruneNodes_r (node_t *node);
-void PruneNodes (node_t *node);
-
-// Returns true if the entity is a func_occluder
-bool IsFuncOccluder( int entity_num );
-
-
-//=============================================================================
-// ivp.cpp
-class CPhysCollide;
-void EmitPhysCollision();
-void DumpCollideToGlView( CPhysCollide *pCollide, const char *pFilename );
-void EmitWaterVolumesForBSP( dmodel_t *pModel, node_t *headnode );
-
-//=============================================================================
-// find + find or create the texdata
-int FindTexData( const char *pName );
-int FindOrCreateTexData( const char *pName );
-// Add a clone of an existing texdata with a new name
-int AddCloneTexData( dtexdata_t *pExistingTexData, char const *cloneTexDataName );
-int FindOrCreateTexInfo( const texinfo_t &searchTexInfo );
-int FindAliasedTexData( const char *pName, dtexdata_t *sourceTexture );
-int FindTexInfo( const texinfo_t &searchTexInfo );
-
-//=============================================================================
-// normals.c
-void SaveVertexNormals( void );
-
-//=============================================================================
-// cubemap.cpp
-void Cubemap_InsertSample( const Vector& origin, int size );
-void Cubemap_CreateDefaultCubemaps( void );
-void Cubemap_SaveBrushSides( const char *pSideListStr );
-void Cubemap_FixupBrushSidesMaterials( void );
-void Cubemap_AttachDefaultCubemapToSpecularSides( void );
-// Add skipped cubemaps that are referenced by the engine
-void Cubemap_AddUnreferencedCubemaps( void );
-
-//=============================================================================
-// overlay.cpp
-#define OVERLAY_MAP_STRLEN 256
-
-struct mapoverlay_t
-{
- int nId;
- unsigned short m_nRenderOrder;
- char szMaterialName[OVERLAY_MAP_STRLEN];
- float flU[2];
- float flV[2];
- float flFadeDistMinSq;
- float flFadeDistMaxSq;
- Vector vecUVPoints[4];
- Vector vecOrigin;
- Vector vecBasis[3];
- CUtlVector<int> aSideList;
- CUtlVector<int> aFaceList;
-};
-
-extern CUtlVector<mapoverlay_t> g_aMapOverlays;
-extern CUtlVector<mapoverlay_t> g_aMapWaterOverlays;
-
-int Overlay_GetFromEntity( entity_t *pMapEnt );
-void Overlay_UpdateSideLists( int StartIndex );
-void Overlay_AddFaceToLists( int iFace, side_t *pSide );
-void Overlay_EmitOverlayFaces( void );
-void OverlayTransition_UpdateSideLists( int StartIndex );
-void OverlayTransition_AddFaceToLists( int iFace, side_t *pSide );
-void OverlayTransition_EmitOverlayFaces( void );
-void Overlay_Translate( mapoverlay_t *pOverlay, Vector &OriginOffset, QAngle &AngleOffset, matrix3x4_t &Matrix );
-
-//=============================================================================
-
-void RemoveAreaPortalBrushes_R( node_t *node );
-
-dtexdata_t *GetTexData( int index );
-
-#endif
-
+//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +// $NoKeywords: $ +// +//=============================================================================// + +#if !defined( VBSP_H ) +#define VBSP_H + + +#include "cmdlib.h" +#include "mathlib/vector.h" +#include "scriplib.h" +#include "polylib.h" +#include "threads.h" +#include "bsplib.h" +#include "qfiles.h" +#include "utilmatlib.h" +#include "ChunkFile.h" + +#ifdef WIN32 +#pragma warning( disable: 4706 ) +#endif + +class CUtlBuffer; + +#define MAX_BRUSH_SIDES 128 +#define CLIP_EPSILON 0.1 + +#define TEXINFO_NODE -1 // side is allready on a node + +// this will output glview files for the given brushmodel. Brushmodel 1 is the world, 2 is the first brush entity, etc. +#define DEBUG_BRUSHMODEL 0 + +struct portal_t; +struct node_t; + +struct plane_t : public dplane_t +{ + plane_t *hash_chain; + + plane_t() { normal.Init(); } +}; + + +struct brush_texture_t +{ + Vector UAxis; + Vector VAxis; + vec_t shift[2]; + vec_t rotate; + vec_t textureWorldUnitsPerTexel[2]; + vec_t lightmapWorldUnitsPerLuxel; + char name[TEXTURE_NAME_LENGTH]; + int flags; + + brush_texture_t() : UAxis(0,0,0), VAxis(0,0,0) {} +}; + +struct mapdispinfo_t; + +struct side_t +{ + int planenum; + int texinfo; + mapdispinfo_t *pMapDisp; + + winding_t *winding; + side_t *original; // bspbrush_t sides will reference the mapbrush_t sides + int contents; // from miptex + int surf; // from miptex + qboolean visible; // choose visble planes first + qboolean tested; // this plane allready checked as a split + qboolean bevel; // don't ever use for bsp splitting + + side_t *next; + int origIndex; + int id; // This is the unique id generated by worldcraft for this side. + unsigned int smoothingGroups; + CUtlVector<int> aOverlayIds; // List of overlays that reside on this side. + CUtlVector<int> aWaterOverlayIds; // List of water overlays that reside on this side. + bool m_bDynamicShadowsEnabled; // Goes into dface_t::SetDynamicShadowsEnabled(). +}; + +struct mapbrush_t +{ + int entitynum; + int brushnum; + int id; // The unique ID of this brush in the editor, used for reporting errors. + int contents; + Vector mins, maxs; + int numsides; + side_t *original_sides; +}; + +#define PLANENUM_LEAF -1 + +#define MAXEDGES 32 + +struct face_t +{ + int id; + + face_t *next; // on node + + // the chain of faces off of a node can be merged or split, + // but each face_t along the way will remain in the chain + // until the entire tree is freed + face_t *merged; // if set, this face isn't valid anymore + face_t *split[2]; // if set, this face isn't valid anymore + + portal_t *portal; + int texinfo; + int dispinfo; + // This is only for surfaces that are the boundaries of fog volumes + // (ie. water surfaces) + // All of the rest of the surfaces can look at their leaf to find out + // what fog volume they are in. + node_t *fogVolumeLeaf; + + int planenum; + int contents; // faces in different contents can't merge + int outputnumber; + winding_t *w; + int numpoints; + qboolean badstartvert; // tjunctions cannot be fixed without a midpoint vertex + int vertexnums[MAXEDGES]; + side_t *originalface; // save the "side" this face came from + int firstPrimID; + int numPrims; + unsigned int smoothingGroups; +}; + +void EmitFace( face_t *f, qboolean onNode ); + +struct mapdispinfo_t +{ + face_t face; + int entitynum; + int power; + int minTess; + float smoothingAngle; + Vector uAxis; + Vector vAxis; + Vector startPosition; + float alphaValues[MAX_DISPVERTS]; + float maxDispDist; + float dispDists[MAX_DISPVERTS]; + Vector vectorDisps[MAX_DISPVERTS]; + Vector vectorOffsets[MAX_DISPVERTS]; + int contents; + int brushSideID; + unsigned short triTags[MAX_DISPTRIS]; + int flags; + +#ifdef VSVMFIO + float m_elevation; // "elevation" + Vector m_offsetNormals[ MAX_DISPTRIS ]; // "offset_normals" +#endif // VSVMFIO + +}; + +extern int nummapdispinfo; +extern mapdispinfo_t mapdispinfo[MAX_MAP_DISPINFO]; + +extern float g_defaultLuxelSize; +extern float g_luxelScale; +extern float g_minLuxelScale; +extern bool g_BumpAll; +extern int g_nDXLevel; + +int GetDispInfoEntityNum( mapdispinfo_t *pDisp ); +void ComputeBoundsNoSkybox( ); + +struct bspbrush_t +{ + int id; + bspbrush_t *next; + Vector mins, maxs; + int side, testside; // side of node during construction + mapbrush_t *original; + int numsides; + side_t sides[6]; // variably sized +}; + + +#define MAX_NODE_BRUSHES 8 + +struct leafface_t +{ + face_t *pFace; + leafface_t *pNext; +}; + +struct node_t +{ + int id; + + // both leafs and nodes + int planenum; // -1 = leaf node + node_t *parent; + Vector mins, maxs; // valid after portalization + bspbrush_t *volume; // one for each leaf/node + + // nodes only + side_t *side; // the side that created the node + node_t *children[2]; + face_t *faces; // these are the cutup ones that live in the plane of "side". + + // leafs only + bspbrush_t *brushlist; // fragments of all brushes in this leaf + leafface_t *leaffacelist; + int contents; // OR of all brush contents + int occupied; // 1 or greater can reach entity + entity_t *occupant; // for leak file testing + int cluster; // for portalfile writing + int area; // for areaportals + portal_t *portals; // also on nodes during construction + int diskId; // dnodes or dleafs index after this has been emitted +}; + + +struct portal_t +{ + int id; + plane_t plane; + node_t *onnode; // NULL = outside box + node_t *nodes[2]; // [0] = front side of plane + portal_t *next[2]; + winding_t *winding; + qboolean sidefound; // false if ->side hasn't been checked + side_t *side; // NULL = non-visible + face_t *face[2]; // output face in bsp file +}; + + +struct tree_t +{ + node_t *headnode; + node_t outside_node; + Vector mins, maxs; + bool leaked; +}; + + +extern int entity_num; + +struct LoadSide_t; +struct LoadEntity_t; +class CManifest; + +class CMapFile +{ +public: + CMapFile( void ) { Init(); } + + void Init( void ); + + void AddPlaneToHash (plane_t *p); + int CreateNewFloatPlane (Vector& normal, vec_t dist); + int FindFloatPlane (Vector& normal, vec_t dist); + int PlaneFromPoints(const Vector &p0, const Vector &p1, const Vector &p2); + void AddBrushBevels (mapbrush_t *b); + qboolean MakeBrushWindings (mapbrush_t *ob); + void MoveBrushesToWorld( entity_t *mapent ); + void MoveBrushesToWorldGeneral( entity_t *mapent ); + void RemoveContentsDetailFromEntity( entity_t *mapent ); + int SideIDToIndex( int brushSideID ); + void AddLadderKeys( entity_t *mapent ); + ChunkFileResult_t LoadEntityCallback(CChunkFile *pFile, int nParam); + void ForceFuncAreaPortalWindowContents(); + ChunkFileResult_t LoadSideCallback(CChunkFile *pFile, LoadSide_t *pSideInfo); + ChunkFileResult_t LoadConnectionsKeyCallback(const char *szKey, const char *szValue, LoadEntity_t *pLoadEntity); + ChunkFileResult_t LoadSolidCallback(CChunkFile *pFile, LoadEntity_t *pLoadEntity); + void TestExpandBrushes(void); + + static char m_InstancePath[ MAX_PATH ]; + static void SetInstancePath( const char *pszInstancePath ); + static const char *GetInstancePath( void ) { return m_InstancePath; } + static bool DeterminePath( const char *pszBaseFileName, const char *pszInstanceFileName, char *pszOutFileName ); + + void CheckForInstances( const char *pszFileName ); + void MergeInstance( entity_t *pInstanceEntity, CMapFile *Instance ); + void MergePlanes( entity_t *pInstanceEntity, CMapFile *Instance, Vector &InstanceOrigin, QAngle &InstanceAngle, matrix3x4_t &InstanceMatrix ); + void MergeBrushes( entity_t *pInstanceEntity, CMapFile *Instance, Vector &InstanceOrigin, QAngle &InstanceAngle, matrix3x4_t &InstanceMatrix ); + void MergeBrushSides( entity_t *pInstanceEntity, CMapFile *Instance, Vector &InstanceOrigin, QAngle &InstanceAngle, matrix3x4_t &InstanceMatrix ); + void ReplaceInstancePair( epair_t *pPair, entity_t *pInstanceEntity ); + void MergeEntities( entity_t *pInstanceEntity, CMapFile *Instance, Vector &InstanceOrigin, QAngle &InstanceAngle, matrix3x4_t &InstanceMatrix ); + void MergeOverlays( entity_t *pInstanceEntity, CMapFile *Instance, Vector &InstanceOrigin, QAngle &InstanceAngle, matrix3x4_t &InstanceMatrix ); + + static int m_InstanceCount; + static int c_areaportals; + + plane_t mapplanes[MAX_MAP_PLANES]; + int nummapplanes; + + #define PLANE_HASHES 1024 + plane_t *planehash[PLANE_HASHES]; + + int nummapbrushes; + mapbrush_t mapbrushes[MAX_MAP_BRUSHES]; + + Vector map_mins, map_maxs; + + int nummapbrushsides; + side_t brushsides[MAX_MAP_BRUSHSIDES]; + + brush_texture_t side_brushtextures[MAX_MAP_BRUSHSIDES]; + + int num_entities; + entity_t entities[MAX_MAP_ENTITIES]; + + int c_boxbevels; + int c_edgebevels; + int c_clipbrushes; + int g_ClipTexinfo; + + class CConnectionPairs + { + public: + CConnectionPairs( epair_t *pair, CConnectionPairs *next ) + { + m_Pair = pair; + m_Next = next; + } + + epair_t *m_Pair; + CConnectionPairs *m_Next; + }; + + CConnectionPairs *m_ConnectionPairs; + + int m_StartMapOverlays; + int m_StartMapWaterOverlays; +}; + +extern CMapFile *g_MainMap; +extern CMapFile *g_LoadingMap; + +extern CUtlVector< CMapFile * > g_Maps; + +extern int g_nMapFileVersion; + +extern qboolean noprune; +extern qboolean nodetail; +extern qboolean fulldetail; +extern qboolean nomerge; +extern qboolean nomergewater; +extern qboolean nosubdiv; +extern qboolean nowater; +extern qboolean noweld; +extern qboolean noshare; +extern qboolean notjunc; +extern qboolean nocsg; +extern qboolean noopt; +extern qboolean dumpcollide; +extern qboolean nodetailcuts; +extern qboolean g_DumpStaticProps; +extern qboolean g_bSkyVis; +extern vec_t microvolume; +extern bool g_snapAxialPlanes; +extern bool g_NodrawTriggers; +extern bool g_DisableWaterLighting; +extern bool g_bAllowDetailCracks; +extern bool g_bNoVirtualMesh; +extern char outbase[32]; + +extern char source[1024]; +extern char mapbase[ 64 ]; +extern CUtlVector<int> g_SkyAreas; + +bool LoadMapFile( const char *pszFileName ); +int GetVertexnum( Vector& v ); +bool Is3DSkyboxArea( int area ); + +//============================================================================= + +// textures.c + +struct textureref_t +{ + char name[TEXTURE_NAME_LENGTH]; + int flags; + float lightmapWorldUnitsPerLuxel; + int contents; +}; + +extern textureref_t textureref[MAX_MAP_TEXTURES]; + +int FindMiptex (const char *name); + +int TexinfoForBrushTexture (plane_t *plane, brush_texture_t *bt, const Vector& origin); +int GetSurfaceProperties2( MaterialSystemMaterial_t matID, const char *pMatName ); + +extern int g_SurfaceProperties[MAX_MAP_TEXDATA]; +void LoadSurfaceProperties( void ); + +int PointLeafnum ( dmodel_t* pModel, const Vector& p ); + +//============================================================================= + +void FindGCD (int *v); + +mapbrush_t *Brush_LoadEntity (entity_t *ent); +int PlaneTypeForNormal (Vector& normal); +qboolean MakeBrushPlanes (mapbrush_t *b); +int FindIntPlane (int *inormal, int *iorigin); +void CreateBrush (int brushnum); + + +//============================================================================= +// detail objects +//============================================================================= + +void LoadEmitDetailObjectDictionary( char const* pGameDir ); +void EmitDetailObjects(); + +//============================================================================= +// static props +//============================================================================= + +void EmitStaticProps(); +bool LoadStudioModel( char const* pFileName, char const* pEntityType, CUtlBuffer& buf ); + +//============================================================================= +//============================================================================= +// procedurally created .vmt files +//============================================================================= + +void EmitStaticProps(); + +// draw.c + +extern Vector draw_mins, draw_maxs; +extern bool g_bLightIfMissing; + +void Draw_ClearWindow (void); +void DrawWinding (winding_t *w); + +void GLS_BeginScene (void); +void GLS_Winding (winding_t *w, int code); +void GLS_EndScene (void); + +//============================================================================= + +// csg + +enum detailscreen_e +{ + FULL_DETAIL = 0, + ONLY_DETAIL = 1, + NO_DETAIL = 2, +}; + +#define TRANSPARENT_CONTENTS (CONTENTS_GRATE|CONTENTS_WINDOW) + +#include "csg.h" + +//============================================================================= + +// brushbsp + +void WriteBrushList (char *name, bspbrush_t *brush, qboolean onlyvis); + +bspbrush_t *CopyBrush (bspbrush_t *brush); + +void SplitBrush (bspbrush_t *brush, int planenum, + bspbrush_t **front, bspbrush_t **back); + +tree_t *AllocTree (void); +node_t *AllocNode (void); +bspbrush_t *AllocBrush (int numsides); +int CountBrushList (bspbrush_t *brushes); +void FreeBrush (bspbrush_t *brushes); +vec_t BrushVolume (bspbrush_t *brush); +node_t *NodeForPoint (node_t *node, Vector& origin); + +void BoundBrush (bspbrush_t *brush); +void FreeBrushList (bspbrush_t *brushes); +node_t *PointInLeaf (node_t *node, Vector& point); + +tree_t *BrushBSP (bspbrush_t *brushlist, Vector& mins, Vector& maxs); + +#define PSIDE_FRONT 1 +#define PSIDE_BACK 2 +#define PSIDE_BOTH (PSIDE_FRONT|PSIDE_BACK) +#define PSIDE_FACING 4 +int BrushBspBoxOnPlaneSide (const Vector& mins, const Vector& maxs, dplane_t *plane); +extern qboolean WindingIsTiny (winding_t *w); + +//============================================================================= + +// portals.c + +int VisibleContents (int contents); + +void MakeHeadnodePortals (tree_t *tree); +void MakeNodePortal (node_t *node); +void SplitNodePortals (node_t *node); + +qboolean Portal_VisFlood (portal_t *p); + +qboolean FloodEntities (tree_t *tree); +void FillOutside (node_t *headnode); +void FloodAreas (tree_t *tree); +void MarkVisibleSides (tree_t *tree, int start, int end, int detailScreen); +void MarkVisibleSides (tree_t *tree, mapbrush_t **ppBrushes, int nCount ); +void FreePortal (portal_t *p); +void EmitAreaPortals (node_t *headnode); + +void MakeTreePortals (tree_t *tree); + +//============================================================================= + +// glfile.c + +void OutputWinding (winding_t *w, FileHandle_t glview); +void OutputWindingColor (winding_t *w, FileHandle_t glview, int r, int g, int b); +void WriteGLView (tree_t *tree, char *source); +void WriteGLViewFaces (tree_t *tree, const char *source); +void WriteGLViewBrushList( bspbrush_t *pList, const char *pName ); +//============================================================================= + +// leakfile.c + +void LeakFile (tree_t *tree); +void AreaportalLeakFile( tree_t *tree, portal_t *pStartPortal, portal_t *pEndPortal, node_t *pStart ); + +//============================================================================= + +// prtfile.c + +void AddVisCluster( entity_t *pFuncVisCluster ); +void WritePortalFile (tree_t *tree); + +//============================================================================= + +// writebsp.c + +void SetModelNumbers (void); +void SetLightStyles (void); + +void BeginBSPFile (void); +void WriteBSP (node_t *headnode, face_t *pLeafFaceList); +void EndBSPFile (void); +void BeginModel (void); +void EndModel (void); + +extern int firstmodeledge; +extern int firstmodelface; + +//============================================================================= + +// faces.c + +void MakeFaces (node_t *headnode); +void MakeDetailFaces (node_t *headnode); +face_t *FixTjuncs( node_t *headnode, face_t *pLeafFaceList ); + +face_t *AllocFace (void); +void FreeFace (face_t *f); +void FreeFaceList( face_t *pFaces ); + +void MergeFaceList(face_t **pFaceList); +void SubdivideFaceList(face_t **pFaceList); + +extern face_t *edgefaces[MAX_MAP_EDGES][2]; + + +//============================================================================= + +// tree.c + +void FreeTree (tree_t *tree); +void FreeTree_r (node_t *node); +void PrintTree_r (node_t *node, int depth); +void FreeTreePortals_r (node_t *node); +void PruneNodes_r (node_t *node); +void PruneNodes (node_t *node); + +// Returns true if the entity is a func_occluder +bool IsFuncOccluder( int entity_num ); + + +//============================================================================= +// ivp.cpp +class CPhysCollide; +void EmitPhysCollision(); +void DumpCollideToGlView( CPhysCollide *pCollide, const char *pFilename ); +void EmitWaterVolumesForBSP( dmodel_t *pModel, node_t *headnode ); + +//============================================================================= +// find + find or create the texdata +int FindTexData( const char *pName ); +int FindOrCreateTexData( const char *pName ); +// Add a clone of an existing texdata with a new name +int AddCloneTexData( dtexdata_t *pExistingTexData, char const *cloneTexDataName ); +int FindOrCreateTexInfo( const texinfo_t &searchTexInfo ); +int FindAliasedTexData( const char *pName, dtexdata_t *sourceTexture ); +int FindTexInfo( const texinfo_t &searchTexInfo ); + +//============================================================================= +// normals.c +void SaveVertexNormals( void ); + +//============================================================================= +// cubemap.cpp +void Cubemap_InsertSample( const Vector& origin, int size ); +void Cubemap_CreateDefaultCubemaps( void ); +void Cubemap_SaveBrushSides( const char *pSideListStr ); +void Cubemap_FixupBrushSidesMaterials( void ); +void Cubemap_AttachDefaultCubemapToSpecularSides( void ); +// Add skipped cubemaps that are referenced by the engine +void Cubemap_AddUnreferencedCubemaps( void ); + +//============================================================================= +// overlay.cpp +#define OVERLAY_MAP_STRLEN 256 + +struct mapoverlay_t +{ + int nId; + unsigned short m_nRenderOrder; + char szMaterialName[OVERLAY_MAP_STRLEN]; + float flU[2]; + float flV[2]; + float flFadeDistMinSq; + float flFadeDistMaxSq; + Vector vecUVPoints[4]; + Vector vecOrigin; + Vector vecBasis[3]; + CUtlVector<int> aSideList; + CUtlVector<int> aFaceList; +}; + +extern CUtlVector<mapoverlay_t> g_aMapOverlays; +extern CUtlVector<mapoverlay_t> g_aMapWaterOverlays; + +int Overlay_GetFromEntity( entity_t *pMapEnt ); +void Overlay_UpdateSideLists( int StartIndex ); +void Overlay_AddFaceToLists( int iFace, side_t *pSide ); +void Overlay_EmitOverlayFaces( void ); +void OverlayTransition_UpdateSideLists( int StartIndex ); +void OverlayTransition_AddFaceToLists( int iFace, side_t *pSide ); +void OverlayTransition_EmitOverlayFaces( void ); +void Overlay_Translate( mapoverlay_t *pOverlay, Vector &OriginOffset, QAngle &AngleOffset, matrix3x4_t &Matrix ); + +//============================================================================= + +void RemoveAreaPortalBrushes_R( node_t *node ); + +dtexdata_t *GetTexData( int index ); + +#endif + |