| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341 |
- /*
- ** Command & Conquer Renegade(tm)
- ** Copyright 2025 Electronic Arts Inc.
- **
- ** This program is free software: you can redistribute it and/or modify
- ** it under the terms of the GNU General Public License as published by
- ** the Free Software Foundation, either version 3 of the License, or
- ** (at your option) any later version.
- **
- ** This program is distributed in the hope that it will be useful,
- ** but WITHOUT ANY WARRANTY; without even the implied warranty of
- ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- ** GNU General Public License for more details.
- **
- ** You should have received a copy of the GNU General Public License
- ** along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
- /***********************************************************************************************
- *** Confidential - Westwood Studios ***
- ***********************************************************************************************
- * *
- * Project Name : Commando *
- * *
- * $Archive:: /Commando/Code/Combat/assetdep.cpp $*
- * *
- * $Author:: Jani_p $*
- * *
- * $Modtime:: 11/29/01 9:48p $*
- * *
- * $Revision:: 12 $*
- * *
- *---------------------------------------------------------------------------------------------*
- * Functions: *
- * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
- #include "assetdep.h"
- #include "chunkio.h"
- #include "wwstring.h"
- #include "assetmgr.h"
- #include "ffactory.h"
- #include "saveloadstatus.h"
- #include "wwprofile.h"
- ///////////////////////////////////////////////////////////////////////
- // Local prototypes
- ///////////////////////////////////////////////////////////////////////
- static void Asset_Name_From_Filename (StringClass& new_name, const char *filename);
- static void Get_Filename_From_Path (StringClass& new_name, const char *filename);
- ///////////////////////////////////////////////////////////////////////
- // Constants
- ///////////////////////////////////////////////////////////////////////
- static const char * ALWAYS_FILENAME = "always.dep";
- static const char * DEP_EXTENSION = ".dep";
- enum
- {
- CHUNKID_FILE_LIST = 0x04020527,
- VARID_ASSET_FILENAME = 0x01,
- };
- ///////////////////////////////////////////////////////////////////////
- //
- // Save_Always_Dependencies
- //
- ///////////////////////////////////////////////////////////////////////
- void
- AssetDependencyManager::Save_Always_Dependencies (const char *path, ASSET_LIST &asset_list)
- {
- //
- // Get a pointer to the file object
- //
- StringClass filename(path + StringClass ("\\") + StringClass (ALWAYS_FILENAME),true);
- FileClass * file = _TheWritingFileFactory->Get_File (filename);
- if (file != NULL) {
- //
- // Open or create the file
- //
- file->Open (FileClass::WRITE);
-
- //
- // Save the asset list to the file
- //
- ChunkSaveClass csave (file);
- Save_Dependencies (csave, asset_list);
- //
- // Close the file
- //
- file->Close ();
- _TheWritingFileFactory->Return_File (file);
- }
-
- return ;
- }
- ///////////////////////////////////////////////////////////////////////
- //
- // Save_Level_Dependencies
- //
- ///////////////////////////////////////////////////////////////////////
- void
- AssetDependencyManager::Save_Level_Dependencies (const char *full_path, ASSET_LIST &asset_list)
- {
- //
- // Get a pointer to the file object
- //
- FileClass * file = _TheWritingFileFactory->Get_File (full_path);
- if (file != NULL) {
- //
- // Open or create the file
- //
- file->Open (FileClass::WRITE);
-
- //
- // Save the asset list to the file
- //
- ChunkSaveClass csave (file);
- Save_Dependencies (csave, asset_list);
- //
- // Close the file
- //
- file->Close ();
- _TheWritingFileFactory->Return_File (file);
- }
-
- return ;
- }
- ///////////////////////////////////////////////////////////////////////
- //
- // Save_Dependencies
- //
- ///////////////////////////////////////////////////////////////////////
- void
- AssetDependencyManager::Save_Dependencies (ChunkSaveClass &csave, ASSET_LIST &asset_list)
- {
- csave.Begin_Chunk (CHUNKID_FILE_LIST);
- //
- // Write each filename dependency to a chunk
- //
- for (int index = 0; index < asset_list.Count (); index ++) {
- StringClass &filename = asset_list[index];
- WRITE_MICRO_CHUNK_WWSTRING (csave, VARID_ASSET_FILENAME, filename);
- }
- csave.End_Chunk ();
- return ;
- }
- ///////////////////////////////////////////////////////////////////////
- //
- // Load_Level_Assets
- //
- ///////////////////////////////////////////////////////////////////////
- void
- AssetDependencyManager::Load_Level_Assets (const char *level_name)
- {
- //
- // Strip the extension (if necessary)
- //
- StringClass base_name(level_name,true);
- const char *extension = ::strrchr (base_name, '.');
- if (extension != NULL && base_name.Get_Length () > 4) {
- base_name.Erase (base_name.Get_Length () - 4, 4);
- }
- //
- // Build a filename from the level name, and load the assets from it.
- //
- StringClass filename(base_name + StringClass (DEP_EXTENSION),true);
- Load_Assets (filename);
- return ;
- }
- ///////////////////////////////////////////////////////////////////////
- //
- // Load_Always_Assets
- //
- ///////////////////////////////////////////////////////////////////////
- void
- AssetDependencyManager::Load_Always_Assets (void)
- {
- //
- // Load the assets from the always file
- //
- Load_Assets (ALWAYS_FILENAME);
- return ;
- }
- ///////////////////////////////////////////////////////////////////////
- //
- // Load_Assets
- //
- ///////////////////////////////////////////////////////////////////////
- void
- AssetDependencyManager::Load_Assets (const char *filename)
- {
- //
- // Get a pointer to the file object
- //
- FileClass * file = _TheFileFactory->Get_File (filename);
- if (file != NULL) {
- if ( file->Is_Available() ) {
- //
- // Open the file
- //
- file->Open (FileClass::READ);
- //
- // Load the asset dependencies from the file
- //
- ChunkLoadClass cload (file);
- Load_Assets (cload);
- //
- // Close the file
- //
- file->Close ();
- } else {
- WWDEBUG_SAY(( "Failed to find %s\n", filename ));
- }
- _TheFileFactory->Return_File (file);
- }
- return ;
- }
- ///////////////////////////////////////////////////////////////////////
- //
- // Load_Assets
- //
- ///////////////////////////////////////////////////////////////////////
- void
- AssetDependencyManager::Load_Assets (ChunkLoadClass &cload)
- {
- WWLOG_PREPARE_TIME_AND_MEMORY("AssetDependencyManager::Load_Assets (ChunkLoadClass &cload)");
- cload.Open_Chunk ();
- WWASSERT (cload.Cur_Chunk_ID () == CHUNKID_FILE_LIST);
- if (cload.Cur_Chunk_ID () == CHUNKID_FILE_LIST) {
- //
- // Read the filename of each asset from the chunk and
- // load its assets into the asset manager.
- //
- while (cload.Open_Micro_Chunk ()) {
- switch (cload.Cur_Micro_Chunk_ID ())
- {
- case VARID_ASSET_FILENAME:
- {
- //
- // Read the filename from the chunk
- //
- StringClass filename(0,true);
- int size = cload.Cur_Micro_Chunk_Length ();
- cload.Read (filename.Get_Buffer (size), size);
- //
- // Determine what the render object name should be from
- // the filename.
- //
- StringClass render_obj_name(0,true);
- ::Asset_Name_From_Filename (render_obj_name,filename);
- INIT_SUB_STATUS(filename);
- //
- // Load the assets from this file into the asset manager
- //
- if (WW3DAssetManager::Get_Instance ()->Render_Obj_Exists (render_obj_name) == false) {
- WW3DAssetManager::Get_Instance ()->Load_3D_Assets (filename);
- }
- // WWLOG_INTERMEDIATE(filename);
- }
- break;
- default:
- WWDEBUG_SAY (("Unexpected chunk id %d found while preloading assets.\r\n", cload.Cur_Micro_Chunk_ID));
- break;
- }
- cload.Close_Micro_Chunk ();
- }
- }
- cload.Close_Chunk ();
- return ;
- }
- ////////////////////////////////////////////////////////////////////////////
- //
- // Get_Filename_From_Path
- //
- ////////////////////////////////////////////////////////////////////////////
- void Get_Filename_From_Path (StringClass& new_filename, const char *path)
- {
- // Find the last occurance of the directory deliminator
- const char *filename = ::strrchr (path, '\\');
- if (filename != NULL) {
- // Increment past the directory deliminator
- filename ++;
- } else {
- filename = path;
- }
- new_filename=filename;
- }
- ////////////////////////////////////////////////////////////////////////////
- //
- // Asset_Name_From_Filename
- //
- ////////////////////////////////////////////////////////////////////////////
- void Asset_Name_From_Filename (StringClass& asset_name, const char *filename)
- {
- // Get the filename from this path
- ::Get_Filename_From_Path (asset_name, filename);
- // Find and strip off the extension (if it exists)
- char *extension = ::strrchr (asset_name, '.');
- if (extension != NULL) {
- extension[0] = 0;
- }
- }
|