From 68abca0453499f5eb610bb3b9e0c07fa31c7d0e7 Mon Sep 17 00:00:00 2001 From: EnderZip Date: Sat, 2 Oct 2021 14:25:36 +0700 Subject: [PATCH] partial dota 2's 23 bsp support uncomment #define BSP23 in bspfile.h to enable it --- public/bspfile.h | 21 ++++++++++++++++---- utils/common/bsplib.cpp | 43 +++++++++++++++++++++++++++-------------- 2 files changed, 45 insertions(+), 19 deletions(-) diff --git a/public/bspfile.h b/public/bspfile.h index 1648025..d3de6b7 100644 --- a/public/bspfile.h +++ b/public/bspfile.h @@ -22,8 +22,18 @@ // MINBSPVERSION is the minimum acceptable version. The engine will load MINBSPVERSION through BSPVERSION #define MINBSPVERSION 19 -#define BSPVERSION 21 +// Uncomment this will enable Dota 2's bsp 23 support +// +// WARNING: THIS WILL BREAK COMPATIBILTY WITH OLDER MAPS!!! +// +//#define BSP23 + +#ifdef BSP23 +#define BSPVERSION 23 +#else +#define BSPVERSION 21 +#endif // This needs to match the value in gl_lightmap.h // Need to dynamically allocate the weights and light values in radial_t to make this variable. @@ -658,6 +668,7 @@ public: int minTess; // minimum tesselation allowed float smoothingAngle; // lighting smoothing angle int contents; // surface contents + int unknown1; // unknown, for bsp 23 unsigned short m_iMapFace; // Which map face this displacement comes from. @@ -666,6 +677,8 @@ public: int m_iLightmapSamplePositionStart; // Index into LUMP_DISP_LIGHTMAP_SAMPLE_POSITIONS. + int unknown2; // unknown, for bsp 23 + CDispNeighbor m_EdgeNeighbors[4]; // Indexed by NEIGHBOREDGE_ defines. CDispCornerNeighbors m_CornerNeighbors[4]; // Indexed by CORNER_ defines. @@ -1041,10 +1054,10 @@ struct doverlay_t short nTexInfo; // Accessors.. - void SetFaceCount( unsigned short count ); + void SetFaceCount(unsigned short count); unsigned short GetFaceCount() const; - void SetRenderOrder( unsigned short order ); + void SetRenderOrder(unsigned short order); unsigned short GetRenderOrder() const; private: @@ -1052,6 +1065,7 @@ private: public: int aFaces[OVERLAY_BSP_FACE_COUNT]; + int unknown; //bsp 23 float flU[2]; float flV[2]; Vector vecUVPoints[4]; @@ -1059,7 +1073,6 @@ public: Vector vecBasisNormal; }; - inline void doverlay_t::SetFaceCount( unsigned short count ) { m_nFaceCountAndRenderOrder &= OVERLAY_RENDER_ORDER_MASK; diff --git a/utils/common/bsplib.cpp b/utils/common/bsplib.cpp index 1ccc02c..05e2897 100644 --- a/utils/common/bsplib.cpp +++ b/utils/common/bsplib.cpp @@ -142,9 +142,15 @@ BEGIN_BYTESWAP_DATADESC( ddispinfo_t ) DEFINE_FIELD( minTess, FIELD_INTEGER ), DEFINE_FIELD( smoothingAngle, FIELD_FLOAT ), DEFINE_FIELD( contents, FIELD_INTEGER ), +#ifdef BSP23 + DEFINE_FIELD( unknown1, FIELD_INTEGER), +#endif DEFINE_FIELD( m_iMapFace, FIELD_SHORT ), DEFINE_FIELD( m_iLightmapAlphaStart, FIELD_INTEGER ), DEFINE_FIELD( m_iLightmapSamplePositionStart, FIELD_INTEGER ), +#ifdef BSP23 + DEFINE_FIELD( unknown2, FIELD_INTEGER), +#endif DEFINE_EMBEDDED_ARRAY( m_EdgeNeighbors, 4 ), DEFINE_EMBEDDED_ARRAY( m_CornerNeighbors, 4 ), DEFINE_ARRAY( m_AllowedVerts, FIELD_INTEGER, ddispinfo_t::ALLOWEDVERTS_SIZE ), // unsigned long @@ -311,16 +317,19 @@ BEGIN_BYTESWAP_DATADESC( dcubemapsample_t ) DEFINE_FIELD( size, FIELD_CHARACTER ), END_BYTESWAP_DATADESC() -BEGIN_BYTESWAP_DATADESC( doverlay_t ) - DEFINE_FIELD( nId, FIELD_INTEGER ), - DEFINE_FIELD( nTexInfo, FIELD_SHORT ), - DEFINE_FIELD( m_nFaceCountAndRenderOrder, FIELD_SHORT ), - DEFINE_ARRAY( aFaces, FIELD_INTEGER, OVERLAY_BSP_FACE_COUNT ), - DEFINE_ARRAY( flU, FIELD_FLOAT, 2 ), - DEFINE_ARRAY( flV, FIELD_FLOAT, 2 ), - DEFINE_ARRAY( vecUVPoints, FIELD_VECTOR, 4 ), - DEFINE_FIELD( vecOrigin, FIELD_VECTOR ), - DEFINE_FIELD( vecBasisNormal, FIELD_VECTOR ), +BEGIN_BYTESWAP_DATADESC(doverlay_t) + DEFINE_FIELD(nId, FIELD_INTEGER), + DEFINE_FIELD(nTexInfo, FIELD_SHORT), + DEFINE_FIELD(m_nFaceCountAndRenderOrder, FIELD_SHORT), + DEFINE_ARRAY(aFaces, FIELD_INTEGER, OVERLAY_BSP_FACE_COUNT), +#ifdef BSP23 + DEFINE_FIELD(unknown, FIELD_INTEGER), +#endif + DEFINE_ARRAY(flU, FIELD_FLOAT, 2), + DEFINE_ARRAY(flV, FIELD_FLOAT, 2), + DEFINE_ARRAY(vecUVPoints, FIELD_VECTOR, 4), + DEFINE_FIELD(vecOrigin, FIELD_VECTOR), + DEFINE_FIELD(vecBasisNormal, FIELD_VECTOR), END_BYTESWAP_DATADESC() BEGIN_BYTESWAP_DATADESC( dwateroverlay_t ) @@ -607,6 +616,7 @@ dtexdata_t dtexdata[MAX_MAP_TEXDATA]; // displacement map bsp file info: dispinfo // CUtlVector g_dispinfo; + CUtlVector g_DispVerts; CUtlVector g_DispTris; CUtlVector g_DispLightmapSamplePositions; // LUMP_DISP_LIGHTMAP_SAMPLE_POSITIONS @@ -2218,8 +2228,9 @@ void LoadBSPFile( const char *filename ) numnodes = CopyLump( LUMP_NODES, dnodes ); CopyLump( LUMP_TEXINFO, texinfo ); numtexdata = CopyLump( LUMP_TEXDATA, dtexdata ); - - CopyLump( LUMP_DISPINFO, g_dispinfo ); + + CopyLump(LUMP_DISPINFO, g_dispinfo); + CopyLump( LUMP_DISP_VERTS, g_DispVerts ); CopyLump( LUMP_DISP_TRIS, g_DispTris ); CopyLump( FIELD_CHARACTER, LUMP_DISP_LIGHTMAP_SAMPLE_POSITIONS, g_DispLightmapSamplePositions ); @@ -2648,7 +2659,8 @@ void WriteBSPFile( const char *filename, char *pUnused ) AddLump( LUMP_TEXINFO, texinfo ); AddLump( LUMP_TEXDATA, dtexdata, numtexdata ); - AddLump( LUMP_DISPINFO, g_dispinfo ); + AddLump(LUMP_DISPINFO, g_dispinfo); + AddLump( LUMP_DISP_VERTS, g_DispVerts ); AddLump( LUMP_DISP_TRIS, g_DispTris ); AddLump( LUMP_DISP_LIGHTMAP_SAMPLE_POSITIONS, g_DispLightmapSamplePositions ); @@ -2880,7 +2892,8 @@ void PrintBSPFileSizes (void) totalmemory += ArrayUsage( "texinfos", texinfo.Count(),MAX_MAP_TEXINFO, sizeof(texinfo_t) ); totalmemory += ArrayUsage( "texdata", numtexdata, ENTRIES(dtexdata), ENTRYSIZE(dtexdata) ); - totalmemory += ArrayUsage( "dispinfos", g_dispinfo.Count(), 0, sizeof( ddispinfo_t ) ); + totalmemory += ArrayUsage("dispinfos", g_dispinfo.Count(), 0, sizeof(ddispinfo_t)); + totalmemory += ArrayUsage( "disp_verts", g_DispVerts.Count(), 0, sizeof( g_DispVerts[0] ) ); totalmemory += ArrayUsage( "disp_tris", g_DispTris.Count(), 0, sizeof( g_DispTris[0] ) ); totalmemory += ArrayUsage( "disp_lmsamples",g_DispLightmapSamplePositions.Count(),0,sizeof( g_DispLightmapSamplePositions[0] ) ); @@ -4854,7 +4867,7 @@ bool SwapBSPFile( const char *pInFilename, const char *pOutFilename, bool bSwapO SwapLumpToDisk( LUMP_NODES ); SwapLumpToDisk( LUMP_TEXINFO ); SwapLumpToDisk( LUMP_TEXDATA ); - SwapLumpToDisk( LUMP_DISPINFO ); + SwapLumpToDisk(LUMP_DISPINFO); SwapLumpToDisk( LUMP_DISP_VERTS ); SwapLumpToDisk( LUMP_DISP_TRIS ); SwapLumpToDisk( FIELD_CHARACTER, LUMP_DISP_LIGHTMAP_SAMPLE_POSITIONS );