2017-01-20 14:36:52 +01:00
# include "STDInclude.hpp"
2016-01-22 11:59:43 +01:00
2019-02-01 16:16:42 -05:00
# define IW4X_TECHSET_VERSION "0"
2016-01-22 11:59:43 +01:00
namespace Assets
{
2019-02-01 16:16:42 -05:00
void IMaterialVertexDeclaration : : 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 IMaterialVertexDeclaration : : loadNative ( Game : : XAssetHeader * header , const std : : string & name , Components : : ZoneBuilder : : Zone * /*builder*/ )
{
header - > vertexDecl = Components : : AssetHandler : : FindOriginalAsset ( this - > getType ( ) , name . data ( ) ) . vertexDecl ;
}
void IMaterialVertexDeclaration : : loadBinary ( Game : : XAssetHeader * header , const std : : string & name , Components : : ZoneBuilder : : Zone * builder )
{
Components : : FileSystem : : File declFile ( Utils : : String : : VA ( " decl/%s.iw4xDECL " , name . data ( ) ) ) ;
if ( ! declFile . exists ( ) ) return ;
Utils : : Stream : : Reader reader ( builder - > getAllocator ( ) , declFile . getBuffer ( ) ) ;
char * magic = reader . readArray < char > ( 8 ) ;
if ( std : : memcmp ( magic , " IW4xDECL " , 8 ) )
{
Components : : Logger : : Error ( 0 , " Reading vertex declaration '%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 vertex declaration '%s' failed, expected version is %d, but it was %d! " , name . data ( ) , atoi ( IW4X_TECHSET_VERSION ) , atoi ( version . data ( ) ) ) ;
}
Game : : MaterialVertexDeclaration * asset = reader . readObject < Game : : MaterialVertexDeclaration > ( ) ;
if ( asset - > name )
{
asset - > name = reader . readCString ( ) ;
}
header - > vertexDecl = asset ;
}
2016-11-20 14:09:07 +01:00
void IMaterialVertexDeclaration : : save ( Game : : XAssetHeader header , Components : : ZoneBuilder : : Zone * builder )
2016-01-22 11:59:43 +01:00
{
2016-11-20 14:09:07 +01:00
AssertSize ( Game : : MaterialVertexDeclaration , 100 ) ;
2016-01-22 11:59:43 +01:00
2016-11-20 14:09:07 +01:00
Utils : : Stream * buffer = builder - > getBuffer ( ) ;
2016-01-22 11:59:43 +01:00
Game : : MaterialVertexDeclaration * asset = header . vertexDecl ;
2016-11-20 14:09:07 +01:00
Game : : MaterialVertexDeclaration * dest = buffer - > dest < Game : : MaterialVertexDeclaration > ( ) ;
buffer - > save ( asset ) ;
2016-01-22 11:59:43 +01:00
2016-11-20 14:09:07 +01:00
buffer - > pushBlock ( Game : : XFILE_BLOCK_VIRTUAL ) ;
2016-01-22 11:59:43 +01:00
if ( asset - > name )
{
2016-11-20 14:09:07 +01:00
buffer - > saveString ( builder - > getAssetName ( this - > getType ( ) , asset - > name ) ) ;
2016-06-10 13:52:55 +02:00
Utils : : Stream : : ClearPointer ( & dest - > name ) ;
2016-01-22 11:59:43 +01:00
}
2017-04-22 21:47:04 +02:00
AssertSize ( Game : : MaterialVertexStreamRouting , 92 ) ;
2016-11-20 14:09:07 +01:00
buffer - > popBlock ( ) ;
2016-01-22 11:59:43 +01:00
}
}