Files
Leviathan/Client/Game/engine/Renderer/SSpeedTreeManager.cpp
T
2026-06-01 12:46:52 +02:00

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