2024-05-12 20:35:20 +08:00
|
|
|
//--------------------------------------------------------------------------------------
|
|
|
|
// File: DXUTMisc.cpp
|
|
|
|
//
|
|
|
|
// Shortcut macros and functions for using DX objects
|
|
|
|
//
|
|
|
|
// Copyright (c) Microsoft Corporation. All rights reserved
|
|
|
|
//--------------------------------------------------------------------------------------
|
|
|
|
#include "dxstdafx.h"
|
|
|
|
#undef min // use __min instead
|
|
|
|
#undef max // use __max instead
|
|
|
|
|
2024-05-12 22:41:26 +08:00
|
|
|
//--------------------------------------------------------------------------------------
|
|
|
|
// Global/Static Members
|
|
|
|
//--------------------------------------------------------------------------------------
|
|
|
|
CDXUTTimer* DXUTGetGlobalTimer()
|
|
|
|
{
|
|
|
|
// Using an accessor function gives control of the construction order
|
|
|
|
static CDXUTTimer timer;
|
|
|
|
return &timer;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2024-05-12 20:35:20 +08:00
|
|
|
//--------------------------------------------------------------------------------------
|
|
|
|
CDXUTTimer::CDXUTTimer()
|
|
|
|
{
|
|
|
|
m_bUsingQPF = false;
|
|
|
|
m_bTimerStopped = true;
|
|
|
|
m_llQPFTicksPerSec = 0;
|
|
|
|
|
|
|
|
m_llStopTime = 0;
|
|
|
|
m_llLastElapsedTime = 0;
|
|
|
|
m_llBaseTime = 0;
|
|
|
|
|
|
|
|
// Use QueryPerformanceFrequency() to get frequency of timer.
|
|
|
|
LARGE_INTEGER qwTicksPerSec;
|
|
|
|
m_bUsingQPF = (bool) (QueryPerformanceFrequency( &qwTicksPerSec ) != 0);
|
|
|
|
m_llQPFTicksPerSec = qwTicksPerSec.QuadPart;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//--------------------------------------------------------------------------------------
|
|
|
|
void CDXUTTimer::Reset()
|
|
|
|
{
|
|
|
|
if( !m_bUsingQPF )
|
|
|
|
return;
|
|
|
|
|
|
|
|
// Get either the current time or the stop time
|
|
|
|
LARGE_INTEGER qwTime;
|
|
|
|
if( m_llStopTime != 0 )
|
|
|
|
qwTime.QuadPart = m_llStopTime;
|
|
|
|
else
|
|
|
|
QueryPerformanceCounter( &qwTime );
|
|
|
|
|
|
|
|
m_llBaseTime = qwTime.QuadPart;
|
|
|
|
m_llLastElapsedTime = qwTime.QuadPart;
|
|
|
|
m_llStopTime = 0;
|
|
|
|
m_bTimerStopped = FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//--------------------------------------------------------------------------------------
|
|
|
|
void CDXUTTimer::Start()
|
|
|
|
{
|
|
|
|
if( !m_bUsingQPF )
|
|
|
|
return;
|
|
|
|
|
|
|
|
// Get the current time
|
|
|
|
LARGE_INTEGER qwTime;
|
|
|
|
QueryPerformanceCounter( &qwTime );
|
|
|
|
|
|
|
|
if( m_bTimerStopped )
|
|
|
|
m_llBaseTime += qwTime.QuadPart - m_llStopTime;
|
|
|
|
m_llStopTime = 0;
|
|
|
|
m_llLastElapsedTime = qwTime.QuadPart;
|
|
|
|
m_bTimerStopped = FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//--------------------------------------------------------------------------------------
|
|
|
|
void CDXUTTimer::Stop()
|
|
|
|
{
|
|
|
|
if( !m_bUsingQPF )
|
|
|
|
return;
|
|
|
|
|
|
|
|
if( !m_bTimerStopped )
|
|
|
|
{
|
|
|
|
// Get either the current time or the stop time
|
|
|
|
LARGE_INTEGER qwTime;
|
|
|
|
if( m_llStopTime != 0 )
|
|
|
|
qwTime.QuadPart = m_llStopTime;
|
|
|
|
else
|
|
|
|
QueryPerformanceCounter( &qwTime );
|
|
|
|
|
|
|
|
m_llStopTime = qwTime.QuadPart;
|
|
|
|
m_llLastElapsedTime = qwTime.QuadPart;
|
|
|
|
m_bTimerStopped = TRUE;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//--------------------------------------------------------------------------------------
|
|
|
|
void CDXUTTimer::Advance()
|
|
|
|
{
|
|
|
|
if( !m_bUsingQPF )
|
|
|
|
return;
|
|
|
|
|
|
|
|
m_llStopTime += m_llQPFTicksPerSec/10;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//--------------------------------------------------------------------------------------
|
|
|
|
double CDXUTTimer::GetAbsoluteTime()
|
|
|
|
{
|
|
|
|
if( !m_bUsingQPF )
|
|
|
|
return -1.0;
|
|
|
|
|
|
|
|
// Get either the current time or the stop time
|
|
|
|
LARGE_INTEGER qwTime;
|
|
|
|
if( m_llStopTime != 0 )
|
|
|
|
qwTime.QuadPart = m_llStopTime;
|
|
|
|
else
|
|
|
|
QueryPerformanceCounter( &qwTime );
|
|
|
|
|
|
|
|
double fTime = qwTime.QuadPart / (double) m_llQPFTicksPerSec;
|
|
|
|
|
|
|
|
return fTime;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//--------------------------------------------------------------------------------------
|
|
|
|
double CDXUTTimer::GetTime()
|
|
|
|
{
|
|
|
|
if( !m_bUsingQPF )
|
|
|
|
return -1.0;
|
|
|
|
|
|
|
|
// Get either the current time or the stop time
|
|
|
|
LARGE_INTEGER qwTime;
|
|
|
|
if( m_llStopTime != 0 )
|
|
|
|
qwTime.QuadPart = m_llStopTime;
|
|
|
|
else
|
|
|
|
QueryPerformanceCounter( &qwTime );
|
|
|
|
|
|
|
|
double fAppTime = (double) ( qwTime.QuadPart - m_llBaseTime ) / (double) m_llQPFTicksPerSec;
|
|
|
|
|
|
|
|
return fAppTime;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//--------------------------------------------------------------------------------------
|
|
|
|
double CDXUTTimer::GetElapsedTime()
|
|
|
|
{
|
|
|
|
if( !m_bUsingQPF )
|
|
|
|
return -1.0;
|
|
|
|
|
|
|
|
// Get either the current time or the stop time
|
|
|
|
LARGE_INTEGER qwTime;
|
|
|
|
if( m_llStopTime != 0 )
|
|
|
|
qwTime.QuadPart = m_llStopTime;
|
|
|
|
else
|
|
|
|
QueryPerformanceCounter( &qwTime );
|
|
|
|
|
|
|
|
double fElapsedTime = (double) ( qwTime.QuadPart - m_llLastElapsedTime ) / (double) m_llQPFTicksPerSec;
|
|
|
|
m_llLastElapsedTime = qwTime.QuadPart;
|
|
|
|
|
|
|
|
return fElapsedTime;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//--------------------------------------------------------------------------------------
|
|
|
|
bool CDXUTTimer::IsStopped()
|
|
|
|
{
|
|
|
|
return m_bTimerStopped;
|
|
|
|
}
|
|
|
|
|
|
|
|
|