2017-01-20 08:36:52 -05:00
# include "STDInclude.hpp"
2016-01-22 05:59:43 -05:00
2019-02-01 16:16:42 -05:00
# define IW4X_TECHSET_VERSION "0"
2016-01-22 05:59:43 -05:00
namespace Assets
{
2019-02-01 16:16:42 -05:00
void IMaterialPixelShader : : load ( Game : : XAssetHeader * header , const std : : string & name , Components : : ZoneBuilder : : Zone * builder )
{
if ( ! header - > data ) this - > loadNative ( header , name , builder ) ; // Check if there is a native one
if ( ! header - > data ) this - > loadBinary ( header , name , builder ) ; // Check if we need to import a new one into the game
}
void IMaterialPixelShader : : loadNative ( Game : : XAssetHeader * header , const std : : string & name , Components : : ZoneBuilder : : Zone * /*builder*/ )
{
header - > pixelShader = Components : : AssetHandler : : FindOriginalAsset ( this - > getType ( ) , name . data ( ) ) . pixelShader ;
}
void IMaterialPixelShader : : loadBinary ( Game : : XAssetHeader * header , const std : : string & name , Components : : ZoneBuilder : : Zone * builder )
{
Components : : FileSystem : : File psFile ( Utils : : String : : VA ( " ps/%s.iw4xPS " , name . data ( ) ) ) ;
if ( ! psFile . exists ( ) ) return ;
Utils : : Stream : : Reader reader ( builder - > getAllocator ( ) , psFile . getBuffer ( ) ) ;
char * magic = reader . readArray < char > ( 8 ) ;
if ( std : : memcmp ( magic , " IW4xPIXL " , 8 ) )
{
Components : : Logger : : Error ( 0 , " Reading pixel shader '%s' failed, header is invalid! " , name . data ( ) ) ;
}
std : : string version ;
version . push_back ( reader . read < char > ( ) ) ;
if ( version ! = IW4X_TECHSET_VERSION )
{
Components : : Logger : : Error ( " Reading pixel shader '%s' failed, expected version is %d, but it was %d! " , name . data ( ) , atoi ( IW4X_TECHSET_VERSION ) , atoi ( version . data ( ) ) ) ;
}
Game : : MaterialPixelShader * asset = reader . readObject < Game : : MaterialPixelShader > ( ) ;
if ( asset - > name )
{
asset - > name = reader . readCString ( ) ;
}
if ( asset - > prog . loadDef . program )
{
asset - > prog . loadDef . program = reader . readArray < unsigned int > ( asset - > prog . loadDef . programSize ) ;
}
header - > pixelShader = asset ;
}
2016-11-20 08:09:07 -05:00
void IMaterialPixelShader : : save ( Game : : XAssetHeader header , Components : : ZoneBuilder : : Zone * builder )
2016-01-22 05:59:43 -05:00
{
2016-11-20 08:09:07 -05:00
AssertSize ( Game : : MaterialPixelShader , 16 ) ;
2016-01-22 05:59:43 -05:00
2016-11-20 08:09:07 -05:00
Utils : : Stream * buffer = builder - > getBuffer ( ) ;
2016-01-22 05:59:43 -05:00
Game : : MaterialPixelShader * asset = header . pixelShader ;
2016-11-20 08:09:07 -05:00
Game : : MaterialPixelShader * dest = buffer - > dest < Game : : MaterialPixelShader > ( ) ;
buffer - > save ( asset ) ;
2016-01-22 05:59:43 -05:00
2016-11-20 08:09:07 -05:00
buffer - > pushBlock ( Game : : XFILE_BLOCK_VIRTUAL ) ;
2016-01-22 05:59:43 -05:00
if ( asset - > name )
{
2016-11-20 08:09:07 -05:00
buffer - > saveString ( builder - > getAssetName ( this - > getType ( ) , asset - > name ) ) ;
2016-06-10 07:52:55 -04:00
Utils : : Stream : : ClearPointer ( & dest - > name ) ;
2016-01-22 05:59:43 -05:00
}
2017-04-22 15:47:04 -04:00
if ( asset - > prog . loadDef . program )
2016-01-22 05:59:43 -05:00
{
2016-11-20 08:09:07 -05:00
buffer - > align ( Utils : : Stream : : ALIGN_4 ) ;
2017-04-22 15:47:04 -04:00
buffer - > saveArray ( asset - > prog . loadDef . program , asset - > prog . loadDef . programSize ) ;
Utils : : Stream : : ClearPointer ( & dest - > prog . loadDef . program ) ;
2016-01-22 05:59:43 -05:00
}
2016-11-20 08:09:07 -05:00
buffer - > popBlock ( ) ;
2016-01-22 05:59:43 -05:00
}
}