From 7f267853f4529fba0a19855dc2a741496c89867a Mon Sep 17 00:00:00 2001 From: nillerusr Date: Mon, 14 Aug 2023 18:26:28 +0300 Subject: [PATCH] vtf: fix vtf loading for windows arm( and for other platforms ) --- public/vtf/vtf.h | 86 ++++++++++++++++++++++++++++++++++-------------- vtf/vtf.cpp | 55 +++++++++++++++++++++---------- 2 files changed, 98 insertions(+), 43 deletions(-) diff --git a/public/vtf/vtf.h b/public/vtf/vtf.h index 436468fe..977d79df 100644 --- a/public/vtf/vtf.h +++ b/public/vtf/vtf.h @@ -455,7 +455,9 @@ bool GetVTFPreload360Data( const char *pDebugName, CUtlBuffer &fileBufferIn, CUt // compiler pads, the 360 compiler does NOT. //----------------------------------------------------------------------------- -struct VTFFileBaseHeader_t +// nillerusr: try to avoid problems with pragma pack, remove c++ inheritance to make this structs platform-independent + +struct alignas(16) VTFFileBaseHeader_t { DECLARE_BYTESWAP_DATADESC(); char fileTypeString[4]; // "VTF" Valve texture file @@ -463,9 +465,13 @@ struct VTFFileBaseHeader_t int headerSize; }; -struct VTFFileHeaderV7_1_t : public VTFFileBaseHeader_t +struct alignas(16) VTFFileHeaderV7_1_t { DECLARE_BYTESWAP_DATADESC(); + char fileTypeString[4]; // "VTF" Valve texture file + int version[2]; // version[0].version[1] + int headerSize; + unsigned short width; unsigned short height; unsigned int flags; @@ -484,13 +490,65 @@ struct VTFFileHeaderV7_1_t : public VTFFileBaseHeader_t unsigned char lowResImageHeight; }; -struct VTFFileHeaderV7_2_t : public VTFFileHeaderV7_1_t +struct alignas(16) VTFFileHeaderV7_2_t { DECLARE_BYTESWAP_DATADESC(); + char fileTypeString[4]; // "VTF" Valve texture file + int version[2]; // version[0].version[1] + int headerSize; + + unsigned short width; + unsigned short height; + unsigned int flags; + unsigned short numFrames; + unsigned short startFrame; + + // must manually align in order to maintain pack(1) expected layout with existing binaries + char pad1[4]; + VectorAligned reflectivity; + + float bumpScale; + ImageFormat imageFormat; + unsigned char numMipLevels; + ImageFormat lowResImageFormat; + unsigned char lowResImageWidth; + unsigned char lowResImageHeight; unsigned short depth; }; +struct alignas(16) VTFFileHeaderV7_3_t +{ + DECLARE_BYTESWAP_DATADESC(); + + char fileTypeString[4]; // "VTF" Valve texture file + int version[2]; // version[0].version[1] + int headerSize; + + unsigned short width; + unsigned short height; + unsigned int flags; + unsigned short numFrames; + unsigned short startFrame; + + // must manually align in order to maintain pack(1) expected layout with existing binaries + char pad1[4]; + VectorAligned reflectivity; + + float bumpScale; + ImageFormat imageFormat; + unsigned char numMipLevels; + ImageFormat lowResImageFormat; + unsigned char lowResImageWidth; + unsigned char lowResImageHeight; + unsigned short depth; + + char pad4[3]; + unsigned int numResources; +}; + +typedef VTFFileHeaderV7_3_t VTFFileHeader_t; + #define BYTE_POS( byteVal, shft ) uint32( uint32(uint8(byteVal)) << uint8(shft * 8) ) #if !defined( _X360 ) #define MK_VTF_RSRC_ID(a, b, c) uint32( BYTE_POS(a, 0) | BYTE_POS(b, 1) | BYTE_POS(c, 2) ) @@ -535,28 +593,6 @@ struct ResourceEntryInfo unsigned int resData; // Resource data or offset from the beginning of the file }; -struct VTFFileHeaderV7_3_t : public VTFFileHeaderV7_2_t -{ - DECLARE_BYTESWAP_DATADESC(); - - char pad4[3]; - unsigned int numResources; - -#if defined( _X360 ) || defined( POSIX ) - // must manually align in order to maintain pack(1) expected layout with existing binaries - char pad5[8]; -#endif - - // AFTER THE IMPLICIT PADDING CAUSED BY THE COMPILER.... - // *** followed by *** ResourceEntryInfo resources[0]; - // Array of resource entry infos sorted ascending by type -}; - -struct VTFFileHeader_t : public VTFFileHeaderV7_3_t -{ - DECLARE_BYTESWAP_DATADESC(); -}; - #define VTF_X360_MAJOR_VERSION 0x0360 #define VTF_X360_MINOR_VERSION 8 struct VTFFileHeaderX360_t : public VTFFileBaseHeader_t diff --git a/vtf/vtf.cpp b/vtf/vtf.cpp index 9209d569..0dad4722 100644 --- a/vtf/vtf.cpp +++ b/vtf/vtf.cpp @@ -27,7 +27,10 @@ BEGIN_BYTESWAP_DATADESC( VTFFileBaseHeader_t ) DEFINE_FIELD( headerSize, FIELD_INTEGER ), END_DATADESC() -BEGIN_BYTESWAP_DATADESC_( VTFFileHeaderV7_1_t, VTFFileBaseHeader_t ) +BEGIN_BYTESWAP_DATADESC( VTFFileHeaderV7_1_t ) + DEFINE_ARRAY( fileTypeString, FIELD_CHARACTER, 4 ), + DEFINE_ARRAY( version, FIELD_INTEGER, 2 ), + DEFINE_FIELD( headerSize, FIELD_INTEGER ), DEFINE_FIELD( width, FIELD_SHORT ), DEFINE_FIELD( height, FIELD_SHORT ), DEFINE_FIELD( flags, FIELD_INTEGER ), @@ -42,17 +45,45 @@ BEGIN_BYTESWAP_DATADESC_( VTFFileHeaderV7_1_t, VTFFileBaseHeader_t ) DEFINE_FIELD( lowResImageHeight, FIELD_CHARACTER ), END_DATADESC() -BEGIN_BYTESWAP_DATADESC_( VTFFileHeaderV7_2_t, VTFFileHeaderV7_1_t ) +BEGIN_BYTESWAP_DATADESC( VTFFileHeaderV7_2_t ) + DEFINE_ARRAY( fileTypeString, FIELD_CHARACTER, 4 ), + DEFINE_ARRAY( version, FIELD_INTEGER, 2 ), + DEFINE_FIELD( headerSize, FIELD_INTEGER ), + DEFINE_FIELD( width, FIELD_SHORT ), + DEFINE_FIELD( height, FIELD_SHORT ), + DEFINE_FIELD( flags, FIELD_INTEGER ), + DEFINE_FIELD( numFrames, FIELD_SHORT ), + DEFINE_FIELD( startFrame, FIELD_SHORT ), + DEFINE_FIELD( reflectivity, FIELD_VECTOR ), + DEFINE_FIELD( bumpScale, FIELD_FLOAT ), + DEFINE_FIELD( imageFormat, FIELD_INTEGER ), + DEFINE_FIELD( numMipLevels, FIELD_CHARACTER ), + DEFINE_FIELD( lowResImageFormat, FIELD_INTEGER ), + DEFINE_FIELD( lowResImageWidth, FIELD_CHARACTER ), + DEFINE_FIELD( lowResImageHeight, FIELD_CHARACTER ), DEFINE_FIELD( depth, FIELD_SHORT ), END_DATADESC() -BEGIN_BYTESWAP_DATADESC_( VTFFileHeaderV7_3_t, VTFFileHeaderV7_2_t ) +BEGIN_BYTESWAP_DATADESC( VTFFileHeaderV7_3_t ) + DEFINE_ARRAY( fileTypeString, FIELD_CHARACTER, 4 ), + DEFINE_ARRAY( version, FIELD_INTEGER, 2 ), + DEFINE_FIELD( headerSize, FIELD_INTEGER ), + DEFINE_FIELD( width, FIELD_SHORT ), + DEFINE_FIELD( height, FIELD_SHORT ), + DEFINE_FIELD( flags, FIELD_INTEGER ), + DEFINE_FIELD( numFrames, FIELD_SHORT ), + DEFINE_FIELD( startFrame, FIELD_SHORT ), + DEFINE_FIELD( reflectivity, FIELD_VECTOR ), + DEFINE_FIELD( bumpScale, FIELD_FLOAT ), + DEFINE_FIELD( imageFormat, FIELD_INTEGER ), + DEFINE_FIELD( numMipLevels, FIELD_CHARACTER ), + DEFINE_FIELD( lowResImageFormat, FIELD_INTEGER ), + DEFINE_FIELD( lowResImageWidth, FIELD_CHARACTER ), + DEFINE_FIELD( lowResImageHeight, FIELD_CHARACTER ), + DEFINE_FIELD( depth, FIELD_SHORT ), DEFINE_FIELD( numResources, FIELD_INTEGER ), END_DATADESC() -BEGIN_BYTESWAP_DATADESC_( VTFFileHeader_t, VTFFileHeaderV7_2_t ) -END_DATADESC() - BEGIN_BYTESWAP_DATADESC_( VTFFileHeaderX360_t, VTFFileBaseHeader_t ) DEFINE_FIELD( flags, FIELD_INTEGER ), DEFINE_FIELD( width, FIELD_SHORT ), @@ -903,23 +934,11 @@ static bool ReadHeaderFromBufferPastBaseHeader( CUtlBuffer &buf, VTFFileHeader_t else if ( header.version[1] == 2 ) { buf.Get( pBuf, sizeof(VTFFileHeaderV7_2_t) - sizeof(VTFFileBaseHeader_t) ); - - #if defined( _X360 ) || defined (POSIX) - // read 15 dummy bytes to be properly positioned with 7.2 PC data - byte dummy[15]; - buf.Get( dummy, 15 ); - #endif } else if ( header.version[1] == 1 || header.version[1] == 0 ) { // previous version 7.0 or 7.1 buf.Get( pBuf, sizeof(VTFFileHeaderV7_1_t) - sizeof(VTFFileBaseHeader_t) ); - - #if defined( _X360 ) || defined (POSIX) - // read a dummy byte to be properly positioned with 7.0/1 PC data - byte dummy; - buf.Get( &dummy, 1 ); - #endif } else {