126 lines
3.5 KiB
C++
126 lines
3.5 KiB
C++
#include "stdafx.h"
|
|
#include <kfile/KStream.h>
|
|
#include "KRenderObject.h"
|
|
#include <kfile/KFileManager.h>
|
|
#include <mmo/ArTime.h>
|
|
|
|
//#include <string>
|
|
|
|
#include "SSpeedTreeManager.h"
|
|
#include "KSeqSpeedTree.h"
|
|
|
|
XCriticalSection g_SpeedTree_CS;
|
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
SpeedTreeManager *KSingletoneResourceManager<SpeedTreeManager>::s_pStaticManager = new SpeedTreeManager;
|
|
SpeedTreeManager::SpeedTreeManager()
|
|
{
|
|
|
|
}
|
|
|
|
SpeedTreeManager::~SpeedTreeManager()
|
|
{
|
|
KSeqSpeedTree *pSpeedTree;
|
|
bool res;
|
|
res = m_resByName.get_first_value( pSpeedTree );
|
|
while ( res )
|
|
{
|
|
if ( pSpeedTree != NULL )
|
|
delete pSpeedTree;
|
|
res = m_resByName.get_next_value( pSpeedTree );
|
|
}
|
|
m_resByName.clear();
|
|
}
|
|
|
|
void SpeedTreeManager::DiscardAll()
|
|
{
|
|
KSeqSpeedTree *pSpeedTree;
|
|
bool res;
|
|
res = m_resByName.get_first_value( pSpeedTree );
|
|
while ( res )
|
|
{
|
|
if ( pSpeedTree != NULL )
|
|
delete pSpeedTree;
|
|
res = m_resByName.get_next_value( pSpeedTree );
|
|
}
|
|
m_resByName.clear();
|
|
}
|
|
|
|
bool KSeqSpeedTree::doLoading()
|
|
{
|
|
//KStream 을 사용 할 수 있도록 변경.
|
|
KStream * pStream = KFileManager::Instance().CreateStreamFromResource( GetResourceName() );
|
|
if( !pStream ) return NULL;
|
|
|
|
KSeqSpeedTree* pCacheResource = new KSeqSpeedTree;
|
|
pCacheResource->LoadTree( pStream ); //인스 턴스 아님
|
|
|
|
KFileManager::Instance().DeleteStream( pStream );
|
|
|
|
KSeqSpeedTree* pTree = static_cast< KSeqSpeedTree* >( this );
|
|
|
|
// add to hash
|
|
|
|
pTree->CopyFromTree( pCacheResource ); //인스턴스 임
|
|
SpeedTreeManager::GetManager()->AddToHash( GetResourceName(), pCacheResource );
|
|
|
|
return true;
|
|
}
|
|
|
|
void SpeedTreeManager::AddToHash( const char *szName, KSeqSpeedTree* ptr )
|
|
{
|
|
m_resByName.add( szName, ptr );
|
|
}
|
|
|
|
KSeqSpeedTree * SpeedTreeManager::Load( const char *resname, const K3DMatrix &mat, float fScaleSize, bool bIsThreadLoading )
|
|
{
|
|
THREAD_SYNCRONIZE( g_SpeedTree_CS );
|
|
|
|
DWORD dwTime = GetSafeTickCount();
|
|
|
|
KSeqSpeedTree * pSpeedTree = NULL;
|
|
|
|
//이미 있음.
|
|
if( m_resByName.lookup( resname, pSpeedTree ) == true )
|
|
{
|
|
KSeqSpeedTree *pTree = new KSeqSpeedTree( true );
|
|
pTree->CopyFromTree( pSpeedTree );
|
|
return pTree;
|
|
}
|
|
|
|
//static float m[16] = {0.0f};
|
|
//m[0] = mat._11; m[1] = mat._12; m[2] = mat._13; m[3] = mat._14;
|
|
//m[4] = mat._21; m[5] = mat._22; m[6] = mat._23; m[7] = mat._24;
|
|
//m[8] = mat._31; m[9] = mat._32; m[10] = mat._33; m[11] = mat._34;
|
|
//m[12] = mat._41; m[13] = mat._42; m[14] = mat._43; m[15] = mat._44;
|
|
|
|
// _oprint( "Reaource - SpeedTreeManager::Load [%s] \n", resname );
|
|
|
|
//쓰레드 로딩
|
|
//KThreadResource::StartThreadLoading( new KTreeLoader( pSpeedTree, resname ) );
|
|
//return pSpeedTree;
|
|
//////////////////////////////////////////////////////////////////////////
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
////그냥 로딩
|
|
KStream * pStream = KFileManager::Instance().CreateStreamFromResource( resname );
|
|
if( !pStream ) return NULL;
|
|
|
|
//Load
|
|
pSpeedTree = new KSeqSpeedTree;
|
|
|
|
////원본
|
|
pSpeedTree->LoadTree( pStream, 1 );//fScaleSize, 1.f );
|
|
m_resByName.add( resname, pSpeedTree );
|
|
// _oprint( "Load Time : SpeedTreeManager::Load - [%d]ms, %s\n", GetSafeTickCount()-dwTime, resname );
|
|
|
|
KSeqSpeedTree *pTree = new KSeqSpeedTree( true );
|
|
pTree->CopyFrom( pSpeedTree );
|
|
|
|
KFileManager::Instance().DeleteStream( pStream );
|
|
|
|
return pTree;
|
|
//////////////////////////////////////////////////////////////////////////
|
|
|
|
}
|