#include "StdAfx.h" #include "EtWorldEventArea.h" #include "EtWorldEventControl.h" #include "EtWorldSector.h" #include "../GameCommon/EventControlHeader.h" #ifdef _DEBUG #define new new(_NORMAL_BLOCK,__FILE__,__LINE__) #endif int CEtWorldEventArea::s_nDummySize = 508; CEtWorldEventArea::CEtWorldEventArea( CEtWorldEventControl *pControl ) : m_vMin( 0.f, 0.f, 0.f ) , m_vMax( 0.f, 0.f, 0.f ) { m_pControl = pControl; m_bActive = true; m_pData = NULL; m_fRotate = 0.f; m_nCreateUniqueID = 0; memset(&m_ObbBox,0,sizeof(m_ObbBox)); m_pCurrentNode = NULL; m_Circle.fRadius = 0.f; m_Circle.Center = EtVector2( 0.f, 0.f ); } CEtWorldEventArea::~CEtWorldEventArea() { if( m_pData ) { for( DWORD i=0; i m_ObbBox.Extent[0] ) return false; fDot = fabs( EtVec3Dot( &m_ObbBox.Axis[2], &vVertex ) ); if( fDot > m_ObbBox.Extent[2] ) return false; return true; } return m_ObbBox.IsInside( vPosition ); } // note by kalliste : ½Ã±×³Î ½ºÆ®·°Ãĸ¦ ³»¿ë º¹»çÇØ¼­ °ÔÀÓ³»¿¡ »ç¿ëÇÏ´Â °æ¿ì°¡ ÀÖ¾î ÀÏ´Ü ¸·½À´Ï´Ù.(#40311) //#define _TEST_DEFAULT_EVENT_ALLOC bool CEtWorldEventArea::Load( CStream *pStream ) { ReadStdString( m_szName, pStream ); pStream->Read( &m_vMin, sizeof(EtVector3) ); pStream->Read( &m_vMax, sizeof(EtVector3) ); pStream->Read( &m_fRotate, sizeof(float) ); pStream->Read( &m_nCreateUniqueID, sizeof(int) ); pStream->Seek( s_nDummySize, SEEK_CUR ); #ifdef _TEST_DEFAULT_EVENT_ALLOC m_pData = new int[256]; memset( m_pData, 0, 1024 ); pStream->Read( m_pData, 1024 ); #else int usingCount = 256; if( GetControl() != NULL ) { #ifdef WIN64 usingCount = GetEventSignalDataUsingCount64(GetControl()->GetUniqueID()); #else usingCount = GetEventSignalDataUsingCount(GetControl()->GetUniqueID()); #endif } int datasize = usingCount * sizeof(int); if (usingCount > 0) { m_pData = new int[usingCount]; memset( m_pData, 0, datasize ); pStream->Read( m_pData, datasize ); pStream->Seek((1024 - datasize), SEEK_CUR); } else { pStream->Seek(1024, SEEK_CUR); } #endif std::vector vVec2List; std::vector vVec3List; std::vector vVec4List; std::vector szVecList; // Table Load int nTableCount; pStream->Read( &nTableCount, sizeof(int) ); if( nTableCount > 0 ) { vVec2List.resize( nTableCount ); m_nVec2Index.resize( nTableCount ); pStream->Read( &m_nVec2Index[0], sizeof(int) * nTableCount ); pStream->Read( &vVec2List[0], sizeof(EtVector2) * nTableCount ); } pStream->Read( &nTableCount, sizeof(int) ); if( nTableCount > 0 ) { vVec3List.resize( nTableCount ); m_nVec3Index.resize( nTableCount ); pStream->Read( &m_nVec3Index[0], sizeof(int) * nTableCount ); pStream->Read( &vVec3List[0], sizeof(EtVector3) * nTableCount ); } pStream->Read( &nTableCount, sizeof(int) ); if( nTableCount > 0 ) { vVec4List.resize( nTableCount ); m_nVec4Index.resize( nTableCount ); pStream->Read( &m_nVec4Index[0], sizeof(int) * nTableCount ); pStream->Read( &vVec4List[0], sizeof(EtVector4) * nTableCount ); } pStream->Read( &nTableCount, sizeof(int) ); if( nTableCount > 0 ) { m_nVecStrIndex.resize( nTableCount ); pStream->Read( &m_nVecStrIndex[0], sizeof(int) * nTableCount ); } for( int i=0; iGetSector(); if( pSector ) { float fHeight = pSector->GetHeightToWorld( m_ObbBox.Center.x, m_ObbBox.Center.z ); m_ObbBox.Center.y += fHeight; } } EtMatrix matRotate; EtMatrixRotationY( &matRotate, EtToRadian( m_fRotate ) ); EtVec3TransformNormal( &m_ObbBox.Axis[0], &EtVector3( 1.f, 0.f, 0.f ), &matRotate ); EtVec3TransformNormal( &m_ObbBox.Axis[1], &EtVector3( 0.f, 1.f, 0.f ), &matRotate ); EtVec3TransformNormal( &m_ObbBox.Axis[2], &EtVector3( 0.f, 0.f, 1.f ), &matRotate ); m_ObbBox.CalcVertices(); m_Circle.Center = EtVector2( m_ObbBox.Center.x, m_ObbBox.Center.z ); m_Circle.fRadius = max( m_ObbBox.Extent[0], m_ObbBox.Extent[2] ); } void CEtWorldEventArea::GetBoundingCircle( SCircle &Circle ) { Circle = m_Circle; } #ifdef WIN64 char CEtWorldEventArea::IsPointerTable( int nIndex ) { if( std::find( m_nVec2Index.begin(), m_nVec2Index.end(), nIndex ) != m_nVec2Index.end() ) return 0; if( std::find( m_nVec3Index.begin(), m_nVec3Index.end(), nIndex ) != m_nVec3Index.end() ) return 1; if( std::find( m_nVec4Index.begin(), m_nVec4Index.end(), nIndex ) != m_nVec4Index.end() ) return 2; if( std::find( m_nVecStrIndex.begin(), m_nVecStrIndex.end(), nIndex ) != m_nVecStrIndex.end() ) return 3; return -1; } void CEtWorldEventArea::IncreasePointerTableIndex( int nValue ) { for( DWORD i=0; i nValue ) m_nVec2Index64[i]++; } for( DWORD i=0; i nValue ) m_nVec3Index64[i]++; } for( DWORD i=0; i nValue ) m_nVec4Index64[i]++; } for( DWORD i=0; i nValue ) m_nVecStrIndex64[i]++; } } #endif