Hook idImportOptions into idRenderModel*::InitFromFile()

This commit is contained in:
Robert Beckebans 2022-10-23 15:17:03 +02:00
parent 81d70dc5d8
commit 6cbb205ece
10 changed files with 40 additions and 25 deletions

View file

@ -295,7 +295,7 @@ idRenderModelStatic::PartialInitFromFile
void idRenderModelStatic::PartialInitFromFile( const char* fileName )
{
fastLoad = true;
InitFromFile( fileName );
InitFromFile( fileName, nullptr );
}
/*
@ -303,15 +303,13 @@ void idRenderModelStatic::PartialInitFromFile( const char* fileName )
idRenderModelStatic::InitFromFile
================
*/
void idRenderModelStatic::InitFromFile( const char* fileName )
void idRenderModelStatic::InitFromFile( const char* fileName, idImportOptions* options )
{
bool loaded;
idStr extension;
InitEmpty( fileName );
// FIXME: load new .proc map format
ID_TIME_T sourceTimeStamp;
name.ExtractFileExtension( extension );
@ -872,7 +870,7 @@ idRenderModelStatic::LoadModel
void idRenderModelStatic::LoadModel()
{
PurgeModel();
InitFromFile( name );
InitFromFile( name, nullptr );
}
/*

View file

@ -62,6 +62,7 @@ struct dominantTri_t
const int SHADOW_CAP_INFINITE = 64;
class idRenderModelStatic;
class idImportOptions;
struct viewDef_t;
// our only drawing geometry type
@ -168,7 +169,7 @@ public:
virtual ~idRenderModel() {};
// Loads static models only, dynamic models must be loaded by the modelManager
virtual void InitFromFile( const char* fileName ) = 0;
virtual void InitFromFile( const char* fileName, idImportOptions* options ) = 0;
// Supports reading/writing binary file formats
virtual bool LoadBinaryModel( idFile* file, const ID_TIME_T sourceTimeStamp ) = 0;

View file

@ -50,7 +50,7 @@ public:
virtual void Shutdown();
virtual idRenderModel* AllocModel();
virtual void FreeModel( idRenderModel* model );
virtual idRenderModel* FindModel( const char* modelName );
virtual idRenderModel* FindModel( const char* modelName, idImportOptions* options = nullptr );
virtual idRenderModel* CheckModel( const char* modelName );
virtual idRenderModel* DefaultModel();
virtual void AddModel( idRenderModel* model );
@ -72,7 +72,7 @@ private:
idRenderModel* spriteModel;
bool insideLevelLoad; // don't actually load now
idRenderModel* GetModel( const char* modelName, bool createIfNotFound );
idRenderModel* GetModel( const char* modelName, bool createIfNotFound, idImportOptions* options );
static void PrintModel_f( const idCmdArgs& args );
static void ListModels_f( const idCmdArgs& args );
@ -278,7 +278,7 @@ void idRenderModelManagerLocal::Shutdown()
idRenderModelManagerLocal::GetModel
=================
*/
idRenderModel* idRenderModelManagerLocal::GetModel( const char* _modelName, bool createIfNotFound )
idRenderModel* idRenderModelManagerLocal::GetModel( const char* _modelName, bool createIfNotFound, idImportOptions* options )
{
if( !_modelName || !_modelName[0] )
@ -342,10 +342,12 @@ idRenderModel* idRenderModelManagerLocal::GetModel( const char* _modelName, bool
// determine which subclass of idRenderModel to initialize
idRenderModel* model = NULL;
bool isGLTF = false;
// HvG: GLTF 2 support
if( ( extension.Icmp( GLTF_GLB_EXT ) == 0 ) || ( extension.Icmp( GLTF_EXT ) == 0 ) )
{
model = new( TAG_MODEL ) idRenderModelGLTF;
isGLTF = true;
}
// RB: Collada DAE and Wavefront OBJ
else if( ( extension.Icmp( "dae" ) == 0 ) || ( extension.Icmp( "obj" ) == 0 ) // RB: Collada DAE and Wavefront OBJ
@ -380,19 +382,33 @@ idRenderModel* idRenderModelManagerLocal::GetModel( const char* _modelName, bool
generatedFileName.SetFileExtension( va( "b%s", extension.c_str() ) );
// Get the timestamp on the original file, if it's newer than what is stored in binary model, regenerate it
ID_TIME_T sourceTimeStamp = fileSystem->GetTimestamp( canonical );
ID_TIME_T sourceTimeStamp;
if( isGLTF )
{
idStr gltfFileName = idStr( canonical );
int gltfMeshId = -1;
idStr gltfMeshName;
gltfManager::ExtractIdentifier( gltfFileName, gltfMeshId, gltfMeshName );
sourceTimeStamp = fileSystem->GetTimestamp( gltfFileName );
}
else
{
sourceTimeStamp = fileSystem->GetTimestamp( canonical );
}
idFileLocal file( fileSystem->OpenFileReadMemory( generatedFileName ) );
if( !model->SupportsBinaryModel() || !binaryLoadRenderModels.GetBool() )
{
model->InitFromFile( canonical );
model->InitFromFile( canonical, options );
}
else
{
if( !model->LoadBinaryModel( file, sourceTimeStamp ) )
{
model->InitFromFile( canonical );
model->InitFromFile( canonical, options );
// RB: default models shouldn't be cached as binary models
if( !model->IsDefaultModel() )
@ -538,9 +554,9 @@ void idRenderModelManagerLocal::FreeModel( idRenderModel* model )
idRenderModelManagerLocal::FindModel
=================
*/
idRenderModel* idRenderModelManagerLocal::FindModel( const char* modelName )
idRenderModel* idRenderModelManagerLocal::FindModel( const char* modelName, idImportOptions* options )
{
return GetModel( modelName, true );
return GetModel( modelName, true, options );
}
/*
@ -550,7 +566,7 @@ idRenderModelManagerLocal::CheckModel
*/
idRenderModel* idRenderModelManagerLocal::CheckModel( const char* modelName )
{
return GetModel( modelName, false );
return GetModel( modelName, false, nullptr );
}
/*

View file

@ -130,7 +130,7 @@ public:
// returns NULL if modelName is NULL or an empty string, otherwise
// it will create a default model if not loadable
virtual idRenderModel* FindModel( const char* modelName ) = 0;
virtual idRenderModel* FindModel( const char* modelName, idImportOptions* options = nullptr ) = 0;
// returns NULL if not loadable
virtual idRenderModel* CheckModel( const char* modelName ) = 0;

View file

@ -135,7 +135,7 @@ void idRenderModelGLTF::ProcessNode_r( gltfNode* modelNode, idMat4 parentTransfo
// warning : nodeName cannot have dots!
//[fileName].[nodeName/nodeId].[gltf/glb]
//If no nodeName/nodeId is given, all primitives active in default scene will be added as surfaces.
void idRenderModelGLTF::InitFromFile( const char* fileName )
void idRenderModelGLTF::InitFromFile( const char* fileName, idImportOptions* options )
{
hasAnimations = false;
fileExclusive = false;

View file

@ -32,7 +32,7 @@ If you have questions concerning this license or the applicable additional terms
class idRenderModelGLTF : public idRenderModelStatic
{
public:
virtual void InitFromFile( const char* fileName ) override;
virtual void InitFromFile( const char* fileName, idImportOptions* options ) override;
virtual bool LoadBinaryModel( idFile* file, const ID_TIME_T sourceTimeStamp ) override;
virtual void WriteBinaryModel( idFile* file, ID_TIME_T* _timeStamp = NULL ) const override;
virtual dynamicModel_t IsDynamicModel() const override;

View file

@ -373,7 +373,7 @@ void idRenderModelLiquid::Reset()
idRenderModelLiquid::InitFromFile
====================
*/
void idRenderModelLiquid::InitFromFile( const char* fileName )
void idRenderModelLiquid::InitFromFile( const char* fileName, idImportOptions* options )
{
int i, x, y;
idToken token;

View file

@ -52,7 +52,7 @@ public:
idRenderModelStatic();
virtual ~idRenderModelStatic();
virtual void InitFromFile( const char* fileName );
virtual void InitFromFile( const char* fileName, idImportOptions* options );
virtual bool LoadBinaryModel( idFile* file, const ID_TIME_T sourceTimeStamp );
virtual void WriteBinaryModel( idFile* file, ID_TIME_T* _timeStamp = NULL ) const;
virtual bool SupportsBinaryModel()
@ -216,7 +216,7 @@ class idRenderModelMD5 : public idRenderModelStatic
{
friend class idRenderModelGLTF;
public:
virtual void InitFromFile( const char* fileName );
virtual void InitFromFile( const char* fileName, idImportOptions* options );
virtual bool LoadBinaryModel( idFile* file, const ID_TIME_T sourceTimeStamp );
virtual void WriteBinaryModel( idFile* file, ID_TIME_T* _timeStamp = NULL ) const;
virtual dynamicModel_t IsDynamicModel() const;
@ -268,7 +268,7 @@ struct md3Surface_s;
class idRenderModelMD3 : public idRenderModelStatic
{
public:
virtual void InitFromFile( const char* fileName );
virtual void InitFromFile( const char* fileName, idImportOptions* options );
virtual bool SupportsBinaryModel()
{
return false;
@ -299,7 +299,7 @@ class idRenderModelLiquid : public idRenderModelStatic
public:
idRenderModelLiquid();
virtual void InitFromFile( const char* fileName );
virtual void InitFromFile( const char* fileName, idImportOptions* options );
virtual bool SupportsBinaryModel()
{
return false;

View file

@ -46,7 +46,7 @@ If you have questions concerning this license or the applicable additional terms
idRenderModelMD3::InitFromFile
=================
*/
void idRenderModelMD3::InitFromFile( const char* fileName )
void idRenderModelMD3::InitFromFile( const char* fileName, idImportOptions* options )
{
int i, j;
md3Header_t* pinmodel;

View file

@ -706,7 +706,7 @@ void idRenderModelMD5::ParseJoint( idLexer& parser, idMD5Joint* joint, idJointQu
idRenderModelMD5::InitFromFile
====================
*/
void idRenderModelMD5::InitFromFile( const char* fileName )
void idRenderModelMD5::InitFromFile( const char* fileName, idImportOptions* options )
{
name = fileName;
LoadModel();