DragonNest/Common/EternityEngine/D3DDevice9/EtOcclusionQuery.cpp

95 lines
1.5 KiB
C++
Raw Permalink Normal View History

#include "StdAfx.h"
#include "EtDevice.h"
#include "EtOcclusionQuery.h"
#ifdef _DEBUG
#define new new(_NORMAL_BLOCK,__FILE__,__LINE__)
#endif
CEtOcclusionQuery::CEtOcclusionQuery(void)
{
m_pQuery = NULL;
m_bHasPrev = false;
m_bCreateFail = false;
m_bAsyncType = false;
}
CEtOcclusionQuery::~CEtOcclusionQuery(void)
{
SAFE_RELEASE( m_pQuery );
}
void CEtOcclusionQuery::Begin()
{
if( !m_bCreateFail && m_pQuery == NULL )
{
( ( LPDIRECT3DDEVICE9 )GetEtDevice()->GetDevicePtr() )->CreateQuery ( D3DQUERYTYPE_OCCLUSION, &m_pQuery );
ADD_D3D_RES( m_pQuery );
if( m_pQuery == NULL ) {
m_bCreateFail = true;
}
}
if( !m_bCreateFail )
{
m_pQuery->Issue (D3DISSUE_BEGIN);
}
m_bHasPrev = true;
}
void CEtOcclusionQuery::End()
{
if( !m_bCreateFail )
{
m_pQuery->Issue( D3DISSUE_END );
}
}
bool CEtOcclusionQuery::GetResult( DWORD &dwResult )
{
dwResult = 0;
if( m_bHasPrev == false )
{
return false;
}
if( m_bCreateFail )
{
return false;
}
bool bRet = true;
if( m_bAsyncType )
{
if( m_pQuery->GetData( (void * )&dwResult, sizeof( DWORD ), 0 ) == S_FALSE )
{
bRet = false;
}
}
else
{
int nCount = 0;
while( m_pQuery->GetData( (void * )&dwResult, sizeof( DWORD ), D3DGETDATA_FLUSH ) == S_FALSE )
{
nCount++;
if( nCount > 30 )
{
bRet = false;
break;
}
}
}
m_bHasPrev = false;
return bRet;
}
void CEtOcclusionQuery::OnLostDevice()
{
SAFE_RELEASE( m_pQuery );
m_bHasPrev = false;
}
void CEtOcclusionQuery::OnResetDevice()
{
}