Initial commit: ROW Client source code

Game client codebase including:
- CharacterActionControl: Character and creature management
- GlobalScript: Network, items, skills, quests, utilities
- RYLClient: Main client application with GUI and event handlers
- Engine: 3D rendering engine (RYLGL)
- MemoryManager: Custom memory allocation
- Library: Third-party dependencies (DirectX, boost, etc.)
- Tools: Development utilities

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

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
2025-11-29 16:24:34 +09:00
commit e067522598
5135 changed files with 1745744 additions and 0 deletions

View File

@@ -0,0 +1,60 @@
/* *********************************************************************
* CBaseCacheMgr , CCacheObj
* <20><><EFBFBD><EFBFBD> : BaseCacheMgr.cpp
* <20><><EFBFBD><EFBFBD> : Caldron<6F><6E><EFBFBD><EFBFBD> <20><><EFBFBD>ο<EFBFBD><CEBF><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ǵ<EFBFBD> <20><><EFBFBD><EFBFBD> CacheMgr<67><72><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> class
* history :
2004.01.16 wizardbug
********************************************************************** */
#include "BaseCacheMgr.h"
#include "SceneManager.h"
#include "GMMemory.h"
namespace Caldron {namespace Base {
/*template < class T >
T *CBaseCacheMgr<T>::LoadData(const char *strFileName)
{
T *pNode = new T;
strcpy(pNode->m_strName,strFileName);
CSceneManager::m_pNewMeshObjectContainer->AddObj(Base::CResourceLoaderObj(strFileName,pNode));
unsigned long DataID = GetHashID(strFileName);
Base::CACHEITER itr = m_CacheTable.find(DataID);
if(itr == m_CacheTable.end())
{
Base::CCacheObj *pObj = new Base::CCacheObj(pNode);
m_CacheTable.insert(Base::CACHETABLEOBJ(DataID,pObj));
m_iCachesNum++;
}
else
{// map <20>ȿ<EFBFBD> <20>Ȱ<EFBFBD><C8B0><EFBFBD> Hash Index <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
((*itr).second)->Add_Back(pNode);
}
return pNode;
}
*/
/*
template < class T >
unsigned long CBaseCacheMgr<T>::GetHashID(const char *strFileName)
{
unsigned long ulHashId = 0;
int iLength = (int)strlen(strFileName);
for(int i=0;i < iLength; i++) {
ulHashId += (( i + 1) * strFileName[i]);
}
return ulHashId;
}
*/
}}

View File

@@ -0,0 +1,264 @@
#if !defined(AFX_BASECACHEMGR_H__C53D076B_14CF_47B5_B21C_F7EF3477C7EA__INCLUDED_)
#define AFX_BASECACHEMGR_H__C53D076B_14CF_47B5_B21C_F7EF3477C7EA__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#pragma warning( disable : 4786 )
#include "../../include/Caldron.h"
#include "./LoadedObj.h"
#include "./ResourceLoader.h"
namespace Caldron {
namespace Base {
/* *********************************************************************
* CCacheObj
* <20><><EFBFBD><EFBFBD> : BaseCacheMgr.h
* <20><><EFBFBD><EFBFBD> : Caldron<6F><6E><EFBFBD><EFBFBD> <20><><EFBFBD>ο<EFBFBD><CEBF><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ǵ<EFBFBD> CacheMgr<67><72><EFBFBD><EFBFBD> data <20><> <20>ٷ<EFBFBD><D9B7><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
* history :
2004.01.16 wizardbug
********************************************************************** */
class CCacheObj {
public:
std::vector<CLoadedObj *> m_lstDatas;
int m_iDatasNum;
CCacheObj() : m_iDatasNum(0)
{
m_lstDatas.clear();
}
CCacheObj(CLoadedObj *pObj) : m_iDatasNum(0)
{
m_lstDatas.clear();
m_lstDatas.push_back(pObj);
pObj->m_iReferenceCount++;
m_iDatasNum++;
}
void Add_Back(CLoadedObj *pObj)
{
m_lstDatas.push_back(pObj);
pObj->m_iReferenceCount++;
m_iDatasNum++;
}
void Remove(int iNum)
{
if(m_iDatasNum <= iNum)
return;
if(m_lstDatas[iNum] && m_lstDatas[iNum]->m_bLoaded)
{
if(!(--m_lstDatas[iNum]->m_iReferenceCount))
{
SafeDelete(m_lstDatas[iNum]);
m_lstDatas.erase(m_lstDatas.begin() + iNum);
m_iDatasNum--;
}
}
}
void AddRef(int iNum)
{
if(m_iDatasNum <= iNum)
return;
if(m_lstDatas[iNum])
{
m_lstDatas[iNum]->m_iReferenceCount++;
}
}
~CCacheObj() {
if(m_iDatasNum > 0)
{
for(int i=0;i < m_iDatasNum; i++)
{
if(m_lstDatas[i])
{
SafeDelete(m_lstDatas[i]);
}
}
}
m_iDatasNum = 0;
m_lstDatas.clear();
}
};
typedef std::map<unsigned long , CCacheObj *> CACHETABLE;
typedef CACHETABLE::value_type CACHETABLEOBJ;
typedef CACHETABLE::iterator CACHEITER;
/* *********************************************************************
* CBaseCacheMgr
* <20><><EFBFBD><EFBFBD> : BaseCacheMgr.h
* <20><><EFBFBD><EFBFBD> : Caldron<6F><6E><EFBFBD><EFBFBD> <20><><EFBFBD>ο<EFBFBD><CEBF><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ǵ<EFBFBD> <20><><EFBFBD><EFBFBD> CacheMgr<67><72><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> class
* history :
2004.01.16 wizardbug
********************************************************************** */
const int DEFAULT_MAXCACHENUM = 100;
template <class T>
class CBaseCacheMgr
{
protected:
unsigned long GetHashID(const char *strFileName)
{
unsigned long ulHashId = 0;
int iLength = (int)strlen(strFileName);
for(int i=0;i < iLength; i++) {
ulHashId += (( i + 1) * strFileName[i]);
}
return ulHashId;
}
CACHETABLE m_CacheTable;
int m_iCachesNum;
public:
CBaseCacheMgr(): m_iCachesNum(0)
{
m_CacheTable.clear();
}
virtual ~CBaseCacheMgr()
{
//if(m_iCachesNum > 0)
//{
for(CACHEITER Itr = m_CacheTable.begin(); Itr != m_CacheTable.end();)
{
if(Itr->second != NULL)
{
SafeDelete(Itr->second);
}
Itr++;
}
m_CacheTable.clear();
m_iCachesNum = 0;
//}
}
void DeleteAllData()
{
// if(m_iCachesNum > 0)
// {
for(CACHEITER Itr = m_CacheTable.begin(); Itr != m_CacheTable.end();)
{
if(Itr->second != NULL)
{
SafeDelete(Itr->second);
}
Itr++;
}
m_CacheTable.clear();
m_iCachesNum = 0;
// }
}
void DeleteData(const char *strFileName)
{
unsigned long DataID = GetHashID(strFileName);
Base::CACHEITER itr = m_CacheTable.find(DataID);
if(itr != m_CacheTable.end())
{
if((*itr).second != NULL)
{
for(int iNum = 0; iNum < (*itr).second->m_iDatasNum; iNum++)
{
if(!strcmp((*itr).second->m_lstDatas[iNum]->m_strName,strFileName))
{
((*itr).second)->Remove(iNum);
}
}
}
}
}
T *GetData(const char *strFileName)
{
unsigned long DataID = GetHashID(strFileName);
Base::CACHEITER itr = m_CacheTable.find(DataID);
if(itr == m_CacheTable.end())
{
return LoadData(strFileName);
}
else // Table <20>ȿ<EFBFBD> <20>̹<EFBFBD> texture <20><> <20>ε<EFBFBD><CEB5>Ǿ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
if((*itr).second != NULL)
{
for(int iNum = 0; iNum < (*itr).second->m_iDatasNum; iNum++)
{
if(!strcmp((*itr).second->m_lstDatas[iNum]->m_strName,strFileName))
{
(*itr).second->AddRef(iNum);
return (T *)((*itr).second->m_lstDatas[iNum]);
}
}
return LoadData(strFileName); // Table <20><> obj<62><6A> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>ϴ<EFBFBD> obj <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
}
return NULL;
}
T *LoadData(const char *strFileName)
{
T *pNode = new T;
strcpy(pNode->m_strName,strFileName);
CResourceLoader::AddObj(pNode);
unsigned long DataID = GetHashID(strFileName);
Base::CACHEITER itr = m_CacheTable.find(DataID);
if(itr == m_CacheTable.end())
{
Base::CCacheObj *pObj = new Base::CCacheObj(pNode);
m_CacheTable.insert(Base::CACHETABLEOBJ(DataID,pObj));
m_iCachesNum++;
}
else
{// map <20>ȿ<EFBFBD> <20>Ȱ<EFBFBD><C8B0><EFBFBD> Hash Index <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
((*itr).second)->Add_Back(pNode);
}
return pNode;
}
// virtual void *GetData(const char *strFileName) = 0;
// virtual void *LoadData(const char *strFileName) = 0;
};
}
}
#endif // !defined(AFX_BASECACHEMGR_H__C53D076B_14CF_47B5_B21C_F7EF3477C7EA__INCLUDED_)

View File

@@ -0,0 +1,124 @@
/* *********************************************************************
* CByteDataObj
* <20><><EFBFBD><EFBFBD> : ByteDataObj.h
* <20><><EFBFBD><EFBFBD> : Caldron Engine<6E><65> CResourceMgr <20><><EFBFBD><EFBFBD> <20>о<EFBFBD><D0BE><EFBFBD><EFBFBD>̴<EFBFBD> <20><><EFBFBD>ҽ<EFBFBD><D2BD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>Ǵ<EFBFBD> <20><20><><EFBFBD><EFBFBD>.
CLoadedObj<62><6A> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD>ҽ<EFBFBD> <20><><EFBFBD><EFBFBD> obj <20><><EFBFBD><EFBFBD> Load <20><>ƾ<EFBFBD><C6BE><EFBFBD><EFBFBD> <20><> <20><><EFBFBD>ҽ<EFBFBD><D2BD><EFBFBD> <20>˸<EFBFBD><CBB8><EFBFBD> <20><><EFBFBD>·<EFBFBD> <20><>ȯ <20>ε<EFBFBD> <20>ȴ<EFBFBD>.
* <20>ۼ<EFBFBD><DBBC><EFBFBD> : 2004.01.06
* history :
wizardbug ( 2004.01.06)
********************************************************************** */
#include "ByteDataObj.h"
#include <windows.h>
#include <stdio.h>
namespace Caldron {
namespace Base {
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CByteDataObj::CByteDataObj()
{
m_pBytes = NULL;
m_lSize = 0;
m_lReadPos = 0;
}
CByteDataObj::~CByteDataObj()
{
if(m_pBytes)
{
delete[] m_pBytes;
m_pBytes = NULL;
m_lSize = 0;
m_lReadPos = 0;
}
}
unsigned char *CByteDataObj::GetReadPtr()
{
if((m_lReadPos >= m_lSize) || (m_pBytes == NULL))
{
return NULL;
}
return &(m_pBytes[m_lReadPos]);
}
bool CByteDataObj::LoadByte(char *strFileName,long lOffset)
{
FILE *fp = fopen(strFileName,"rb");
long lFileSize = 0;
if(fp == NULL)
{
return false;
}
fseek(fp,0,SEEK_END);
m_lSize = ftell(fp);
if(m_lSize <= 0)
{
fclose(fp);
return false;
}
// Offset <20><><EFBFBD><EFBFBD>
if(m_lSize > lOffset)
m_lSize -= lOffset;
else
{
fclose(fp);
return false;
}
m_pBytes = new unsigned char[m_lSize];
if(m_pBytes == NULL)
{
fclose(fp);
return false;
}
fseek(fp,lOffset,SEEK_SET);
if(fread((unsigned char *)m_pBytes,sizeof(unsigned char),m_lSize,fp) != m_lSize)
{
fclose(fp);
return false;
}
fclose(fp);
return true;
}
long CByteDataObj::Read(void *ptr,size_t UnitSize,int iNum)
{
if(ptr == NULL)
return -1;
long lCurrentReaded = ((long)(UnitSize) * iNum) / UINT_SIZE;
if(m_lSize >= lCurrentReaded + m_lReadPos)
{
memcpy(ptr,&(m_pBytes[m_lReadPos]), (size_t)(UINT_SIZE * lCurrentReaded));
m_lReadPos += lCurrentReaded;
}
else
{
return -1;
}
return m_lReadPos;
}
}}

View File

@@ -0,0 +1,55 @@
// ByteDataObj.h: interface for the CByteDataObj class.
//
//////////////////////////////////////////////////////////////////////
#if !defined(AFX_BYTEDATAOBJ_H__A71C88C6_A81A_4696_9922_802A8B1C119A__INCLUDED_)
#define AFX_BYTEDATAOBJ_H__A71C88C6_A81A_4696_9922_802A8B1C119A__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
namespace Caldron {
namespace Base {
const long UINT_SIZE = (long)sizeof(unsigned char);
/* *********************************************************************
* CByteDataObj
* <20><><EFBFBD><EFBFBD> : ByteDataObj.h
* <20><><EFBFBD><EFBFBD> : Caldron Engine<6E><65> CResourceMgr <20><><EFBFBD><EFBFBD> <20>о<EFBFBD><D0BE><EFBFBD><EFBFBD>̴<EFBFBD> <20><><EFBFBD>ҽ<EFBFBD><D2BD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>Ǵ<EFBFBD> <20><20><><EFBFBD><EFBFBD>.
CLoadedObj<62><6A> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD>ҽ<EFBFBD> <20><><EFBFBD><EFBFBD> obj <20><><EFBFBD><EFBFBD> Load <20><>ƾ<EFBFBD><C6BE><EFBFBD><EFBFBD> <20><> <20><><EFBFBD>ҽ<EFBFBD><D2BD><EFBFBD> <20>˸<EFBFBD><CBB8><EFBFBD> <20><><EFBFBD>·<EFBFBD> <20><>ȯ <20>ε<EFBFBD> <20>ȴ<EFBFBD>.
* <20>ۼ<EFBFBD><DBBC><EFBFBD> : 2004.01.06
* history :
wizardbug ( 2004.01.06)
********************************************************************** */
class CByteDataObj
{
public:
CByteDataObj();
virtual ~CByteDataObj();
bool LoadByte(char *strFileName,long lOffset = 0 );
long GetByteSize() { return m_lSize; }
long GetReadPos() { return m_lReadPos;}
void SetReadPos(long lPos) { m_lReadPos = lPos;}
unsigned char *GetReadPtr();
long Read(void *ptr,size_t UnitSize,int iNum);
unsigned char *m_pBytes;
long m_lSize;
long m_lReadPos;
};
}}
#endif // !defined(AFX_BYTEDATAOBJ_H__A71C88C6_A81A_4696_9922_802A8B1C119A__INCLUDED_)

View File

@@ -0,0 +1,27 @@
/* *********************************************************************
#include "GMMemory.h"
* Caldron Engine <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* <20><><EFBFBD><EFBFBD> : Caldron.h
* <20><><EFBFBD><EFBFBD> : Caldron namespace<63><65> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
* <20>ۼ<EFBFBD><DBBC><EFBFBD> : 2003.10.23
* <20>ۼ<EFBFBD><DBBC><EFBFBD> : yundi ( 2003.10.23)
* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> :
********************************************************************** */
namespace Caldron
{
//const float FLOAT_RAD = 0.0174532925f;
extern const float FLOAT_PI2 = 1.57079632679f;
extern const float FLOAT_PI = 3.14159265358979323846f;
extern const float FLOAT_2PI = 6.28318530717958647692f;
extern const float MIN_EPSILON = 1.0e-4f;
extern const float MAX_EPSILON = 1.0e+10f;
extern const int MAX_STRINGSIZE = 40;
// const int MAX_RELOADING = 3;
}

View File

@@ -0,0 +1,125 @@
/* *********************************************************************
* CByteDataObj
* <20><><EFBFBD><EFBFBD> : ByteDataObj.h
* <20><><EFBFBD><EFBFBD> : Caldron Engine<6E><65> CResourceMgr <20><><EFBFBD><EFBFBD> <20>о<EFBFBD><D0BE><EFBFBD><EFBFBD>̴<EFBFBD> <20><><EFBFBD>ҽ<EFBFBD><D2BD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>Ǵ<EFBFBD> <20><20><><EFBFBD><EFBFBD>.
CLoadedObj<62><6A> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD>ҽ<EFBFBD> <20><><EFBFBD><EFBFBD> obj <20><><EFBFBD><EFBFBD> Load <20><>ƾ<EFBFBD><C6BE><EFBFBD><EFBFBD> <20><> <20><><EFBFBD>ҽ<EFBFBD><D2BD><EFBFBD> <20>˸<EFBFBD><CBB8><EFBFBD> <20><><EFBFBD>·<EFBFBD> <20><>ȯ <20>ε<EFBFBD> <20>ȴ<EFBFBD>.
* <20>ۼ<EFBFBD><DBBC><EFBFBD> : 2004.01.06
* history :
wizardbug ( 2004.01.06)
********************************************************************** */
#include "CaldronByteDataObj.h"
#include <windows.h>
#include <stdio.h>
#include "GMMemory.h"
namespace Caldron {
namespace Base {
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CCaldronByteDataObj::CCaldronByteDataObj()
{
m_pBytes = NULL;
m_lSize = 0;
m_lReadPos = 0;
}
CCaldronByteDataObj::~CCaldronByteDataObj()
{
if(m_pBytes)
{
delete[] m_pBytes;
m_pBytes = NULL;
m_lSize = 0;
m_lReadPos = 0;
}
}
unsigned char *CCaldronByteDataObj::GetReadPtr()
{
if((m_lReadPos >= m_lSize) || (m_pBytes == NULL))
{
return NULL;
}
return &(m_pBytes[m_lReadPos]);
}
bool CCaldronByteDataObj::LoadByte(char *strFileName,long lOffset)
{
FILE *fp = fopen(strFileName,"rb");
long lFileSize = 0;
if(fp == NULL)
{
return false;
}
fseek(fp,0,SEEK_END);
m_lSize = ftell(fp);
if(m_lSize <= 0)
{
fclose(fp);
return false;
}
// Offset <20><><EFBFBD><EFBFBD>
if(m_lSize > lOffset)
m_lSize -= lOffset;
else
{
fclose(fp);
return false;
}
m_pBytes = new unsigned char[m_lSize];
if(m_pBytes == NULL)
{
fclose(fp);
return false;
}
fseek(fp,lOffset,SEEK_SET);
if(fread((unsigned char *)m_pBytes,sizeof(unsigned char),m_lSize,fp) != m_lSize)
{
fclose(fp);
return false;
}
fclose(fp);
return true;
}
long CCaldronByteDataObj::Read(void *ptr,size_t UnitSize,int iNum)
{
if(ptr == NULL)
return -1;
long lCurrentReaded = ((long)(UnitSize) * iNum) / UINT_SIZE;
if(m_lSize >= lCurrentReaded + m_lReadPos)
{
memcpy(ptr,&(m_pBytes[m_lReadPos]), (size_t)(UINT_SIZE * lCurrentReaded));
m_lReadPos += lCurrentReaded;
}
else
{
return -1;
}
return m_lReadPos;
}
}}

View File

@@ -0,0 +1,55 @@
// ByteDataObj.h: interface for the CByteDataObj class.
//
//////////////////////////////////////////////////////////////////////
#if !defined(AFX_BYTEDATAOBJ_H__A71C88C6_A81A_4696_9922_802A8B1C119A__INCLUDED_)
#define AFX_BYTEDATAOBJ_H__A71C88C6_A81A_4696_9922_802A8B1C119A__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
namespace Caldron {
namespace Base {
const long UINT_SIZE = (long)sizeof(unsigned char);
/* *********************************************************************
* CByteDataObj
* <20><><EFBFBD><EFBFBD> : ByteDataObj.h
* <20><><EFBFBD><EFBFBD> : Caldron Engine<6E><65> CResourceMgr <20><><EFBFBD><EFBFBD> <20>о<EFBFBD><D0BE><EFBFBD><EFBFBD>̴<EFBFBD> <20><><EFBFBD>ҽ<EFBFBD><D2BD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>Ǵ<EFBFBD> <20><20><><EFBFBD><EFBFBD>.
CLoadedObj<62><6A> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD>ҽ<EFBFBD> <20><><EFBFBD><EFBFBD> obj <20><><EFBFBD><EFBFBD> Load <20><>ƾ<EFBFBD><C6BE><EFBFBD><EFBFBD> <20><> <20><><EFBFBD>ҽ<EFBFBD><D2BD><EFBFBD> <20>˸<EFBFBD><CBB8><EFBFBD> <20><><EFBFBD>·<EFBFBD> <20><>ȯ <20>ε<EFBFBD> <20>ȴ<EFBFBD>.
* <20>ۼ<EFBFBD><DBBC><EFBFBD> : 2004.01.06
* history :
wizardbug ( 2004.01.06)
********************************************************************** */
class CCaldronByteDataObj
{
public:
CCaldronByteDataObj();
virtual ~CCaldronByteDataObj();
bool LoadByte(char *strFileName,long lOffset = 0 );
long GetByteSize() { return m_lSize; }
long GetReadPos() { return m_lReadPos;}
void SetReadPos(long lPos) { m_lReadPos = lPos;}
unsigned char *GetReadPtr();
long Read(void *ptr,size_t UnitSize,int iNum);
unsigned char *m_pBytes;
long m_lSize;
long m_lReadPos;
};
}}
#endif // !defined(AFX_BYTEDATAOBJ_H__A71C88C6_A81A_4696_9922_802A8B1C119A__INCLUDED_)

View File

@@ -0,0 +1,25 @@
// LoadedObj.cpp: implementation of the CLoadedObj class.
//
//////////////////////////////////////////////////////////////////////
#pragma warning( disable : 4786 )
#include <include/Caldron.h>
#include "./CaldronByteDataObj.h"
#include "LoadedObj.h"
#include "GMMemory.h"
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
namespace Caldron { namespace Base {
CLoadedObj::CLoadedObj(const char *strFileName) : m_bLoaded(false),m_iReloadingCount(0),m_pByteDataObj(0)
{
strcpy(m_strName,strFileName);
}
CLoadedObj::~CLoadedObj()
{
SafeDelete(m_pByteDataObj);
m_pByteDataObj = 0;
}
}}

View File

@@ -0,0 +1,54 @@
// LoadedObj.h: interface for the CLoadedObj class.
//
//////////////////////////////////////////////////////////////////////
#if !defined(AFX_LOADEDOBJ_H__7BBE3A5F_6665_4F40_AA4D_82BACEBC32D3__INCLUDED_)
#define AFX_LOADEDOBJ_H__7BBE3A5F_6665_4F40_AA4D_82BACEBC32D3__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#include "./CaldronByteDataObj.h"
namespace Caldron {
namespace Base {
/* *********************************************************************
* CLoadedObj
* <20><><EFBFBD><EFBFBD> : LoadedObj.h
* <20><><EFBFBD><EFBFBD> : Caldron Engine<6E><65> CResourceMgr <20><> <20>̿<EFBFBD><CCBF><EFBFBD> <20>ε<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ҽ<EFBFBD> obj <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> class
* <20>ۼ<EFBFBD><DBBC><EFBFBD> : 2004.01.06
* history :
wizardbug ( 2004.01.06)
********************************************************************** */
class CLoadedObj
{
public:
CLoadedObj() : m_bLoaded(false),m_iReloadingCount(0),m_pByteDataObj(0),m_bFirst(0),m_iReferenceCount(0)
{}
CLoadedObj(const char *strFileName);
virtual ~CLoadedObj();
virtual bool Load(CCaldronByteDataObj *) = 0;
virtual bool PostLoad() = 0;
//virtual bool Unload() = 0;
bool m_bLoaded;
bool m_bFirst;
char m_strName[256];
int m_iReloadingCount; // ReLoading Ƚ<><C8BD>.
unsigned int m_iReferenceCount;
CCaldronByteDataObj *m_pByteDataObj;
};
}
}
#endif // !defined(AFX_LOADEDOBJ_H__7BBE3A5F_6665_4F40_AA4D_82BACEBC32D3__INCLUDED_)

View File

@@ -0,0 +1,319 @@
/* *********************************************************************
* CLogMgr
* <20><><EFBFBD><EFBFBD> : LogMgr.cpp
* <20><><EFBFBD><EFBFBD> : Caldron Engine<6E><65> <20>޼<EFBFBD><DEBC><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> ó<><C3B3><EFBFBD>ϴ<EFBFBD> Log System
* <20>ۼ<EFBFBD><DBBC><EFBFBD> : 2003.10.23
* <20>ۼ<EFBFBD><DBBC><EFBFBD> : wizardbug ( 2003.10.23)
* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> :
********************************************************************** */
#include "./LogMgr.h"
#include "./Console.h"
#include "../Scene/MainSceneMgr.h"
//////////////////////////////////////////////////////////////////////
// static <20>Լ<EFBFBD>, <20><><EFBFBD><EFBFBD>
//////////////////////////////////////////////////////////////////////
Caldron::Base::CLogMgr *Caldron::Base::CLogMgr::ms_pInstance = NULL;
/*
Caldron::Base::CLogMgr *Caldron::Base::CLogMgr::_GetInstance();
void Caldron::Base::CLogMgr::_LogMessage(const char *,...);
void Caldron::Base::CLogMgr::_LogError(const char *,...);
void Caldron::Base::CLogMgr::_SetOutDevice(Caldron::LOG_OUTDEVICES iDevice);
void Caldron::Base::CLogMgr::_SetOutMessageFlag(Caldron::LOG_MESSAGES iMessage,bool bFlag);
void Caldron::Base::CLogMgr::_Close();
*/
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
Caldron::Base::CLogMgr::CLogMgr() : m_pLogFile(0), m_iOutDevice(Caldron::LOG_FILEOUT),m_bBufferEmpty(true)
{
m_pBitFlag = new CBitset;
if(m_pBitFlag != NULL)
{
m_pBitFlag->ResizeBits(Caldron::LOG_MESSAGES_NUM);
m_pBitFlag->ClearBits();
for(int i = 0; i < Caldron::LOG_MESSAGES_NUM; i++ )
{
m_pBitFlag->SetBit(i);
}
}
memset((char *)m_pLogBuffer,sizeof(char),2560);
memset((char *)m_pLogFileName,sizeof(char),256);
}
void Caldron::Base::CLogMgr::ValueRelease()
{
if(m_pLogFile != NULL)
{
fclose(m_pLogFile);
m_pLogFile = NULL;
}
Caldron::SafeDelete(m_pBitFlag);
m_pBitFlag = NULL;
}
Caldron::Base::CLogMgr::~CLogMgr()
{
}
void Caldron::Base::CLogMgr::_Close()
{
if(ms_pInstance != NULL)
{
ms_pInstance->ValueRelease();
Caldron::SafeDelete(ms_pInstance);
ms_pInstance = NULL;
}
}
Caldron::Base::CLogMgr *Caldron::Base::CLogMgr::_GetInstance()
{
if(ms_pInstance == NULL)
{
ms_pInstance = new Caldron::Base::CLogMgr;
ms_pInstance->WriteFirstRunLog();
}
return ms_pInstance;
}
void Caldron::Base::CLogMgr::_SetOutDevice(Caldron::LOG_OUTDEVICES iDevice)
{
if(ms_pInstance == NULL)
{
_GetInstance(); // CLogMgr <20><><EFBFBD><EFBFBD>
}
switch(iDevice)
{
case LOG_FILEOUT:
case LOG_CONSOLEOUT: // Console
case LOG_MESSAGEBOXOUT: // Window Message Box
ms_pInstance->m_iOutDevice = iDevice;
break;
default:
_LogError("CLogMgr::SetOutDevice() | <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʴ<EFBFBD> Device<63><65> <20><><EFBFBD><EFBFBD><EFBFBD>ϼ̽<CFBC><CCBD>ϴ<EFBFBD>.");
break;
}
}
void Caldron::Base::CLogMgr::_SetOutMessageFlag(Caldron::LOG_MESSAGES iMessage,bool bFlag)
{
if(ms_pInstance == NULL)
{
_GetInstance(); // CLogMgr <20><><EFBFBD><EFBFBD>
}
if(ms_pInstance->m_pBitFlag != NULL) {
if(bFlag == true)
{
ms_pInstance->m_pBitFlag->SetBit(iMessage);
ms_pInstance->_LogMessage("======= %s Bit On =======",LOG_LABEL[iMessage]);
}
else
{
ms_pInstance->_LogMessage("======= %s Bit Off =======",LOG_LABEL[iMessage]);
ms_pInstance->m_pBitFlag->ClearOneBit(iMessage);
}
}
}
void Caldron::Base::CLogMgr::_LogMessage(const char *pFormat,...)
{
if(ms_pInstance == NULL)
{
_GetInstance(); // CLogMgr <20><><EFBFBD><EFBFBD>
}
if((ms_pInstance->m_pBitFlag != NULL) && (!ms_pInstance->m_pBitFlag->GetBit(Caldron::LOG_MESSAGE)))
return;
/*
// Checking <20><>ƾ<EFBFBD><C6BE><EFBFBD><EFBFBD>
char *pCheckptr = (char *)pFormat;
int iFCount = 0; // % Count
while((*pCheckptr) != '\0')
{
if((*pCheckptr) == '%')
iFCount++;
pCheckptr++;
}
int iExist = 0;
int iVaCount = 0;
va_list ap;
va_start( ap, pFormat );
while( iExist != -1 )
{
iVaCount++;
iExist = va_arg( ap, char);
}
va_end( ap );
if( iFCount != iVaCount )
return;
// Checking <20><>ƾ<EFBFBD><C6BE><EFBFBD><EFBFBD>
*/
va_list ap;
va_start(ap, pFormat);
vsprintf(ms_pInstance->m_pLogBuffer, pFormat, ap);
va_end(ap);
ms_pInstance->m_bBufferEmpty = false;
switch(ms_pInstance->m_iOutDevice)
{
case LOG_FILEOUT:
ms_pInstance->WriteBufferToFile(LOG_MESSAGE);
break;
case LOG_CONSOLEOUT: // Console
ms_pInstance->WriteBufferToConsole(LOG_MESSAGE);
break;
case LOG_MESSAGEBOXOUT: // Window Message Box
ms_pInstance->WriteBufferToMessageBox(LOG_MESSAGE);
break;
}
}
void Caldron::Base::CLogMgr::_LogError(const char *pFormat,...)
{
if(ms_pInstance == NULL)
{
_GetInstance(); // CLogMgr <20><><EFBFBD><EFBFBD>
}
if((ms_pInstance->m_pBitFlag != NULL) && (!ms_pInstance->m_pBitFlag->GetBit(Caldron::LOG_ERROR)))
return;
va_list ap;
va_start(ap, pFormat);
vsprintf(ms_pInstance->m_pLogBuffer, pFormat, ap);
va_end(ap);
ms_pInstance->m_bBufferEmpty = false;
switch(ms_pInstance->m_iOutDevice)
{
case LOG_FILEOUT:
ms_pInstance->WriteBufferToFile(LOG_ERROR);
break;
case LOG_CONSOLEOUT: // Console
ms_pInstance->WriteBufferToConsole(LOG_ERROR);
break;
case LOG_MESSAGEBOXOUT: // Window Message Box
ms_pInstance->WriteBufferToMessageBox(LOG_ERROR);
break;
}
}
void Caldron::Base::CLogMgr::_LogNoHeader(const char *pFormat,...)
{
if(ms_pInstance == NULL)
{
_GetInstance(); // CLogMgr <20><><EFBFBD><EFBFBD>
}
if((ms_pInstance->m_pBitFlag != NULL) && (!ms_pInstance->m_pBitFlag->GetBit(Caldron::LOG_NOHEADER)))
return;
va_list ap;
va_start(ap, pFormat);
vsprintf(ms_pInstance->m_pLogBuffer, pFormat, ap);
va_end(ap);
ms_pInstance->m_bBufferEmpty = false;
switch(ms_pInstance->m_iOutDevice)
{
case LOG_FILEOUT:
ms_pInstance->WriteBufferToFile(LOG_NOHEADER);
break;
case LOG_CONSOLEOUT: // Console
ms_pInstance->WriteBufferToConsole(LOG_NOHEADER);
break;
case LOG_MESSAGEBOXOUT: // Window Message Box
ms_pInstance->WriteBufferToMessageBox(LOG_NOHEADER);
break;
}
}
void Caldron::Base::CLogMgr::WriteFirstRunLog()
{
time_t t = time(NULL);
char *pDate = asctime(localtime(&t));
if(m_pLogFile == NULL)
{
m_pLogFile = fopen(Caldron::Base::LOG_FILENAME,"at+");
}
if(m_pLogFile != NULL)
{
fprintf(m_pLogFile,"\n!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n");
fprintf(m_pLogFile,"!!!!!!! Below Logs, Application Last Run !!!!!!! %s",pDate);
fprintf(m_pLogFile,"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n\n");
fclose(m_pLogFile);
}
m_pLogFile = NULL;
}
void Caldron::Base::CLogMgr::WriteBufferToFile(Caldron::LOG_MESSAGES iMessage)
{
time_t t = time(NULL);
char *pDate = asctime(localtime(&t));
if(m_pLogFile == NULL)
{
m_pLogFile = fopen(Caldron::Base::LOG_FILENAME,"at+");
}
if(m_pLogFile != NULL)
{
if(iMessage == LOG_NOHEADER)
{
fprintf(m_pLogFile,"%s",m_pLogBuffer);
}
else
fprintf(m_pLogFile,"%s %s | %s",LOG_LABEL[iMessage],m_pLogBuffer,pDate);
fclose(m_pLogFile);
}
m_pLogFile = NULL;
}
void Caldron::Base::CLogMgr::WriteBufferToConsole(Caldron::LOG_MESSAGES iMessage)
{
if(iMessage == LOG_NOHEADER)
{
Caldron::Scene::CMainSceneMgr::_GetConsole()->AddText("%s",m_pLogBuffer);
}
else
Caldron::Scene::CMainSceneMgr::_GetConsole()->AddText("%s %s",LOG_LABEL[iMessage],m_pLogBuffer);
}
void Caldron::Base::CLogMgr::WriteBufferToMessageBox(Caldron::LOG_MESSAGES iMessage)
{
MessageBox(NULL,m_pLogBuffer,LOG_LABEL[iMessage],MB_OK);
}

View File

@@ -0,0 +1,96 @@
// WBLogSystem.h: interface for the WBLogSystem class.
//
//////////////////////////////////////////////////////////////////////
#if !defined(AFX_WBLOGSYSTEM_H__3836C71D_3ABD_4A3D_99E8_385123E4F17C__INCLUDED_)
#define AFX_WBLOGSYSTEM_H__3836C71D_3ABD_4A3D_99E8_385123E4F17C__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
/* *********************************************************************
* CLogMgr
* <20><><EFBFBD><EFBFBD> : LogMgr.h
* <20><><EFBFBD><EFBFBD> : Caldron Engine<6E><65> <20>޼<EFBFBD><DEBC><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> ó<><C3B3><EFBFBD>ϴ<EFBFBD> Log System
* <20>ۼ<EFBFBD><DBBC><EFBFBD> : 2003.10.23
* <20>ۼ<EFBFBD><DBBC><EFBFBD> : wizardbug ( 2003.10.23)
* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> :
********************************************************************** */
#include <time.h>
#include "../../include/Caldron.h"
//#define __LOG_WRITE__ // __LOG_WRITE__ <20><> define <20><><EFBFBD><EFBFBD><EFBFBD>־<EFBFBD><D6BE><EFBFBD> Log <20><> <20><><EFBFBD>µȴ<C2B5>.
namespace Caldron
{
// <20>ܺη<DCBA> <20><><EFBFBD><EFBFBD><EFBFBD>Ǵ<EFBFBD> Enum.
enum LOG_MESSAGES
{
LOG_MESSAGE, // <20>Ϲ<EFBFBD> Log Message
LOG_ERROR, // Error Log Message
LOG_NOHEADER, // Header <20><><EFBFBD><EFBFBD> <20>޼<EFBFBD><DEBC><EFBFBD>.
LOG_MESSAGES_NUM,
};
enum LOG_OUTDEVICES
{
LOG_FILEOUT, // Log File
LOG_CONSOLEOUT, // Console
LOG_MESSAGEBOXOUT, // Window Message Box
LOG_OUTDEVICES_NUM,
};
namespace Base
{
const char * const LOG_LABEL[3] = {
" LOG[ MESSAGE ] | ",
" LOG[ ERROR ] | ",
""
};
const char LOG_FILENAME[] = "Caldron.log";
class CLogMgr
{
private:
static CLogMgr *ms_pInstance;
FILE *m_pLogFile;
Caldron::LOG_OUTDEVICES m_iOutDevice;
char m_pLogBuffer[2560]; // Log Buffer
char m_pLogFileName[256];
bool m_bBufferEmpty;
CBitset *m_pBitFlag;
protected:
CLogMgr();
void WriteBufferToFile(Caldron::LOG_MESSAGES);
void WriteBufferToConsole(Caldron::LOG_MESSAGES);
void WriteBufferToMessageBox(Caldron::LOG_MESSAGES);
void WriteFirstRunLog();
public:
~CLogMgr();
void ValueRelease();
static void _SetOutDevice(Caldron::LOG_OUTDEVICES iDevice);
static CLogMgr * _GetInstance();
static void _LogMessage(const char *,...);
static void _LogError(const char *,...);
static void _LogNoHeader(const char *,...);
static void _SetOutMessageFlag(Caldron::LOG_MESSAGES iMessage,bool bFlag);
static void _Close();
};
};
};
#endif // !defined(AFX_WBLOGSYSTEM_H__3836C71D_3ABD_4A3D_99E8_385123E4F17C__INCLUDED_)

View File

@@ -0,0 +1,425 @@
#pragma warning( disable : 4786 )
#include "../../include/Caldron.h"
#include "./LoadedObj.h"
#include "ResourceLoader.h"
#include "GMMemory.h"
namespace Caldron {namespace Base {
/* *********************************************************************
* CResourceLoaderObj
* <20><><EFBFBD><EFBFBD> : ResourceLoader.cpp
* <20><><EFBFBD><EFBFBD> : Caldron Engine<6E><65> CResourceLoader <20><><EFBFBD><EFBFBD> Load Queue<75><65> <20><><EFBFBD> resource <20><><EFBFBD><EFBFBD>
* <20>ۼ<EFBFBD><DBBC><EFBFBD> : 2004.01.06
* history :
wizardbug ( 2004.01.06)
********************************************************************** */
/*
CResourceLoaderObj::CResourceLoaderObj()
{
m_pObj = NULL;
m_State = RLOBJSTATE_READY;
}
CResourceLoaderObj::CResourceLoaderObj(const char *strFileName,CLoadedObj *pObj)
{
strcpy(m_strFileName,strFileName);
m_pObj = pObj;
m_pObj->m_bLoaded = false;
m_State = RLOBJSTATE_READY;
}
CResourceLoaderObj::~CResourceLoaderObj()
{
}
*/
/* *********************************************************************
* CResourceLoader
* <20><><EFBFBD><EFBFBD> : ResourceLoader.cpp
* <20><><EFBFBD><EFBFBD> : Caldron Engine<6E><65> ResourceLoader,
thread<61><64> <20>и<EFBFBD><D0B8>Ͽ<EFBFBD> <20>޸<EFBFBD> <20><>ƾ <20><> <20>ε<EFBFBD><CEB5><EFBFBD>ƾ<EFBFBD><C6BE> <20>и<EFBFBD> <20>Ͽ<EFBFBD><CFBF><EFBFBD>.
* <20>ۼ<EFBFBD><DBBC><EFBFBD> : 2004.01.06
* history :
wizardbug ( 2004.01.06)
********************************************************************** */
CThreadQueue<CLoadedObj *> CResourceLoader::m_ReadyQueue(g_iMaxLoaderQueue);
DWORD WINAPI LoaderThreadProc(LPVOID lpParam)
{
CResourceLoader *pLoader = (CResourceLoader *)(lpParam);
pLoader->LoaderFunc();
return 0;
}
DWORD WINAPI ProcessThreadProc(LPVOID lpParam)
{
CResourceLoader *pLoader = (CResourceLoader *)(lpParam);
pLoader->ProcessFunc();
return 0;
}
void CResourceLoader::StartLoader()
{
if(!m_LoaderHandle)
{
if((m_LoaderHandle = CreateThread(NULL,0,LoaderThreadProc,(LPVOID)this,0,&m_LoaderThreadID)) == NULL) {
//CLogMgr::_LogError("CResourceLoader::Loading() : Create Loader Thread Failed");
}
}
if(!m_ProcessHandle)
{
if((m_ProcessHandle = CreateThread(NULL,0,ProcessThreadProc,(LPVOID)this,0,&m_ProcessThreadID)) == NULL) {
//CLogMgr::_LogError("CResourceLoader::Loading() : Create Process Thread Failed");
}
}
}
void CResourceLoader::LoaderFunc()
{
CLoadedObj *pObj = NULL;
while( m_ReadyQueue.RemoveFront(pObj))
{
if(pObj)
{
if(pObj->m_pByteDataObj)
delete pObj->m_pByteDataObj;
pObj->m_pByteDataObj = new CCaldronByteDataObj;
if(!(pObj->m_pByteDataObj->LoadByte(pObj->m_strName)))
{
pObj->m_bLoaded = false;
}
else
{
m_Queue.PushBack(pObj);
}
}
}
}
void CResourceLoader::ProcessFunc()
{
CLoadedObj *pObj = NULL;
while( m_Queue.RemoveFront(pObj))
{
if(pObj)
{
if(!pObj->Load(pObj->m_pByteDataObj))
{ // <20>ε<EFBFBD> <20><><EFBFBD>нÿ<D0BD> <20>ٽ<EFBFBD> queue<75><65> <20>־ ReLoading <20>õ<EFBFBD> <20>Ѵ<EFBFBD>.
if(pObj->m_iReloadingCount < Caldron::MAX_RELOADING) {
pObj->m_bLoaded = false;
m_Queue.PushBack(pObj);
//CLogMgr::_LogError("CResourceLoader::ProcessFunc: Load fail, Reloading.");
pObj->m_iReloadingCount++;
}
else
{
pObj->m_bLoaded = false;
}
}
else
{
m_ResultQueue.PushBack(pObj);
}
}
else
{
//CLogMgr::_LogError("CResourceLoader::ProcessFunc: Obj Ptr is NULL");
}
}
}
void CResourceLoader::ProcessAllData()
{
while(1)
{
Sleep(2000);
if(!m_ReadyQueue.GetQueueSize() &&
!m_Queue.GetQueueSize())
{
break;
}
}
if(m_ResultQueue.GetQueueSize())
{
int iProcess = m_ResultQueue.GetQueueSize();
CLoadedObj *pObj = NULL;
while(iProcess)
{
if(m_ResultQueue.RemoveFront(pObj))
{
pObj->PostLoad();
SafeDelete(pObj->m_pByteDataObj);
pObj->m_pByteDataObj = NULL;
}
else
{
break;
}
iProcess--;
}
}
}
void CResourceLoader::Process()
{
if(m_ResultQueue.GetQueueSize())
{
int iProcess = (m_ResultQueue.GetQueueSize() > g_iMaxProcessNums) ? g_iMaxProcessNums : m_ResultQueue.GetQueueSize();
CLoadedObj *pObj = NULL;
while(iProcess)
{
if(m_ResultQueue.RemoveFront(pObj))
{
pObj->PostLoad();
SafeDelete(pObj->m_pByteDataObj);
pObj->m_pByteDataObj = NULL;
}
else
{
break;
}
iProcess--;
}
}
}
void CResourceLoader::Clear()
{
ProcessAllData();
m_ReadyQueue.ClearQueue();
m_Queue.ClearQueue();
m_ResultQueue.ClearQueue();
}
/*
class CResourceLoader
{
public:
CResourceLoader();
virtual ~CResourceLoader();
void StartLoader();
int AddObj(CResourceLoaderObj *);
protected:
void LoaderFunc();
void ProcessFunc();
DWORD m_dwWait;
CThreadQueue<CResourceLoaderObj *>m_lstObj;
CThreadQueue<CResourceLoaderObj *>m_Queue;
CCriticalSectionQueue<CLoadedObj *>m_ResultQueue;
unsigned long m_LoaderThreadID;
unsigned long m_ProcessThreadID;
HANDLE m_LoaderHandle;
HANDLE m_ProcessHandle;
};
CResourceLoader::CResourceLoader() : m_Queue(g_iMaxLoaderQueue)
{
m_bLoading = false;
m_dwWait = 0;
m_lstObj.clear();
m_lstReady.clear();
InitializeCriticalSection(&m_ObjCriticalSection);
m_LoaderThreadID = m_ProcessThreadID = 0;
m_EndEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
m_LoaderHandle = 0;
m_ProcessHandle = 0;
}
CResourceLoader::~CResourceLoader()
{
DeleteCriticalSection(&m_ObjCriticalSection);
CloseHandle(m_EndEvent);
CloseHandle(m_LoaderHandle);
CloseHandle(m_ProcessHandle);
}
void CResourceLoader::Loading()
{
m_bLoading = true;
// Event <20>ʱ<EFBFBD>ȭ
ResetEvent(m_EndEvent);
if((m_LoaderHandle = CreateThread(NULL,0,LoaderThreadProc,(LPVOID)this,0,&m_LoaderThreadID)) == NULL) {
CLogMgr::_LogError("CResourceLoader::Loading() : Create Loader Thread Failed");
}
if((m_ProcessHandle = CreateThread(NULL,0,ProcessThreadProc,(LPVOID)this,0,&m_ProcessThreadID)) == NULL) {
CLogMgr::_LogError("CResourceLoader::Loading() : Create Process Thread Failed");
}
}
DWORD CResourceLoader::WaitFinished()
{
return WaitForMultipleObjects(1, &m_EndEvent, FALSE, m_dwWait);
}
int CResourceLoader::FinishPercent() {
return 0;
}
void CResourceLoader::LoaderFunc()
{
for(int iIndex = 0; iIndex < GetObjNum(); iIndex++)
{
CResourceLoaderObj *pObj = &m_lstObj[iIndex];
if(!(pObj->m_ByteData.LoadByte(pObj->m_strFileName)))
{
pObj->m_State = RLOBJSTATE_FAILED;
if(pObj->m_pObj)
pObj->m_pObj->m_bLoaded = false;
}
else
{
pObj->m_State = RLOBJSTATE_LOADING;
m_Queue.PushBack(pObj);
}
}
m_Queue.Terminate();
}
void CResourceLoader::ProcessFunc()
{
CResourceLoaderObj *pObj = NULL;
while( m_Queue.RemoveFront(pObj))
{
if((pObj) && (pObj->m_pObj))
{
if(!pObj->m_pObj->Load(&(pObj->m_ByteData)))
{ // <20>ε<EFBFBD> <20><><EFBFBD>нÿ<D0BD> <20>ٽ<EFBFBD> queue<75><65> <20>־ ReLoading <20>õ<EFBFBD> <20>Ѵ<EFBFBD>.
if(pObj->m_pObj->m_iReloadingCount < Caldron::MAX_RELOADING) {
pObj->m_State = RLOBJSTATE_LOADING;
pObj->m_pObj->m_bLoaded = false;
m_Queue.PushBack(pObj);
CLogMgr::_LogError("CResourceLoader::ProcessFunc: Load fail, Reloading.");
pObj->m_pObj->m_iReloadingCount++;
}
else
{
pObj->m_State = RLOBJSTATE_FAILED;
pObj->m_pObj->m_bLoaded = true;
}
}
else
{
pObj->m_State = RLOBJSTATE_LOADED;
pObj->m_pObj->m_bLoaded = true;
}
}
else
{
CLogMgr::_LogError("CResourceLoader::ProcessFunc: Obj Ptr is NULL");
}
}
SetEvent(m_EndEvent);
}
int CResourceLoader::AddObj(CResourceLoaderObj &Obj)
{
if(!m_bLoading) {
EnterCriticalSection(&m_ObjCriticalSection);
m_lstObj.push_back(Obj);
LeaveCriticalSection(&m_ObjCriticalSection);
return (int)(m_lstObj.size());
}
else {
m_lstReady.push_back(Obj);
return -2;
}
}
CResourceLoaderObj CResourceLoader::GetObj(int iIndex)
{
EnterCriticalSection(&m_ObjCriticalSection);
CResourceLoaderObj Obj = m_lstObj[iIndex];
LeaveCriticalSection(&m_ObjCriticalSection);
return Obj;
}
void CResourceLoader::SetObj(int iIndex,CResourceLoaderObj &Obj)
{
EnterCriticalSection(&m_ObjCriticalSection);
m_lstObj[iIndex] = Obj;
LeaveCriticalSection(&m_ObjCriticalSection);
}
int CResourceLoader::GetObjNum()
{
EnterCriticalSection(&m_ObjCriticalSection);
int iNum = (int)m_lstObj.size();
LeaveCriticalSection(&m_ObjCriticalSection);
return iNum;
}
void CResourceLoader::ClearAllObj()
{
EnterCriticalSection(&m_ObjCriticalSection);
m_lstObj.clear();
LeaveCriticalSection(&m_ObjCriticalSection);
}
CResourceLoaderObjState CResourceLoader::GetObjState(int iIndex)
{
return m_lstObj[iIndex].m_State;
}
bool CResourceLoader::Finished()
{
if(WaitFinished() != (WAIT_OBJECT_0))
return false;
CloseHandle(m_LoaderHandle);
CloseHandle(m_ProcessHandle);
m_LoaderHandle = m_ProcessHandle = 0;
return true;
}
void CResourceLoader::Process() {
if((m_bLoading == true) && WaitFinished() == (WAIT_OBJECT_0))
{
m_bLoading = false;
ClearAllObj();
CloseHandle(m_LoaderHandle);
CloseHandle(m_ProcessHandle);
m_LoaderHandle = m_ProcessHandle = 0;
}
else
{
if((m_lstObj.size() > 0 )&& (m_bLoading == false))
Loading();
return;
}
if(m_lstReady.size() > 0 && !m_bLoading)
{
// Ready ť<><C5A5> <20><><EFBFBD><EFBFBD> <20>ִ<EFBFBD> <20>͵<EFBFBD><CDB5><EFBFBD> <20>ε<EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20>ѱ<EFBFBD><D1B1><EFBFBD>
m_lstObj.reserve(m_lstReady.size());
std::copy(m_lstReady.begin(),m_lstReady.end(),std::back_inserter(m_lstObj));
m_lstReady.clear();
Loading();
}
}*/
}}

View File

@@ -0,0 +1,163 @@
// ResourceLoader.h: interface for the CResourceLoader class.
//
//////////////////////////////////////////////////////////////////////
#if !defined(AFX_RESOURCELOADER_H__16578E31_424F_4D74_9304_44BEC2BE6F95__INCLUDED_)
#define AFX_RESOURCELOADER_H__16578E31_424F_4D74_9304_44BEC2BE6F95__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#include "./LoadedObj.h"
#include "./CaldronByteDataObj.h"
#include "./ThreadQueue.h"
namespace Caldron {
namespace Base {
/* *********************************************************************
* CResourceLoaderObj
* <20><><EFBFBD><EFBFBD> : ResourceLoader.h
* <20><><EFBFBD><EFBFBD> : Caldron Engine<6E><65> CResourceLoader <20><><EFBFBD><EFBFBD> Load Queue<75><65> <20><><EFBFBD> resource <20><><EFBFBD><EFBFBD>
* <20>ۼ<EFBFBD><DBBC><EFBFBD> : 2004.01.06
* history :
wizardbug ( 2004.01.06)
********************************************************************** */
enum CResourceLoaderObjState {
RLOBJSTATE_READY = 0,
RLOBJSTATE_LOADING,
RLOBJSTATE_LOADED,
RLOBJSTATE_FAILED,
};
const int g_iMaxLoaderQueue = 100000;
const int g_iMaxResultQueue = 200000;
const int g_iMaxProcessNums = 10;
/*
class CResourceLoaderObj {
public:
CResourceLoaderObj();
CResourceLoaderObj(const char *strFileName,CLoadedObj *pObj);
virtual ~CResourceLoaderObj();
CResourceLoaderObjState m_State;
// CByteDataObj m_ByteData;
char m_strFileName[40];
CLoadedObj *m_pObj;
};
*/
/* *********************************************************************
* CResourceLoader
* <20><><EFBFBD><EFBFBD> : ResourceLoader.h
* <20><><EFBFBD><EFBFBD> : Caldron Engine<6E><65> ResourceLoader
* <20>ۼ<EFBFBD><DBBC><EFBFBD> : 2004.01.06
* history :
wizardbug ( 2004.01.06)
********************************************************************** */
class CResourceLoader
{
protected:
static CThreadQueue<CLoadedObj *>m_ReadyQueue;
CThreadQueue<CLoadedObj *>m_Queue;
CCriticalSectionQueue<CLoadedObj *>m_ResultQueue;
unsigned long m_LoaderThreadID;
unsigned long m_ProcessThreadID;
HANDLE m_LoaderHandle;
HANDLE m_ProcessHandle;
public:
CResourceLoader() :/*m_ReadyQueue(g_iMaxLoaderQueue),*/m_Queue(g_iMaxLoaderQueue),m_ResultQueue(g_iMaxResultQueue),
m_LoaderThreadID(0),m_ProcessThreadID(0),
m_LoaderHandle(0),m_ProcessHandle(0)
{}
virtual ~CResourceLoader()
{
Clear();
CloseHandle(m_LoaderHandle);
CloseHandle(m_ProcessHandle);
}
void StartLoader();
static void AddObj(CLoadedObj *pAddObj)
{
m_ReadyQueue.PushBack(pAddObj);
}
void LoaderFunc();
void ProcessFunc();
void Process();
void ProcessAllData();
void Clear();
};
/*
class CResourceLoader
{
public:
CResourceLoader();
virtual ~CResourceLoader();
int FinishPercent();
// <20><><EFBFBD><EFBFBD> queue<75>ȿ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD> obj <20><><EFBFBD><EFBFBD> <20>ε<EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ƾ
void Loading();
void ClearAllObj();
int AddObj(CResourceLoaderObj &);
void SetObj(int iIndex,CResourceLoaderObj &);
int GetObjNum();
CResourceLoaderObj GetObj(int iIndex);
// <20><><EFBFBD><EFBFBD> <20>ε<EFBFBD><CEB5><EFBFBD><EFBFBD><EFBFBD>
CResourceLoaderObjState GetObjState(int iIndex);
DWORD WaitFinished();
// <20><><EFBFBD>μ<EFBFBD><CEBC><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E5BFA1> ȣ<><C8A3>
void ProcessFunc();
// <20>δ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E5BFA1> ȣ<><C8A3>
void LoaderFunc();
bool Finished();
void Process();
protected:
// Loading Thread ȣ<><C8A3><EFBFBD><EFBFBD> <20><><EFBFBD>ٸ<EFBFBD><D9B8><EFBFBD> <20>ð<EFBFBD>
// 0 : <20><><EFBFBD>ٷ<EFBFBD> return, INFINIT : Loading <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>ٸ<EFBFBD>. (default : 0)
DWORD m_dwWait;
std::vector<CResourceLoaderObj> m_lstObj;
std::vector<CResourceLoaderObj> m_lstReady;
CThreadQueue<CResourceLoaderObj *>m_Queue;
CRITICAL_SECTION m_ObjCriticalSection;
unsigned long m_LoaderThreadID;
unsigned long m_ProcessThreadID;
HANDLE m_EndEvent;
HANDLE m_LoaderHandle;
HANDLE m_ProcessHandle;
bool m_bLoading;
};
*/
}}
#endif // !defined(AFX_RESOURCELOADER_H__16578E31_424F_4D74_9304_44BEC2BE6F95__INCLUDED_)

View File

@@ -0,0 +1,181 @@
// ThreadQueue.h: interface for the CThreadQueue class.
//
//////////////////////////////////////////////////////////////////////
#if !defined(AFX_THREADQUEUE_H__D6165646_A901_43B4_BABC_5237337D0BFD__INCLUDED_)
#define AFX_THREADQUEUE_H__D6165646_A901_43B4_BABC_5237337D0BFD__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#include "../../include/Caldron.h"
//#include "./LogMgr.h"
/* *********************************************************************
* CThreadQueue
* <20><><EFBFBD><EFBFBD> : ThreadQueue.cpp
* <20><><EFBFBD><EFBFBD> :
* <20>ۼ<EFBFBD><DBBC><EFBFBD> : 2004.01.09
* history :
wizardbug ( 2004.01.09)
********************************************************************** */
namespace Caldron {
namespace Base {
enum CALDRONTHREADEVENT_ID {
CALDRONTHREAD_SEMAPHORE = 0,
CALDRONTHREAD_TERMINATE,
};
template<class T>
class CThreadQueue
{
public:
CThreadQueue(int iMaxQueueSize)
{
InitializeCriticalSection(&m_CriticalSection);
m_Handle[CALDRONTHREAD_SEMAPHORE] = CreateSemaphore(NULL,0,iMaxQueueSize,NULL);
m_Handle[CALDRONTHREAD_TERMINATE] = CreateEvent(NULL,TRUE,FALSE,NULL);
}
virtual ~CThreadQueue()
{
ClearQueue();
DeleteCriticalSection(&m_CriticalSection);
CloseHandle(m_Handle[CALDRONTHREAD_SEMAPHORE]);
CloseHandle(m_Handle[CALDRONTHREAD_TERMINATE]);
}
bool PushBack(T Obj)
{
EnterCriticalSection(&m_CriticalSection);
m_Queue.push(Obj);
// semaphore count <20><><EFBFBD><EFBFBD>
bool bResult = (ReleaseSemaphore(m_Handle[CALDRONTHREAD_SEMAPHORE],1,NULL) != 0);
if(!bResult)
{
m_Queue.pop(); // pop()<29><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ٷ<EFBFBD><D9B7><EFBFBD><EFBFBD><EFBFBD> remove <20><>Ų<EFBFBD><C5B2>.
//CLogMgr::_LogError("CThreadQueue::PushBack() : Queue is Full~!");
MessageBox(NULL,"Queue Full","ThreadQueue",MB_OK);
}
LeaveCriticalSection(&m_CriticalSection);
return bResult;
}
void ClearQueue()
{
EnterCriticalSection(&m_CriticalSection);
while(m_Queue.size())
{
m_Queue.pop();
}
LeaveCriticalSection(&m_CriticalSection);
}
bool RemoveFront(T &Obj)
{
bool bResult = false;
// Semarphore <20><> <20><><EFBFBD><EFBFBD> <20><>ŭ Return <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EEB0A3>
CALDRONTHREADEVENT_ID ReturnID = (CALDRONTHREADEVENT_ID)WaitForMultipleObjects(2,m_Handle,FALSE,INFINITE);
if(ReturnID == CALDRONTHREAD_SEMAPHORE)
{
bResult = true;
EnterCriticalSection(&m_CriticalSection);
if(m_Queue.size())
{
Obj = m_Queue.front();
m_Queue.pop(); // pop()<29><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ٷ<EFBFBD><D9B7><EFBFBD><EFBFBD><EFBFBD> remove <20><>Ų<EFBFBD><C5B2>.
}
else
{
//CLogMgr::_LogError("CThreadQueue::RemoveFront() : Queue is Empty~!");
bResult = false;
}
LeaveCriticalSection(&m_CriticalSection);
return bResult;
}
return bResult;
}
void Terminate()
{
SetEvent(m_Handle[CALDRONTHREAD_TERMINATE]);
}
void UnTerminate()
{
ResetEvent(m_Handle[CALDRONTHREAD_TERMINATE]);
}
int GetQueueSize()
{
return (int)m_Queue.size();
}
protected:
HANDLE m_Handle[2];
CRITICAL_SECTION m_CriticalSection;
std::queue<T> m_Queue;
};
template<class T>
class CCriticalSectionQueue
{
public:
CCriticalSectionQueue(int iMaxQueueSize)
{
InitializeCriticalSection(&m_CriticalSection);
}
virtual ~CCriticalSectionQueue()
{
ClearQueue();
DeleteCriticalSection(&m_CriticalSection);
}
void ClearQueue()
{
EnterCriticalSection(&m_CriticalSection);
while(m_Queue.size())
{
m_Queue.pop();
}
LeaveCriticalSection(&m_CriticalSection);
}
void PushBack(T Obj)
{
EnterCriticalSection(&m_CriticalSection);
m_Queue.push(Obj);
LeaveCriticalSection(&m_CriticalSection);
}
bool RemoveFront(T &Obj)
{
bool bReturn = false;
EnterCriticalSection(&m_CriticalSection);
if(m_Queue.size())
{
Obj = m_Queue.front();
m_Queue.pop(); // pop()<29><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ٷ<EFBFBD><D9B7><EFBFBD><EFBFBD><EFBFBD> remove <20><>Ų<EFBFBD><C5B2>.
bReturn = true;
}
LeaveCriticalSection(&m_CriticalSection);
return bReturn;
}
int GetQueueSize()
{
return (int)m_Queue.size();
}
protected:
CRITICAL_SECTION m_CriticalSection;
std::queue<T> m_Queue;
};
}
}
#endif // !defined(AFX_THREADQUEUE_H__D6165646_A901_43B4_BABC_5237337D0BFD__INCLUDED_)