#include "GameCore.h"
#include "timing.h"

Timing::Timing()
{
	time_Frequency = 0;
	time_StartTime = 0;
	time_FrameCount = 0;
	time_Deviance = 0;
	time_PauseTime = 0;
	time_MaxFrameRate = MAX_FRAME_RATE;
	time_FrameRate = 0;
}

Timing::~Timing()
{
	time_Frequency = 0;
	time_StartTime = 0;
	time_FrameCount = 0;
	time_Deviance = 0;
	time_PauseTime = 0;
	time_MaxFrameRate = MAX_FRAME_RATE;
	time_FrameRate = 0;
}

HRESULT Timing::SetupTiming()
{
	QueryPerformanceFrequency( (LARGE_INTEGER*)&time_Frequency );
	if (time_Frequency == 0) 
	{
		return E_FAIL;
	}

	//float mod = GetNumTicksPerMs();
	//time_PauseTime = (int)(mod / time_MaxFrameRate );


	float frameRateInMs =  (float)time_MaxFrameRate;
	float mod = GetNumTicksPerMs() ;
	float finalVal = (mod / frameRateInMs);
	time_PauseTime = int(finalVal);

	return S_OK;

}

void Timing::SetStartTime()
{
	QueryPerformanceCounter( (LARGE_INTEGER*)&time_StartTime );
}

float Timing::GetNumTicksPerMs()
{
	return((float)time_Frequency / 1000.0f );
}

void Timing::Pause(int Milliseconds)
{
	INT64 SecondsDelay = (INT64)Milliseconds * 1000;
	INT64 CurrentTime = 0;

	while(TRUE)
	{
		QueryPerformanceCounter( (LARGE_INTEGER*) &CurrentTime );
		if ( (CurrentTime - time_StartTime) > SecondsDelay)
			break;
	}

}

void Timing::CalcFrameCount()
{
	INT64 NewCount = 0;
	static INT64 LastCount = 0;
	INT64 Difference = 0;

	QueryPerformanceCounter( (LARGE_INTEGER*) &NewCount );

	if (NewCount == 0)
	{
		//game error no HPC
	}

	time_FrameCount++;

	Difference = NewCount - LastCount;

	if (Difference >= time_Frequency)
	{
		time_FrameRate = time_FrameCount;
		time_FrameCount = 0;
		LastCount = NewCount;

	}

	time_Deviance = (float)time_FrameRate / time_MaxFrameRate;
	//SetDeviance(time_Deviance);

}

HRESULT Timing::DisplayFrameRate(LPD3DXFONT &m_pd3dFont, int x, int y)
{
	RECT rect =  {x, y, 200, 200};
	RECT rect2 = {x, y+20, 0, 0};

	char frateint[4];
	char devvalft[128];
	char framerate[128];
	char deviance[128];

	ZeroMemory( &frateint, sizeof( frateint ));
	ZeroMemory( &devvalft, sizeof( devvalft ));

	strcpy(framerate, "Frame Rate: ");
	strcpy(deviance, "Deviance: ");

	itoa(time_FrameRate, frateint, 10);
	strcat(framerate, frateint);
    
	float a = (float)3.1416;
	gcvt(time_Deviance,  6, devvalft);

	strcat(deviance,  devvalft);

	m_pd3dFont->DrawText(NULL, framerate, -1, &rect, DT_NOCLIP, D3DCOLOR_XRGB(255,255,255));
	m_pd3dFont->DrawText(NULL, deviance, -1, &rect2, DT_NOCLIP, D3DCOLOR_XRGB(255,255,255));

	return S_OK;
}

int Timing::GetFrameRate()
{
	return time_FrameRate;
}

int Timing::GetPauseTime()
{
	return time_PauseTime;
}

int Timing::GetTimeDeviance()
{
	return (int)time_Deviance;
}
