Files
Client/GameTools/Zallad3D SceneClass/Z3DContainer.h
LGram16 dd97ddec92 Restructure repository to include all source folders
Move git root from Client/ to src/ to track all source code:
- Client: Game client source (moved to Client/Client/)
- Server: Game server source
- GameTools: Development tools
- CryptoSource: Encryption utilities
- database: Database scripts
- Script: Game scripts
- rylCoder_16.02.2008_src: Legacy coder tools
- GMFont, Game: Additional resources

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-29 20:17:20 +09:00

269 lines
5.5 KiB
C++

// Z3DContainer.h: interface for the Z3DContainer class.
//
//////////////////////////////////////////////////////////////////////
#if !defined(AFX_Z3DCONTAINER_H__BB4492E1_BA15_11D4_AD2B_0000E8EB4C69__INCLUDED_)
#define AFX_Z3DCONTAINER_H__BB4492E1_BA15_11D4_AD2B_0000E8EB4C69__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#pragma warning ( disable : 4786 )
#include <map>
#include <windows.h>
#include "SimpleParser.h"
#include "SimpleString.h"
typedef long Z3DHANDLE;
const Z3DHANDLE Z3DHANDLE_NULL = 0;
const Z3DHANDLE Z3DHANDLE_ERROR = 0xFFFFFFFF;
template<class _obj> struct Z3DContainer;
template<class _obj>
struct Z3DTag
{
friend struct Z3DContainer<_obj>;
public:
Z3DTag()
{
m_rpObject = NULL;
m_Handle = Z3DHANDLE_NULL;
}
_obj* GetObject()
{
_ASSERT( m_rpObject );
return m_rpObject;
}
const Z3DHANDLE GetHandle()
{
return m_Handle;
}
bool operator == ( const Z3DTag<_obj> &op )
{
return (m_Handle == op.m_Handle);
}
protected:
_obj* m_rpObject;
Z3DHANDLE m_Handle;
};
template<class _obj>
struct Z3DContainer
{
public:
Z3DContainer()
{
//m_szPathName = NULL;
}
~Z3DContainer();
bool LoadHandleNameTable( const char* szFilename, const char* szPath = NULL );
Z3DTag<_obj> GetObjectByHandle( Z3DHANDLE handle );
bool Release( Z3DTag<_obj> tag );
struct Z3DContainerElement
{
int lRefCount;
_obj* pObj;
Z3DContainerElement()
{
lRefCount = 0;
pObj = NULL;
}
};
// 디스크 긱긱거리는거 막을라꼬..처음에 한번 몽창 다 로딩--; (비효율적이지만 무식하게 구현;;)
// 반드시 LoadHandleNameTable 호출 후 실행할것
/*bool PreLoadAll()
{
std::map<Z3DHANDLE, char*>::iterator it;
Z3DAniKeyPackTag tag;
for( it = mapHandle2Name.begin(); it != mapHandle2Name.end(); it++ )
{
tag = GetObjectByHandle( it->first );
if( NULL == tag.GetObject() )
{
return false;
}
}
return true;
}*/
protected:
//char* m_szPathName;
std::map<Z3DHANDLE, char*> mapHandle2Name;
std::map<Z3DHANDLE, Z3DContainerElement> mapHandle2Element;
};
template<class _obj>
Z3DContainer<_obj>::~Z3DContainer()
{
// delete handle-name table
std::map<Z3DHANDLE, char*>::iterator itName;
for( itName = mapHandle2Name.begin(); itName != mapHandle2Name.end(); itName++ )
{
SAFE_DELETEA( (*itName).second );
}
mapHandle2Name.clear();
// delete path name
//SAFE_DELETEA( m_szPathName );
// delete handle-object element map, if any remains
std::map<Z3DHANDLE, Z3DContainerElement>::iterator itElement;
for( itElement = mapHandle2Element.begin(); itElement != mapHandle2Element.end(); itElement++ )
{
SAFE_DELETE( (*itElement).second.pObj );
}
mapHandle2Element.clear();
}
template<class _obj>
bool Z3DContainer<_obj>::LoadHandleNameTable( const char* szFilename, const char* szPath)
{
CSimpleParser parser;
SimpleString strPath;
if( szPath )
{
strPath( szPath );
}
char* tmpStr;
Z3DHANDLE handle;
if( (parser.OpenFile( szFilename )) == false )
return false;
while( EOF != parser.ReadLine() )
{
if( parser.GetTokenNum() < 2 )
continue;
// path name line일 경우
const char* rpPath = NULL;
int n;
if( stricmp( "path", parser.GetToken(0) ) == 0 )
{
rpPath = parser.GetToken(1);
n = strlen(rpPath);
if( rpPath[n-1] != '\\' && rpPath[n-1] != '/' )
{
strPath( rpPath, "/" );
}
else
{
strPath( rpPath );
}
continue;
}
// handle-name line 읽어들임
handle = aton(parser.GetToken(0));
tmpStr = new char[strlen(parser.GetToken(1)) + strPath.Length() + 1];
if( tmpStr == NULL )
return false;
strcpy( tmpStr, strPath );
strcat( tmpStr, parser.GetToken(1) );
mapHandle2Name[handle] = tmpStr;
}
return true;
}
template<class _obj>
Z3DTag<_obj> Z3DContainer<_obj>::GetObjectByHandle( Z3DHANDLE handle )
{
Z3DTag<_obj> tag;
tag.m_Handle = handle;
Z3DContainer<_obj>::Z3DContainerElement element = mapHandle2Element[handle];
//if( Z3DContainerElement<_obj> == element )
if( NULL == element.pObj ) // object not loaded yet
{
std::map<Z3DHANDLE, char*>::iterator itName;
itName = mapHandle2Name.find( handle );
if( itName == mapHandle2Name.end() )
{
mapHandle2Element.erase(handle); // delete unwanted item
tag.m_rpObject = NULL;
return tag; // error : invalid handle !
}
element.pObj = new _obj;
if( false == element.pObj->Load( (*itName).second ) ) // _obj type should implement 'Load()' method
{
mapHandle2Element.erase(handle); // delete unwanted item
tag.m_rpObject = NULL;
return tag; // error : invalid file name-_-;
}
//element.lRefCount = 1; // no need to do
}
element.lRefCount++;
mapHandle2Element[handle] = element;
tag.m_rpObject = element.pObj;
return tag;
}
template<class _obj>
bool Z3DContainer<_obj>::Release( Z3DTag<_obj> tag )
{
//_ASSERT( tag.m_Handle );
if( Z3DHANDLE_NULL == tag.m_Handle )
{
return false;
}
_ASSERT( tag.m_rpObject ); // check if tag is not-assigned or released
std::map<Z3DHANDLE, Z3DContainerElement>::iterator itElement;
itElement = mapHandle2Element.find( tag.m_Handle );
if( itElement == mapHandle2Element.end() ) // object not loaded yet
{
return false; // invalid handle!
}
else
{
_ASSERT( tag.m_rpObject == (*itElement).second.pObj ); // check validity of handle-ptr. in tag
(*itElement).second.lRefCount--;
if( !(*itElement).second.lRefCount ) // ref' count reaches zero
{
SAFE_DELETE( (*itElement).second.pObj );
mapHandle2Element.erase( itElement );
}
return true;
}
}
#endif // !defined(AFX_Z3DCONTAINER_H__BB4492E1_BA15_11D4_AD2B_0000E8EB4C69__INCLUDED_)