This repository has been archived on 2025-02-27. You can view files and clone it, but cannot push or open issues or pull requests.
CnC_Renegade/Code/Combat/assetdep.cpp

341 lines
9.5 KiB
C++

/*
** 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;
}
}