#include "stdafx.h" #include #include "KRenderObject.h" #include #include //#include #include "SSpeedTreeManager.h" #include "KSeqSpeedTree.h" XCriticalSection g_SpeedTree_CS; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// SpeedTreeManager *KSingletoneResourceManager::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; ////////////////////////////////////////////////////////////////////////// }