// Z3DChrEventGenerator.cpp: implementation of the CZ3DChrEventGenerator class. // ////////////////////////////////////////////////////////////////////// #include "Z3DChrEventGenerator.h" #include "SimpleParser.h" #include std::map< Z3DTOK, std::vector* > CZ3DChrEventGenerator::ms_mapTok2EventData; bool CZ3DChrEventGenerator::_Load( const char* szFileName ) { CSimpleParser parser; Z3DTOK tokFilename, tokEvent; if( false == parser.OpenFile(szFileName) ) { return false; } Z3D_EVENT_ELEMENT ee; //long lTokenIndex; char* szToken = parser.GetNextToken(); while( NULL != szToken ) { if( 0 == strcmp( ";", szToken ) ) { break; } tokFilename = g_TokFileName.Add( szToken ); if( ms_mapTok2EventData.end() != ms_mapTok2EventData.find(tokFilename) ) { return false; // file¸í Áߺ¹ } std::vector* p_vecEventElement = new std::vector; szToken = parser.GetNextToken(); while( NULL != szToken ) { if( 0 == strcmp( ";", szToken ) ) { break; } // optional field °ª ÃʱâÈ­ ee.tokSecondaryEvent = NULL_TOK; ee.lProb_Denominator = 0; // ºÐ¸ð°¡ 0À̸é È®·ü¾ø´Â À̺¥Æ®(Ç׽ù߻ý) ee.lProb_Numerator = 0; // ¹Ýµå½Ã 0À¸·Î ÃʱâÈ­ ÇÒ ÇÊ¿ä´Â ¾øÁö¸¸..°Á. ee.lFrame = aton( szToken ); if( NULL == (szToken = parser.GetNextToken()) ) { return false; } ee.tokEvent = g_TokEventName.Add( szToken ); if( NULL == (szToken = parser.GetNextToken()) ) { return false; } if( 0 == strcmp( ":", szToken ) ) // secondary event Á¸Àç { szToken = parser.GetNextToken(); ee.tokSecondaryEvent = g_TokEventName.Add( szToken ); szToken = parser.GetNextToken(); // ´ÙÀ½ Çʵ带 À§ÇØ } if( 0 == strcmp( "/", szToken ) ) // È®·üµ¥ÀÌÅÍ Á¸Àç { szToken = parser.GetNextToken(); ee.lProb_Numerator = aton( szToken ); parser.GetNextToken(); // skipping ":" szToken = parser.GetNextToken(); // ´ÙÀ½ ÅäÅ« ee.lProb_Denominator = aton( szToken ); szToken = parser.GetNextToken(); // ´ÙÀ½ Çʵ带 À§ÇØ } p_vecEventElement->push_back( ee ); } std::sort( p_vecEventElement->begin(), p_vecEventElement->end() ); ms_mapTok2EventData[tokFilename] = p_vecEventElement; szToken = parser.GetNextToken(); } return true; } void CZ3DChrEventGenerator::_Close() { std::map< Z3DTOK, std::vector* >::iterator it; for( it = ms_mapTok2EventData.begin(); it != ms_mapTok2EventData.end(); it++ ) { SAFE_DELETE( it->second ); } } void CZ3DChrEventGenerator::_RetrieveEventDataList( std::map< Z3DTOK, std::vector* >* &pMap ) { pMap = &ms_mapTok2EventData; } ////////////////////////////////////////////////////////////////////// // Construction/Destruction ////////////////////////////////////////////////////////////////////// CZ3DChrEventGenerator::CZ3DChrEventGenerator() { m_rp_vecEventData = NULL; m_tokCurrentAniPack = NULL_TOK; } CZ3DChrEventGenerator::~CZ3DChrEventGenerator() { } void CZ3DChrEventGenerator::CheckEvent( float fCurrentFrame, float fPrevFrame, std::vector &r_vecEvent, std::vector &r_vecSecondaryEvent ) { if( NULL == m_rp_vecEventData ) { return; } if( fPrevFrame >= fCurrentFrame ) { return; } if( 0 == m_rp_vecEventData->size() ) { return; } int lPrevIdx, lCurrentIdx; for( lPrevIdx = 0; lPrevIdx < m_rp_vecEventData->size(); ++lPrevIdx ) { if( float((*m_rp_vecEventData)[lPrevIdx].lFrame) > fPrevFrame ) { break; } } for( lCurrentIdx = m_rp_vecEventData->size() - 1; 0 <= lCurrentIdx; --lCurrentIdx ) { if( float((*m_rp_vecEventData)[lCurrentIdx].lFrame) <= fCurrentFrame ) { break; } } if( lPrevIdx > lCurrentIdx ) { return; } r_vecEvent.clear(); r_vecSecondaryEvent.clear(); for( int i = lPrevIdx; i <= lCurrentIdx; ++i ) { if( (*m_rp_vecEventData)[i].lProb_Denominator ) { // È®·ü ó¸® if( (rand() % (*m_rp_vecEventData)[i].lProb_Denominator) < (*m_rp_vecEventData)[i].lProb_Numerator ) { r_vecEvent.push_back( (*m_rp_vecEventData)[i].tokEvent ); r_vecSecondaryEvent.push_back( (*m_rp_vecEventData)[i].tokSecondaryEvent ); } } else { // È®·ü¾øÀ½( ¹«Á¶°Ç¹ß»ý ) r_vecEvent.push_back( (*m_rp_vecEventData)[i].tokEvent ); r_vecSecondaryEvent.push_back( (*m_rp_vecEventData)[i].tokSecondaryEvent ); } } } bool CZ3DChrEventGenerator::SetTokAniPack( Z3DTOK tokFileName ) { std::map< Z3DTOK, std::vector* >::iterator it; if( ms_mapTok2EventData.end() == (it = ms_mapTok2EventData.find(tokFileName)) ) { m_rp_vecEventData = NULL; return false; } m_rp_vecEventData = it->second; return true; } Z3DTOK CZ3DChrEventGenerator::GetTokAniPack() { return m_tokCurrentAniPack; }