//========= Copyright © 1996-2005, Valve Corporation, All rights reserved. ============// // // Purpose: // // $NoKeywords: $ //=============================================================================// #if !defined( MOD_LOADER_H ) #define MOD_LOADER_H #ifdef _WIN32 #pragma once #endif struct model_t; class IMaterial; class IFileList; #include "tier1/utlmemory.h" #include "engine/ivmodelinfo.h" //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- abstract_class IModelLoader { public: enum REFERENCETYPE { // The name is allocated, but nothing else is in memory or being referenced FMODELLOADER_NOTLOADEDORREFERENCED = 0, // The model has been loaded into memory FMODELLOADER_LOADED = (1<<0), // The model is being referenced by the server code FMODELLOADER_SERVER = (1<<1), // The model is being referenced by the client code FMODELLOADER_CLIENT = (1<<2), // The model is being referenced in the client .dll FMODELLOADER_CLIENTDLL = (1<<3), // The model is being referenced by static props FMODELLOADER_STATICPROP = (1<<4), // The model is a detail prop FMODELLOADER_DETAILPROP = (1<<5), // The model is the simple version of the world geometry FMODELLOADER_SIMPLEWORLD = (1<<6), // The model is dynamically loaded FMODELLOADER_DYNSERVER = (1<<7), FMODELLOADER_DYNCLIENT = (1<<8), FMODELLOADER_COMBINED = (1<<9), FMODELLOADER_DYNAMIC = FMODELLOADER_DYNSERVER | FMODELLOADER_DYNCLIENT | FMODELLOADER_COMBINED, FMODELLOADER_REFERENCEMASK = (FMODELLOADER_SERVER | FMODELLOADER_CLIENT | FMODELLOADER_CLIENTDLL | FMODELLOADER_STATICPROP | FMODELLOADER_DETAILPROP | FMODELLOADER_DYNAMIC | FMODELLOADER_SIMPLEWORLD ), // The model was touched by the preload method FMODELLOADER_TOUCHED_BY_PRELOAD = (1<<15), // The model was loaded by the preload method, a postload fixup is required FMODELLOADER_LOADED_BY_PRELOAD = (1<<16), // The model touched its materials as part of its load FMODELLOADER_TOUCHED_MATERIALS = (1<<17), }; enum ReloadType_t { RELOAD_LOD_CHANGED = 0, RELOAD_EVERYTHING, RELOAD_REFRESH_MODELS, }; // Start up modelloader subsystem virtual void Init( void ) = 0; virtual void Shutdown( void ) = 0; virtual int GetCount( void ) = 0; virtual model_t *GetModelForIndex( int i ) = 0; // Look up name for model virtual const char *GetName( const model_t *model ) = 0; // Check for extra data, reload studio model if needed virtual void *GetExtraData( model_t *model ) = 0; // Get disk size for model virtual int GetModelFileSize( const char *name ) = 0; // Finds the model, and loads it if it isn't already present. Updates reference flags virtual model_t *GetModelForName( const char *name, REFERENCETYPE referencetype ) = 0; virtual model_t *ReferenceModel( const char *name, REFERENCETYPE referencetype ) = 0; // Unmasks the referencetype field for the model virtual void UnreferenceModel( model_t *model, REFERENCETYPE referencetype ) = 0; // Unmasks the specified reference type across all models virtual void UnreferenceAllModels( REFERENCETYPE referencetype ) = 0; // For any models with referencetype blank, frees all memory associated with the model // and frees up the models slot virtual void UnloadUnreferencedModels( void ) = 0; virtual void PurgeUnusedModels( void ) = 0; virtual void UnMountCompatibilityPaths( void ) = 0; virtual void AddCompatibilityPath( const char *szNewCompatibilityPath ) = 0; // On the client only, there is some information that is computed at the time we are just // about to render the map the first time. If we don't change/unload the map, then we // shouldn't have to recompute it each time we reconnect to the same map virtual bool Map_GetRenderInfoAllocated( void ) = 0; virtual void Map_SetRenderInfoAllocated( bool allocated ) = 0; // Load all the displacements for rendering. Set bRestoring to true if we're recovering from an alt+tab. virtual void Map_LoadDisplacements( model_t *model, bool bRestoring ) = 0; // Print which models are in the cache/known virtual void Print( void ) = 0; // Validate version/header of a .bsp file virtual bool Map_IsValid( char const *pBaseMapName, bool bQuiet = false ) = 0; // Recomputes surface flags virtual void RecomputeSurfaceFlags( model_t *mod ) = 0; // Reloads all models virtual void Studio_ReloadModels( ReloadType_t reloadType ) = 0; // Is a model loaded? virtual bool IsLoaded( const model_t *mod ) = 0; virtual bool LastLoadedMapHasHDRLighting( void ) = 0; virtual bool LastLoadedMapHasLightmapAlphaData( void ) = 0; // See CL_HandlePureServerWhitelist for what this is for. virtual void ReloadFilesInList( IFileList *pFilesToReload ) = 0; // Called by app system once per frame to poll and update dynamic models virtual void UpdateDynamicModels() = 0; // Called by server and client engine code to flush unreferenced dynamic models virtual void FlushDynamicModels() = 0; // Called by server and client engine code to flush unreferenced dynamic models virtual void ForceUnloadNonClientDynamicModels() = 0; // Called by client code to load dynamic models, instead of GetModelForName. virtual model_t *GetDynamicModel( const char *name, bool bClientOnly ) = 0; virtual model_t *GetDynamicCombinedModel( const char *name, bool bClientOnly ) = 0; virtual void UpdateDynamicCombinedModel( model_t *pModel, MDLHandle_t Handle, bool bClientSide ) = 0; virtual bool SetCombineModels( model_t *pModel, const CUtlVector< SCombinerModelInput_t > &vecModelsToCombine ) = 0; virtual bool FinishCombinedModel( model_t *pModel, CombinedModelLoadedCallback pFunc, void *pUserData = NULL ) = 0; // Called by client code to query dynamic model state virtual bool IsDynamicModelLoading( model_t *pModel ) = 0; // Called by client code to refcount dynamic models virtual void AddRefDynamicModel( model_t *pModel, bool bClientSideRef ) = 0; virtual void ReleaseDynamicModel( model_t *pModel, bool bClientSideRef ) = 0; // Called by client code virtual bool RegisterModelLoadCallback( model_t *pModel, IModelLoadCallback *pCallback, bool bCallImmediatelyIfLoaded = true ) = 0; // Called by client code or IModelLoadCallback destructor virtual void UnregisterModelLoadCallback( model_t *pModel, IModelLoadCallback *pCallback ) = 0; // Called by client engine code when server indicates that a model has finished loading or has been unloaded virtual void Client_OnServerModelStateChanged( model_t *pModel, bool bServerLoaded ) = 0; virtual void UpdateViewWeaponModelCache( const char **ppWeaponModels, int nWeaponModels ) = 0; virtual void TouchWorldWeaponModelCache( const char **ppWeaponModels, int nWeaponModels ) = 0; virtual bool IsModelInWeaponCache( const model_t *pModel ) = 0; virtual void EvictAllWeaponsFromModelCache( bool bLoadingComplete ) = 0; virtual bool IsViewWeaponModelResident( const model_t *pModel ) = 0; }; extern IModelLoader *modelloader; //----------------------------------------------------------------------------- // Purpose: Loads the lump to temporary memory and automatically cleans up the // memory when it goes out of scope. //----------------------------------------------------------------------------- class CMapLoadHelper { public: CMapLoadHelper( int lumpToLoad, bool bUncompress = true ); ~CMapLoadHelper( void ); // Get raw memory pointer byte *LumpBase( void ); int LumpSize( void ); int LumpOffset( void ); int LumpVersion() const; const char *GetMapPathName( void ); char *GetLoadName( void ); char *GetDiskName( void ); struct worldbrushdata_t *GetMap( void ); // use these to explicitly manage compressed lumps (by default, decompression is done transparently): int UncompressedLumpSize( void ); void UncompressLump( void *pExternalBuffer = NULL ); // Global setup/shutdown static void Init( model_t *pMapModel, const char *pLoadname ); static void InitFromMemory( model_t *pMapModel, const void *pData, int nDataSize ); static void Shutdown( void ); static int GetRefCount( void ); // Free the lighting lump (increases free memory during loading on 360) static void FreeLightingLump(); // Returns the size of a particular lump without loading it static int LumpSize( int lumpId ); static int LumpOffset( int lumpId ); // Loads one element in a lump. void LoadLumpElement( int nElemIndex, int nElemSize, void *pData ); void LoadLumpData( int offset, int size, void *pData ); private: int m_nLumpSize; int m_nLumpOffset; int m_nLumpVersion; byte *m_pRawData; byte *m_pData; byte *m_pUncompressedData; int m_nUncompressedLumpSize; bool m_bUncompressedDataExternal; // Handling for lump files int m_nLumpID; char m_szLumpFilename[MAX_PATH]; }; //----------------------------------------------------------------------------- // Recomputes translucency for the model... //----------------------------------------------------------------------------- RenderableTranslucencyType_t Mod_ComputeTranslucencyType( model_t* mod, int nSkin, int nBody ); //----------------------------------------------------------------------------- // game lumps //----------------------------------------------------------------------------- int Mod_GameLumpSize( int lumpId ); int Mod_GameLumpVersion( int lumpId ); bool Mod_LoadGameLump( int lumpId, void* pBuffer, int size ); // returns the material count... int Mod_GetMaterialCount( model_t* mod ); // returns the first n materials. int Mod_GetModelMaterials( model_t* mod, int count, IMaterial** ppMaterial ); bool Mod_MarkWaterSurfaces( model_t *pModel ); //----------------------------------------------------------------------------- // Hooks the cache notify into the MDL cache system //----------------------------------------------------------------------------- void ConnectMDLCacheNotify( ); void DisconnectMDLCacheNotify( ); //----------------------------------------------------------------------------- // Initialize studiomdl state //----------------------------------------------------------------------------- void InitStudioModelState( model_t *pModel ); //----------------------------------------------------------------------------- // Convert the full bsp name into the actual platform bsp name //----------------------------------------------------------------------------- char *GetMapPathNameOnDisk( char *pDiskName, const char *pFullMapName, unsigned int nDiskNameSize ); // has the lightstyle lighting changed since last updated? bool Mod_NeedsLightstyleUpdate( model_t *pModel ); // set the material system config for hdr or not void EnableHDR( bool bEnable ); void DeallocateLightingData( worldbrushdata_t *pBrushData ); extern bool g_bLoadedMapHasBakedPropLighting; extern bool g_bBakedPropLightingNoSeparateHDR; extern bool g_bHasLightmapAlphaData; extern bool g_bBakedPropLightingStreams3; extern bool g_bHasLightmapAlphaData3; #endif // MOD_LOADER_H