diff --git a/neo/renderer/Model.cpp b/neo/renderer/Model.cpp index 8ab03312..fa287c61 100644 --- a/neo/renderer/Model.cpp +++ b/neo/renderer/Model.cpp @@ -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 ); } /* diff --git a/neo/renderer/Model.h b/neo/renderer/Model.h index d975cf90..1523b251 100644 --- a/neo/renderer/Model.h +++ b/neo/renderer/Model.h @@ -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; diff --git a/neo/renderer/ModelManager.cpp b/neo/renderer/ModelManager.cpp index 5abded69..61b9b153 100644 --- a/neo/renderer/ModelManager.cpp +++ b/neo/renderer/ModelManager.cpp @@ -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 ); } /* diff --git a/neo/renderer/ModelManager.h b/neo/renderer/ModelManager.h index ced7b7f8..4d3afecd 100644 --- a/neo/renderer/ModelManager.h +++ b/neo/renderer/ModelManager.h @@ -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; diff --git a/neo/renderer/Model_gltf.cpp b/neo/renderer/Model_gltf.cpp index 6bec9804..e5b2647f 100644 --- a/neo/renderer/Model_gltf.cpp +++ b/neo/renderer/Model_gltf.cpp @@ -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; diff --git a/neo/renderer/Model_gltf.h b/neo/renderer/Model_gltf.h index c8a5bf32..856c5a44 100644 --- a/neo/renderer/Model_gltf.h +++ b/neo/renderer/Model_gltf.h @@ -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; diff --git a/neo/renderer/Model_liquid.cpp b/neo/renderer/Model_liquid.cpp index 17df86e3..3a253dbe 100644 --- a/neo/renderer/Model_liquid.cpp +++ b/neo/renderer/Model_liquid.cpp @@ -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; diff --git a/neo/renderer/Model_local.h b/neo/renderer/Model_local.h index dd94380a..1cd32bd4 100644 --- a/neo/renderer/Model_local.h +++ b/neo/renderer/Model_local.h @@ -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; diff --git a/neo/renderer/Model_md3.cpp b/neo/renderer/Model_md3.cpp index 5c45d928..c4472643 100644 --- a/neo/renderer/Model_md3.cpp +++ b/neo/renderer/Model_md3.cpp @@ -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; diff --git a/neo/renderer/Model_md5.cpp b/neo/renderer/Model_md5.cpp index 250e0999..fb1e3196 100644 --- a/neo/renderer/Model_md5.cpp +++ b/neo/renderer/Model_md5.cpp @@ -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();