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/ww3d2/htreemgr.cpp

281 lines
No EOL
16 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/>.
*/
/* $Header: /Commando/Code/ww3d2/htreemgr.cpp 2 9/19/01 6:17p Jani_p $ */
/***********************************************************************************************
*** Confidential - Westwood Studios ***
***********************************************************************************************
* *
* Project Name : Commando / G 3D Library *
* *
* $Archive:: /Commando/Code/ww3d2/htreemgr.cpp $*
* *
* Author:: Byon_g *
* *
* $Modtime:: 9/14/01 12:01p $*
* *
* $Revision:: 2 $*
* *
*---------------------------------------------------------------------------------------------*
* Functions: *
* HTreeManagerClass::HTreeManagerClass -- constructor *
* HTreeManagerClass::~HTreeManagerClass -- destructor *
* HTreeManagerClass::Free -- de-allocate all memory in use *
* HTreeManagerClass::Free_All_Trees -- de-allocates all hierarchy trees currently loaded *
* HTreeManagerClass::Load_Tree -- load a hierarchy tree from a file *
* HTreeManagerClass::Get_Tree_ID -- look up the ID of a named hierarchy tree *
* HTreeManagerClass::Get_Tree -- get a pointer to the specified hierarchy tree *
* HTreeManagerClass::Get_Tree -- get a pointer to the specified hierarchy tree *
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
#include "htreemgr.h"
#include <string.h>
#include "htree.h"
#include "chunkio.h"
#include "wwmemlog.h"
/***********************************************************************************************
* HTreeManagerClass::HTreeManagerClass -- constructor *
* *
* INPUT: *
* *
* OUTPUT: *
* *
* WARNINGS: *
* *
* HISTORY: *
* 08/11/1997 GH : Created. *
*=============================================================================================*/
HTreeManagerClass::HTreeManagerClass(void) :
NumTrees(0)
{
for (int treeidx=0; treeidx < MAX_TREES; treeidx++) {
TreePtr[treeidx] = NULL;
}
}
/***********************************************************************************************
* HTreeManagerClass::~HTreeManagerClass -- destructor *
* *
* INPUT: *
* *
* OUTPUT: *
* *
* WARNINGS: *
* *
* HISTORY: *
* 08/11/1997 GH : Created. *
*=============================================================================================*/
HTreeManagerClass::~HTreeManagerClass(void)
{
Free();
}
/***********************************************************************************************
* HTreeManagerClass::Free -- de-allocate all memory in use *
* *
* INPUT: *
* *
* OUTPUT: *
* *
* WARNINGS: *
* *
* HISTORY: *
* 08/11/1997 GH : Created. *
*=============================================================================================*/
void HTreeManagerClass::Free(void)
{
Free_All_Trees();
}
/***********************************************************************************************
* HTreeManagerClass::Free_All_Trees -- de-allocates all hierarchy trees currently loaded *
* *
* INPUT: *
* *
* OUTPUT: *
* *
* WARNINGS: *
* *
* HISTORY: *
* 08/11/1997 GH : Created. *
*=============================================================================================*/
void HTreeManagerClass::Free_All_Trees(void)
{
// Clear the hash table
TreeHash.Remove_All();
for (int treeidx=0; treeidx < MAX_TREES; treeidx++) {
if (TreePtr[treeidx] != NULL) {
delete TreePtr[treeidx];
TreePtr[treeidx] = NULL;
}
}
NumTrees = 0;
}
/***********************************************************************************************
* HTreeManagerClass::Load_Tree -- load a hierarchy tree from a file *
* *
* INPUT: *
* *
* OUTPUT: *
* *
* WARNINGS: *
* *
* HISTORY: *
* 08/11/1997 GH : Created. *
*=============================================================================================*/
int HTreeManagerClass::Load_Tree(ChunkLoadClass & cload)
{
WWMEMLOG(MEM_ANIMATION);
HTreeClass * newtree = new HTreeClass;
if (newtree == NULL) {
goto Error;
}
if (newtree->Load_W3D(cload) != HTreeClass::OK) {
// load failed, delete and return error
delete newtree;
goto Error;
} else if (Get_Tree_ID(newtree->Get_Name()) != -1) {
// tree with this name already exists, reject it!
delete newtree;
goto Error;
} else {
// ok, accept this hierarchy tree!
TreePtr[NumTrees] = newtree;
NumTrees++;
// Insert to hash table for fast name based search
StringClass lower_case_name(newtree->Get_Name(),true);
_strlwr(lower_case_name.Peek_Buffer());
TreeHash.Insert(lower_case_name,newtree);
}
return 0;
Error:
return 1;
}
/***********************************************************************************************
* HTreeManagerClass::Get_Tree_ID -- look up the ID of a named hierarchy tree *
* *
* INPUT: *
* *
* OUTPUT: *
* *
* WARNINGS: *
* *
* HISTORY: *
* 08/11/1997 GH : Created. *
*=============================================================================================*/
int HTreeManagerClass::Get_Tree_ID(const char * name)
{
for (int i=0; i<NumTrees; i++) {
if (TreePtr[i] && (stricmp(name,TreePtr[i]->Get_Name()) == 0)) {
return i;
}
}
return -1;
}
/***********************************************************************************************
* HTreeManagerClass::Get_Tree_Name -- look up the name of a id'd hierarchy tree *
* *
* INPUT: *
* *
* OUTPUT: *
* *
* WARNINGS: *
* *
* HISTORY: *
* 08/11/1997 GH : Created. *
*=============================================================================================*/
char *HTreeManagerClass::Get_Tree_Name(const int idx)
{
if ((idx < NumTrees) && TreePtr[idx]) {
if (TreePtr[idx]) {
return (char *)TreePtr[idx]->Get_Name();
}
}
return NULL;
}
/***********************************************************************************************
* HTreeManagerClass::Get_Tree -- get a pointer to the specified hierarchy tree *
* *
* INPUT: *
* *
* OUTPUT: *
* *
* WARNINGS: *
* *
* HISTORY: *
* 08/11/1997 GH : Created. *
*=============================================================================================*/
HTreeClass * HTreeManagerClass::Get_Tree(const char * name)
{
StringClass lower_case_name(name,true);
_strlwr(lower_case_name.Peek_Buffer());
return TreeHash.Get(lower_case_name);
// for (int i=0; i<NumTrees; i++) {
// if (TreePtr[i] && (stricmp(name,TreePtr[i]->Get_Name()) == 0)) {
//
// return TreePtr[i];
// }
// }
// return NULL;
}
/***********************************************************************************************
* HTreeManagerClass::Get_Tree -- get a pointer to the specified hierarchy tree *
* *
* INPUT: *
* *
* OUTPUT: *
* *
* WARNINGS: *
* *
* HISTORY: *
* 08/11/1997 GH : Created. *
*=============================================================================================*/
HTreeClass * HTreeManagerClass::Get_Tree(int id)
{
if ((id >= 0) && (id < NumTrees)) {
return TreePtr[id];
} else {
return NULL;
}
}