示例#1
0
//-----------------------------------------------------------------------------
// Name: Run()
// Desc: 
//-----------------------------------------------------------------------------
INT CXBApplication::Run()
{
//    OUTPUT_DEBUG_STRING( "XBApp: Running the application...\n" );

    // Get the frequency of the timer
    LARGE_INTEGER qwTicksPerSec;
    QueryPerformanceFrequency( &qwTicksPerSec );
    FLOAT fSecsPerTick = 1.0f / (FLOAT)qwTicksPerSec.QuadPart;

    // Save the start time
    LARGE_INTEGER qwTime, qwLastTime, qwElapsedTime;
    QueryPerformanceCounter( &qwTime );
    qwLastTime.QuadPart = qwTime.QuadPart;

    LARGE_INTEGER qwAppTime, qwElapsedAppTime;
    qwAppTime.QuadPart        = 0;
    qwElapsedTime.QuadPart    = 0;
    qwElapsedAppTime.QuadPart = 0;

    // Run the game loop, animating and rendering frames
    for( ;; )
    {
        //-----------------------------------------
        // Animate and render a frame
        //-----------------------------------------

        // Frame move the scene
        FrameMove();

        // Render the scene
        Render();
    }
}
示例#2
0
HRESULT CEngine::Render3D()
{
	if( NULL == m_pd3dDevice )
		return E_FAIL;

	//시간 업데이트
	GetTimer().Tick();
	Update(GetTimer().GetElapsedTime());
	FrameMove(GetTimer().GetElapsedTime());
	Render();

	return S_OK;
}
示例#3
0
INT	CAppGame::Proc(LC_HANDLE)
{
	if(LC_FAILED(FrameMove()))
		return LC_EFAIL;


	if(LC_FAILED(Render()))
		return LC_EFAIL;

	m_pDev->Present(0,0,0,0);

	UpdateStatus();


	return LC_OK;
}
示例#4
0
int Render3DEnvironment()
{
	int ret;
	ret = FrameMove();
	if( ret ){
		_ASSERT( 0 );
		return 1;
	}

	ret = Render();
	if( ret ){
		_ASSERT( 0 );
		return 1;
	}

	return 0;
}
示例#5
0
//-----------------------------------------------------------------------------
// Name: Run()
// Desc: Handles the message loop and calls FrameMove() and Render() when
//       idle.
//-----------------------------------------------------------------------------
INT CMyApplication::Run()
{
    MSG msg;

    // Message loop to run the app
    while( TRUE )
    {
        if( PeekMessage( &msg, NULL, 0, 0, PM_REMOVE ) )
        {
            // Skip WM_KEYDOWN so they aren't handled by the dialog
            if( msg.message == WM_KEYDOWN )
                continue;

            if( !IsDialogMessage( m_hWnd, &msg ) )  
            {
                TranslateMessage( &msg );
                DispatchMessage( &msg );
            }

            if( msg.message == WM_QUIT )
            {
                DestroyWindow( m_hWnd );
                break;
            }
        }
        else
        {
            // Update the time variables
            m_fTime        = DXUtil_Timer( TIMER_GETAPPTIME );
            m_fElapsedTime = DXUtil_Timer( TIMER_GETELAPSEDTIME );

            // This app uses idle time processing for the game loop
            if( FAILED( FrameMove() ) )
                SendMessage( m_hWnd, WM_DESTROY, 0, 0 );
            if( FAILED( Render() ) ) 
                SendMessage( m_hWnd, WM_DESTROY, 0, 0 );

            Sleep( 20 );
        }
    }

    FinalCleanup();

    return (INT)msg.wParam;
}
示例#6
0
INT	CGpApp::Proc(LC_HANDLE)
{
	//LOGE("Proc-----------------------------------------------------------\n");

	if(LC_FAILED(FrameMove()))
		return LC_EFAIL;


	if(LC_FAILED(Render()))
		return LC_EFAIL;


#if !defined(__ANDROID__)
	m_pDev->Present(0,0,0,0);
#endif

	UpdateStatus();


	return LC_OK;
}
示例#7
0
文件: main.cpp 项目: chenbk85/3dlearn
void main(void)
{
	// 內定使用DirectX 9來繪圖
	char *device = "dx9";
	void (*render)(void) = RenderFrameDX9;
	bool (*init_resource)(void) = InitResourceDX9;
	bool (*release_resource)(void) = ReleaseResourceDX9;
	void (*resize_func)(int width, int height) = ResizeWindowDX9;

	printf("Press\n(1) for Direct3D9\n(2) for OpenGL\n");
	int c = getche();

	switch(c)
	{
	default:
	case '1':
		render = RenderFrameDX9;
		init_resource = InitResourceDX9;
		release_resource = ReleaseResourceDX9;
		resize_func = ResizeWindowDX9;
		break;
	case '2':
		device = "opengl";
		init_resource = InitResourceOpenGL;
		release_resource = ReleaseResourceOpenGL;
		render = RenderFrameOpenGL;
		resize_func = ResizeWindowOpenGL;
		break;
	}

	GutResizeFunc( resize_func );

	// 在(100,100)的位置開啟一個大小為(512x512)的視窗
	GutCreateWindow(100, 100, 512, 512, device);

	// 做OpenGL或DirectX初始化
	if ( !GutInitGraphicsDevice(device) )
	{
		printf("Failed to initialize %s device\n", device);
		exit(0);
	}

	// 設定方向光
	g_Light.m_Position.Set(-3.0f, 0.0f, 5.0f);
	g_Light.m_Direction.Set(0.0f, 1.0f, 1.0f, 0.0f);
	g_Light.m_Direction.Normalize();
	g_Light.m_Diffuse.Set(0.6f, 0.6f, 0.6f, 1.0f);
	//g_Light.m_Specular.Set(1.0f, 1.0f, 1.0f, 1.0f);
	g_Light.m_Specular.Set(0.0f, 0.0f, 0.0f, 1.0f);

	g_light_pos_x = g_Light.m_Position[0];

	GutInputInit();
	g_Control.SetCamera(Vector4(0.0f, 0.0f, 10.0f), Vector4(0.0f, 0.0f, 0.0f), Vector4(0.0f, 1.0f, 0.0f) );

	g_Model.Load_ASCII("..\\..\\models\\teapot.gma");

	// 載入shader
	if ( !init_resource() )
	{
		release_resource();
		printf("Failed to load resources\n");
		exit(0);
	}

	// 主回圈
	while( GutProcessMessage() )
	{
		GetUserInput();
		FrameMove();
		render();
	}

	// 卸載shader
	release_resource();

	// 關閉OpenGL/DirectX繪圖裝置
	GutReleaseGraphicsDevice();
}
示例#8
0
HRESULT KG3DRotationCoordinateOld::Render()
{
    HRESULT hResult  = E_FAIL;

    /*if (!m_EntityList.GetSize())
        return E_FAIL;*/
	if (0 == m_pAttachScene->GetSelectionTool().GetSelectionCount())
	{
		return E_FAIL;
	}

    D3DXMATRIX matWorldSave;
    D3DXMATRIX matWorld;
    D3DXMATRIX matParent;
    D3DXMATRIX matLocalIv;
    D3DXMATRIX matWorldMatrix;
    D3DXMATRIX matMatrix;

    IEKG3DSceneOutputWnd* pCurWnd = NULL;
    IEKG3DSceneOutputWnd* pRedWnd = NULL;

    m_pAttachScene->GetCurRenderWnd(&pRedWnd);
    m_pAttachScene->GetCurOutputWnd(&pCurWnd);

    if (pRedWnd != pCurWnd || pRedWnd == NULL)
        return S_OK;

	if(g_Switch.bNewSelection)
		return S_OK;

    FrameMove();

    D3DXMatrixIdentity(&matWorld);
    KG3DRenderState R;
    R.SetRenderState(D3DRS_AMBIENT, 0xffffffff);
    R.SetRenderState(D3DRS_ZENABLE, D3DZB_FALSE);
    g_pd3dDevice->GetTransform(D3DTS_WORLD, &matWorldSave);
    R.SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE);
    R.SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);
    R.SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);

    R.SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);
    R.SetRenderState(D3DRS_SPECULARENABLE, TRUE);
    g_pd3dDevice->SetTexture(0, NULL);

    g_pd3dDevice->SetTransform(D3DTS_WORLD, &matWorld);

    D3DXVECTOR3 vCenter = D3DXVECTOR3(m_matCoord._41, m_matCoord._42, m_matCoord._43);
    D3DXVECTOR3 vNormal = D3DXVECTOR3(0.f, 1.f, 0.f);
    FLOAT fRadiu = 59.f * m_fZoom * GetScalingFactor();
    D3DXVECTOR3 vCoordX = D3DXVECTOR3(m_matCoord._11, m_matCoord._12, m_matCoord._13);
    D3DXVECTOR3 vCoordY = D3DXVECTOR3(m_matCoord._21, m_matCoord._22, m_matCoord._23);
    D3DXVECTOR3 vCoordZ = D3DXVECTOR3(m_matCoord._31, m_matCoord._32, m_matCoord._33);

    D3DXMATRIX matProjSave;
    D3DXMATRIX matProj;
    KG3DCamera* pCamera = g_cGraphicsTool.GetCamera();
    ASSERT(pCamera);
    FLOAT fFovY = 0.f;
    FLOAT fAspe = 0.f;
    FLOAT fNear = 0.f;
    FLOAT fFar  = 0.f;
    pCamera->GetPerspective(&fFovY, &fAspe, &fNear, &fFar);
    fFar = D3DXVec3Length(&(pCamera->GetPosition() - vCenter));

    D3DXMatrixPerspectiveFovLH(&matProj, fFovY, fAspe, fNear, fFar);
    g_pd3dDevice->GetTransform(D3DTS_PROJECTION, &matProjSave);

    if (pCamera->IsPerspective())
        g_pd3dDevice->SetTransform(D3DTS_PROJECTION, &matProj);

    // y
    if (m_dwCurrSelCoord == 0)
        g_cGraphicsTool.DrawCircle(vCenter, vCoordY, fRadiu, 0xfff2d900);
    else 
        g_cGraphicsTool.DrawCircle(vCenter, vCoordY, fRadiu, 0xffc80000);

    // x
    if (m_dwCurrSelCoord == 1)
        g_cGraphicsTool.DrawCircle(vCenter, vCoordX, fRadiu, 0xfff2d900);
    else 
        g_cGraphicsTool.DrawCircle(vCenter, vCoordX, fRadiu, 0xff0000c3);

    // z
    if (m_dwCurrSelCoord == 2)
        g_cGraphicsTool.DrawCircle(vCenter, vCoordZ, fRadiu, 0xfff2d900);
    else 
        g_cGraphicsTool.DrawCircle(vCenter, vCoordZ, fRadiu, 0xff00cc00);

    g_pd3dDevice->SetTransform(D3DTS_PROJECTION, &matProjSave);

	//画出从开始到结束的三角扇形
    if (m_dwCurrSelCoord == 0)
        g_cGraphicsTool.DrawFan(vCenter, vCoordY, fRadiu - 1.f, m_vBeginCross, m_fAngelY, 0x50000000);
    else if (m_dwCurrSelCoord == 1)
        g_cGraphicsTool.DrawFan(vCenter, vCoordX, fRadiu - 1.f, m_vBeginCross, m_fAngelX, 0x50000000);
    else if (m_dwCurrSelCoord == 2)
        g_cGraphicsTool.DrawFan(vCenter, vCoordZ, fRadiu - 1.f, m_vBeginCross, m_fAngelZ, 0x50000000);
    else 
        ;

    g_pd3dDevice->SetTransform(D3DTS_WORLD, &matWorldSave); 

    hResult = S_OK;
    return hResult;
}
示例#9
0
HRESULT RacorX5::Frame()
{
	FrameMove(1.1f);
	Render();
	return S_OK;
}
示例#10
0
/* Function that runs the application */
INT CXBApplicationEx::Run(CFileItemList &playlist)
{
  CLog::Log(LOGNOTICE, "Running the application..." );

  unsigned int lastFrameTime = 0;
  unsigned int frameTime = 0;
  const unsigned int noRenderFrameTime = 15;  // Simulates ~66fps

  if (playlist.Size() > 0)
  {
    g_playlistPlayer.Add(0, playlist);
    g_playlistPlayer.SetCurrentPlaylist(0);
    KODI::MESSAGING::CApplicationMessenger::GetInstance().PostMsg(TMSG_PLAYLISTPLAYER_PLAY, -1);
  }

  // Run xbmc
  while (!m_bStop)
  {
#ifdef HAS_PERFORMANCE_SAMPLE
    CPerformanceSample sampleLoop("XBApplicationEx-loop");
#endif
    //-----------------------------------------
    // Animate and render a frame
    //-----------------------------------------
#ifdef XBMC_TRACK_EXCEPTIONS
    try
    {
#endif
      lastFrameTime = XbmcThreads::SystemClockMillis();
      Process();
      //reset exception count
#ifdef XBMC_TRACK_EXCEPTIONS

    }
    catch (const XbmcCommons::UncheckedException &e)
    {
      e.LogThrowMessage("CApplication::Process()");
      throw;
    }
    catch (...)
    {
      CLog::Log(LOGERROR, "exception in CApplication::Process()");
      throw;
    }
#endif
    // Frame move the scene
#ifdef XBMC_TRACK_EXCEPTIONS
    try
    {
#endif
      if (!m_bStop)
      {
        FrameMove(true, m_renderGUI);
      }

      //reset exception count
#ifdef XBMC_TRACK_EXCEPTIONS
    }
    catch (const XbmcCommons::UncheckedException &e)
    {
      e.LogThrowMessage("CApplication::FrameMove()");
      throw;
    }
    catch (...)
    {
      CLog::Log(LOGERROR, "exception in CApplication::FrameMove()");
      throw;
    }
#endif

    // Render the scene
#ifdef XBMC_TRACK_EXCEPTIONS
    try
    {
#endif
      if (m_renderGUI && !m_bStop)
      {
        Render();
      }
      else if (!m_renderGUI)
      {
        frameTime = XbmcThreads::SystemClockMillis() - lastFrameTime;
        if(frameTime < noRenderFrameTime)
          Sleep(noRenderFrameTime - frameTime);
      }
#ifdef XBMC_TRACK_EXCEPTIONS
    }
    catch (const XbmcCommons::UncheckedException &e)
    {
      e.LogThrowMessage("CApplication::Render()");
      throw;
    }
    catch (...)
    {
      CLog::Log(LOGERROR, "exception in CApplication::Render()");
      throw;
    }
#endif
  } // while (!m_bStop)
  Destroy();

  CLog::Log(LOGNOTICE, "application stopped..." );
  return m_ExitCode;
}
示例#11
0
HRESULT HelloShadowVolume::Frame()
{
    FrameMove(0.0f);
    Render();
    return S_OK;
}
示例#12
0
HRESULT RacorX4::Frame()
{
	FrameMove(0.0f);
	Render();
	return S_OK;
}
示例#13
0
//-----------------------------------------------------------------------------
// Name: Run()
// Desc:
//-----------------------------------------------------------------------------
INT CXBApplicationEx::Run()
{
  CLog::Log(LOGNOTICE, "Running the application..." );

  // Get the frequency of the timer
  LARGE_INTEGER qwTicksPerSec;
  QueryPerformanceFrequency( &qwTicksPerSec );
  FLOAT fSecsPerTick = 1.0f / (FLOAT)qwTicksPerSec.QuadPart;

  // Save the start time
  LARGE_INTEGER qwTime, qwLastTime, qwElapsedTime;
  QueryPerformanceCounter( &qwTime );
  qwLastTime.QuadPart = qwTime.QuadPart;

  LARGE_INTEGER qwAppTime, qwElapsedAppTime;
  qwAppTime.QuadPart = 0;
  qwElapsedTime.QuadPart = 0;
  qwElapsedAppTime.QuadPart = 0;

  BYTE processExceptionCount = 0;
  BYTE frameMoveExceptionCount = 0;
  BYTE renderExceptionCount = 0;

#ifndef _DEBUG
  const BYTE MAX_EXCEPTION_COUNT = 10;
#endif

  // Run the game loop, animating and rendering frames
  while (!m_bStop)
  {
#ifdef HAS_PERFORMANCE_SAMPLE
    CPerformanceSample sampleLoop("XBApplicationEx-loop");  
#endif

    //-----------------------------------------
    // Perform app timing
    //-----------------------------------------

    // Check Start button
#ifdef HAS_GAMEPAD
    if ( m_DefaultGamepad.wPressedButtons & XINPUT_GAMEPAD_START )
#endif
      m_bPaused = !m_bPaused;

    // Get the current time (keep in LARGE_INTEGER format for precision)
    QueryPerformanceCounter( &qwTime );
    qwElapsedTime.QuadPart = qwTime.QuadPart - qwLastTime.QuadPart;
    qwLastTime.QuadPart = qwTime.QuadPart;
    if ( m_bPaused )
      qwElapsedAppTime.QuadPart = 0;
    else
      qwElapsedAppTime.QuadPart = qwElapsedTime.QuadPart;
    qwAppTime.QuadPart += qwElapsedAppTime.QuadPart;

    // Store the current time values as floating point
    m_fTime = fSecsPerTick * ((FLOAT)(qwTime.QuadPart));
    m_fElapsedTime = fSecsPerTick * ((FLOAT)(qwElapsedTime.QuadPart));
    m_fAppTime = fSecsPerTick * ((FLOAT)(qwAppTime.QuadPart));
    m_fElapsedAppTime = fSecsPerTick * ((FLOAT)(qwElapsedAppTime.QuadPart));

    //-----------------------------------------
    // Animate and render a frame
    //-----------------------------------------
#ifndef _DEBUG
    try
    {
#endif
      Process();
      //reset exception count
      processExceptionCount = 0;

#ifndef _DEBUG

    }
    catch (...)
    {
      CLog::Log(LOGERROR, "exception in CApplication::Process()");
      processExceptionCount++;
      //MAX_EXCEPTION_COUNT exceptions in a row? -> bail out
      if (processExceptionCount > MAX_EXCEPTION_COUNT)
      {
        CLog::Log(LOGERROR, "CApplication::Process(), too many exceptions");
        throw;
      }
    }
#endif
    // Frame move the scene
#ifndef _DEBUG
    try
    {
#endif
      if (!m_bStop) FrameMove();
      //reset exception count
      frameMoveExceptionCount = 0;

#ifndef _DEBUG

    }
    catch (...)
    {
      CLog::Log(LOGERROR, "exception in CApplication::FrameMove()");
      frameMoveExceptionCount++;
      //MAX_EXCEPTION_COUNT exceptions in a row? -> bail out
      if (frameMoveExceptionCount > MAX_EXCEPTION_COUNT)
      {
        CLog::Log(LOGERROR, "CApplication::FrameMove(), too many exceptions");
        throw;
      }
    }
#endif

    // Render the scene
#ifndef _DEBUG
    try
    {
#endif
      if (!m_bStop) Render();
      //reset exception count
      renderExceptionCount = 0;

#ifndef _DEBUG

    }
    catch (...)
    {
      CLog::Log(LOGERROR, "exception in CApplication::Render()");
      renderExceptionCount++;
      //MAX_EXCEPTION_COUNT exceptions in a row? -> bail out
      if (renderExceptionCount > MAX_EXCEPTION_COUNT)
      {
        CLog::Log(LOGERROR, "CApplication::Render(), too many exceptions");
        throw;
      }
    }
#endif

  }
  Destroy();

  CLog::Log(LOGNOTICE, "application stopped..." );
  return 0;
}
示例#14
0
void CRenderDevice::on_idle		()
{
	if (!b_is_Ready) {
		Sleep	(100);
		return;
	}

#ifdef DEDICATED_SERVER
	u32 FrameStartTime = TimerGlobal.GetElapsed_ms();
#endif
	if (psDeviceFlags.test(rsStatistic))	g_bEnableStatGather	= TRUE;
	else									g_bEnableStatGather	= FALSE;
	if(g_loading_events.size())
	{
		if( g_loading_events.front()() )
			g_loading_events.pop_front();
		pApp->LoadDraw				();
		return;
	}else 
	{
		if ( (!Device.dwPrecacheFrame) && (!g_SASH.IsBenchmarkRunning())
			&& g_bLoaded)
			g_SASH.StartBenchmark();

		FrameMove						( );
	}

	// Precache
	if (dwPrecacheFrame)
	{
		float factor					= float(dwPrecacheFrame)/float(dwPrecacheTotal);
		float angle						= PI_MUL_2 * factor;
		vCameraDirection.set			(_sin(angle),0,_cos(angle));	vCameraDirection.normalize	();
		vCameraTop.set					(0,1,0);
		vCameraRight.crossproduct		(vCameraTop,vCameraDirection);

		mView.build_camera_dir			(vCameraPosition,vCameraDirection,vCameraTop);
	}

	// Matrices
	mFullTransform.mul			( mProject,mView	);
	m_pRender->SetCacheXform(mView, mProject);
	//RCache.set_xform_view		( mView				);
	//RCache.set_xform_project	( mProject			);
	D3DXMatrixInverse			( (D3DXMATRIX*)&mInvFullTransform, 0, (D3DXMATRIX*)&mFullTransform);

	// *** Resume threads
	// Capture end point - thread must run only ONE cycle
	// Release start point - allow thread to run
	mt_csLeave.Enter			();
	mt_csEnter.Leave			();

#ifdef ECO_RENDER // ECO_RENDER START
	static u32 time_frame = 0;
	u32 time_curr = timeGetTime();
	u32 time_diff = time_curr - time_frame;
	time_frame = time_curr;
	u32 optimal = 10;
	if (Device.Paused() || IsMainMenuActive())
		optimal = 32;
	if (time_diff < optimal)
		Sleep(optimal - time_diff);
#else
	Sleep						(0);
#endif // ECO_RENDER END
#ifdef SPAWN_ANTIFREEZE
	frame_timer.Start();
#endif
#ifndef DEDICATED_SERVER
	Statistic->RenderTOTAL_Real.FrameStart	();
	Statistic->RenderTOTAL_Real.Begin		();
	if (b_is_Active)							{
		if (Begin())				{

			seqRender.Process						(rp_Render);
			if (psDeviceFlags.test(rsCameraPos) || psDeviceFlags.test(rsStatistic) || Statistic->errors.size())	
				Statistic->Show						();
			//	TEST!!!
			//Statistic->RenderTOTAL_Real.End			();
			//	Present goes here
			End										();
		}
	}
	Statistic->RenderTOTAL_Real.End			();
	Statistic->RenderTOTAL_Real.FrameEnd	();
	Statistic->RenderTOTAL.accum	= Statistic->RenderTOTAL_Real.accum;
#endif // #ifndef DEDICATED_SERVER
	// *** Suspend threads
	// Capture startup point
	// Release end point - allow thread to wait for startup point
	mt_csEnter.Enter						();
	mt_csLeave.Leave						();

	// Ensure, that second thread gets chance to execute anyway
	if (dwFrame!=mt_Thread_marker)			{
		for (u32 pit=0; pit<Device.seqParallel.size(); pit++)
			Device.seqParallel[pit]			();
		Device.seqParallel.clear_not_free	();
		seqFrameMT.Process					(rp_Frame);
	}

#ifdef DEDICATED_SERVER
	u32 FrameEndTime = TimerGlobal.GetElapsed_ms();
	u32 FrameTime = (FrameEndTime - FrameStartTime);
	/*
	string1024 FPS_str = "";
	string64 tmp;
	strcat(FPS_str, "FPS Real - ");
	if (dwTimeDelta != 0)
		strcat(FPS_str, ltoa(1000/dwTimeDelta, tmp, 10));
	else
		strcat(FPS_str, "~~~");

	strcat(FPS_str, ", FPS Proj - ");
	if (FrameTime != 0)
		strcat(FPS_str, ltoa(1000/FrameTime, tmp, 10));
	else
		strcat(FPS_str, "~~~");
	
*/
	u32 DSUpdateDelta = 1000/g_svDedicateServerUpdateReate;
	if (FrameTime < DSUpdateDelta)
	{
		Sleep(DSUpdateDelta - FrameTime);
//		Msg("sleep for %d", DSUpdateDelta - FrameTime);
//		strcat(FPS_str, ", sleeped for ");
//		strcat(FPS_str, ltoa(DSUpdateDelta - FrameTime, tmp, 10));
	}
//	Msg(FPS_str);
#endif // #ifdef DEDICATED_SERVER

	if (!b_is_Active)
		Sleep		(1);
}
示例#15
0
/* Function that runs the application */
INT CXBApplicationEx::Run()
{
  CLog::Log(LOGNOTICE, "Running the application..." );

  unsigned int lastFrameTime = 0;
  unsigned int frameTime = 0;
  const unsigned int noRenderFrameTime = 15;  // Simulates ~66fps

#ifdef XBMC_TRACK_EXCEPTIONS
  BYTE processExceptionCount = 0;
  BYTE frameMoveExceptionCount = 0;
  BYTE renderExceptionCount = 0;
  const BYTE MAX_EXCEPTION_COUNT = 10;
#endif

  // Run xbmc
  while (!m_bStop)
  {
#ifdef HAS_PERFORMANCE_SAMPLE
    CPerformanceSample sampleLoop("XBApplicationEx-loop");
#endif
    //-----------------------------------------
    // Animate and render a frame
    //-----------------------------------------
#ifdef XBMC_TRACK_EXCEPTIONS
    try
    {
#endif
      lastFrameTime = XbmcThreads::SystemClockMillis();
      Process();
      //reset exception count
#ifdef XBMC_TRACK_EXCEPTIONS
      processExceptionCount = 0;

    }
    catch (const XbmcCommons::UncheckedException &e)
    {
      e.LogThrowMessage("CApplication::Process()");
      processExceptionCount++;
      //MAX_EXCEPTION_COUNT exceptions in a row? -> bail out
      if (processExceptionCount > MAX_EXCEPTION_COUNT)
      {
        CLog::Log(LOGERROR, "CApplication::Process(), too many exceptions");
        throw;
      }
    }
    catch (...)
    {
      CLog::Log(LOGERROR, "exception in CApplication::Process()");
      processExceptionCount++;
      //MAX_EXCEPTION_COUNT exceptions in a row? -> bail out
      if (processExceptionCount > MAX_EXCEPTION_COUNT)
      {
        CLog::Log(LOGERROR, "CApplication::Process(), too many exceptions");
        throw;
      }
    }
#endif
    // Frame move the scene
#ifdef XBMC_TRACK_EXCEPTIONS
    try
    {
#endif
      if (!m_bStop) FrameMove(true, m_renderGUI);
      //reset exception count
#ifdef XBMC_TRACK_EXCEPTIONS
      frameMoveExceptionCount = 0;

    }
    catch (const XbmcCommons::UncheckedException &e)
    {
      e.LogThrowMessage("CApplication::FrameMove()");
      frameMoveExceptionCount++;
      //MAX_EXCEPTION_COUNT exceptions in a row? -> bail out
      if (frameMoveExceptionCount > MAX_EXCEPTION_COUNT)
      {
        CLog::Log(LOGERROR, "CApplication::FrameMove(), too many exceptions");
        throw;
      }
    }
    catch (...)
    {
      CLog::Log(LOGERROR, "exception in CApplication::FrameMove()");
      frameMoveExceptionCount++;
      //MAX_EXCEPTION_COUNT exceptions in a row? -> bail out
      if (frameMoveExceptionCount > MAX_EXCEPTION_COUNT)
      {
        CLog::Log(LOGERROR, "CApplication::FrameMove(), too many exceptions");
        throw;
      }
    }
#endif

    // Render the scene
#ifdef XBMC_TRACK_EXCEPTIONS
    try
    {
#endif
      if (m_renderGUI && !m_bStop) Render();
      else if (!m_renderGUI)
      {
        frameTime = XbmcThreads::SystemClockMillis() - lastFrameTime;
        if(frameTime < noRenderFrameTime)
          Sleep(noRenderFrameTime - frameTime);
      }
#ifdef XBMC_TRACK_EXCEPTIONS
      //reset exception count
      renderExceptionCount = 0;

    }
    catch (const XbmcCommons::UncheckedException &e)
    {
      e.LogThrowMessage("CApplication::Render()");
      renderExceptionCount++;
      //MAX_EXCEPTION_COUNT exceptions in a row? -> bail out
      if (renderExceptionCount > MAX_EXCEPTION_COUNT)
      {
        CLog::Log(LOGERROR, "CApplication::Render(), too many exceptions");
        throw;
      }
    }
    catch (...)
    {
      CLog::Log(LOGERROR, "exception in CApplication::Render()");
      renderExceptionCount++;
      //MAX_EXCEPTION_COUNT exceptions in a row? -> bail out
      if (renderExceptionCount > MAX_EXCEPTION_COUNT)
      {
        CLog::Log(LOGERROR, "CApplication::Render(), too many exceptions");
        throw;
      }
    }
#endif
  } // while (!m_bStop)
  Destroy();

  CLog::Log(LOGNOTICE, "application stopped..." );
  return m_ExitCode;
}
示例#16
0
void XViewSpline::Draw()
{
    // TODO: 여기에 특수화된 코드를 추가 및/또는 기본 클래스를 호출합니다.
    if( GetChain() )
    {
        LPDIRECT3DSURFACE9 pBackBuffer = nullptr;
        GetChain()->GetBackBuffer( 0, D3DBACKBUFFER_TYPE_MONO, &pBackBuffer );
        if( pBackBuffer )
        {
            D3DDEVICE->SetRenderTarget( 0, pBackBuffer );
            D3DDEVICE->Clear( 0, nullptr, D3DCLEAR_TARGET, XCOLOR_GRAY, 1.0f, 0 );
            RECT rect;
            GetClientRect( &rect );
            XE::SetProjection( rect.right-rect.left, rect.bottom-rect.top );
            if(SUCCEEDED(D3DDEVICE->BeginScene()))
            {
                // FrameMove
                FrameMove();
                //
                D3DXVECTOR2 v( 0, 0 );		//
                D3DXMATRIX mWorld, mRot, mTrans, mLocal;
                D3DXMatrixIdentity( &mWorld );
                D3DXMatrixTranslation( &mWorld, vCenter.x, vCenter.y, 0 );
                for( int i = 0; i < MAX_JOINT; ++i )
                {
                    JOINT *j = &m_listJoint[i];

                    // 관절부위에 원을 그림
                    D3DCOLOR col = XCOLOR_WHITE;
                    if( m_idxSelected == i )
                        col = XCOLOR_RED;
                    GRAPHICS->DrawCircle( j->m_vEnd.x, j->m_vEnd.y, 5.f, col );		// 관절끝 부위에 원을 그림
                    GRAPHICS->DrawLine( j->m_vStart.x, j->m_vStart.y, j->m_vEnd.x, j->m_vEnd.y, col );		// 관절 그림
                    // test
                    {
                        D3DXVECTOR2 vA;
                        vA = D3DXVECTOR2( m_vMouse.x, m_vMouse.y ) - s_vC;
                        float rDist = GetAngle( s_vB ) - GetAngle( vA );
                        if( rDist > D2R(180.f) )
                            rDist -= D2R(360.f);
                        else if( rDist < D2R(-180.f) )
                            rDist += D2R(360.f);

                        // draw
                        GRAPHICS->DrawLine( s_vC.x - 100.f, s_vC.y, s_vC.x + 100.f, s_vC.y, XCOLOR_BLUE );
                        GRAPHICS->DrawLine( s_vC.x, s_vC.y - 100.f, s_vC.x, s_vC.y + 100.f, XCOLOR_BLUE );		// 십자선
                        GRAPHICS->DrawLine( s_vC.x, s_vC.y, s_vC.x + s_vB.x, s_vC.y + s_vB.y, XCOLOR_RED );	// 목표벡터
                        GRAPHICS->DrawLine( s_vC.x, s_vC.y, s_vC.x + vA.x, s_vC.y + vA.y, XCOLOR_WHITE );	// 시작 벡터
                        SE::g_pFDBasic->DrawString( s_vC.x + 5.f, s_vC.y + 5.f, XCOLOR_WHITE, _T("%f(%f)"), R2D(rDist), rDist );

                    }

                    // info
                    SE::g_pFDBasic->DrawString( 5.f, 5.f, XCOLOR_WHITE, _T("%d-%d"), (int)m_vMouse.x, (int)m_vMouse.y );
                    /*					D3DXMatrixRotationZ( &mRot, j->m_rAngle );
                    					D3DXMatrixTranslation( &mTrans, j->m_vLocal.x, j->m_vLocal.y, 0 );
                    					mLocal = mRot * mTrans;
                    					mWorld = mLocal * mWorld;
                    					j->m_mWorld = mWorld;

                    					D3DXVECTOR2 v0 = D3DXVECTOR2( 0, 0 );			// 관절원점
                    					D3DXVECTOR2 v1 = D3DXVECTOR2( LEN_JOINT, 0 );		// 관절끝위치
                    					D3DXVECTOR2 v0T, v1T;
                    					D3DXVec2TransformCoord( &v0T, &v0, &mWorld );
                    					D3DXVec2TransformCoord( &v1T, &v1, &mWorld );
                    					// 관절부위에 원을 그림
                    					D3DCOLOR col = XCOLOR_WHITE;
                    					if( m_idxSelected == i )
                    						col = XCOLOR_RED;
                    					GRAPHICS->DrawCircle( v1T.x, v1T.y, 5.f, col );		// 관절부위에 원을 그림
                    					GRAPHICS->DrawLine( v0T.x, v0T.y, v1T.x, v1T.y, col );		// 관절 그림
                    					if( m_bDrawDebug )
                    					{
                    	//					SE::g_pFDBasic->DrawString( v1T.x + 20.f, v1T.y - 20.f, XCOLOR_WHITE, _T("%f"), j->dot );
                    						// normal
                    						D3DXVECTOR2 v2T;
                    						v1 = j->m_vNormal * 50.f + v0T;
                    				//		D3DXVec2TransformCoord( &v2T, &v1, &mWorld );
                    						GRAPHICS->DrawLine( v0T.x, v0T.y, v1.x, v1.y, XCOLOR_BLUE );		// 노말벡터
                    						// 힘벡터
                    						v1 = j->m_vForce * 300.f;
                    						v2T = v1T + v1;
                    						GRAPHICS->DrawLine( v1T.x, v1T.y, v2T.x, v2T.y, XCOLOR_GREEN );		// 노말벡터
                    					}
                    					*/
                }

                //
                D3DDEVICE->EndScene();
            }
            GetChain()->Present( nullptr, nullptr, GetSafeHwnd(), nullptr, 0 );
            pBackBuffer->Release();
        }
    }

}
示例#17
0
/** call this function to advance using delta time 
return the desired elapsed time
*/
double CFrameRateController::FrameMoveDelta(double deltatime)
{
	return FrameMove(m_fLastTime + deltatime);
}
示例#18
0
/* Function that runs the application */
INT CXBApplicationEx::Run()
{
  CLog::Log(LOGNOTICE, "Running the application..." );

  BYTE processExceptionCount = 0;
  BYTE frameMoveExceptionCount = 0;
  BYTE renderExceptionCount = 0;

#ifndef _DEBUG
  const BYTE MAX_EXCEPTION_COUNT = 10;
#endif

  // Run xbmc
  while (!m_bStop)
  {
#ifdef HAS_PERFORMANCE_SAMPLE
    CPerformanceSample sampleLoop("XBApplicationEx-loop");
#endif
    //-----------------------------------------
    // Animate and render a frame
    //-----------------------------------------
#ifndef _DEBUG
    try
    {
#endif
      Process();
      //reset exception count
      processExceptionCount = 0;

#ifndef _DEBUG

    }
    catch (...)
    {
      CLog::Log(LOGERROR, "exception in CApplication::Process()");
      processExceptionCount++;
      //MAX_EXCEPTION_COUNT exceptions in a row? -> bail out
      if (processExceptionCount > MAX_EXCEPTION_COUNT)
      {
        CLog::Log(LOGERROR, "CApplication::Process(), too many exceptions");
        throw;
      }
    }
#endif
    // Frame move the scene
#ifndef _DEBUG
    try
    {
#endif
      if (!m_bStop) FrameMove();
      //reset exception count
      frameMoveExceptionCount = 0;

#ifndef _DEBUG

    }
    catch (...)
    {
      CLog::Log(LOGERROR, "exception in CApplication::FrameMove()");
      frameMoveExceptionCount++;
      //MAX_EXCEPTION_COUNT exceptions in a row? -> bail out
      if (frameMoveExceptionCount > MAX_EXCEPTION_COUNT)
      {
        CLog::Log(LOGERROR, "CApplication::FrameMove(), too many exceptions");
        throw;
      }
    }
#endif

    // Render the scene
#ifndef _DEBUG
    try
    {
#endif
      if (!m_bStop) Render();
      //reset exception count
      renderExceptionCount = 0;

#ifndef _DEBUG

    }
    catch (...)
    {
      CLog::Log(LOGERROR, "exception in CApplication::Render()");
      renderExceptionCount++;
      //MAX_EXCEPTION_COUNT exceptions in a row? -> bail out
      if (renderExceptionCount > MAX_EXCEPTION_COUNT)
      {
        CLog::Log(LOGERROR, "CApplication::Render(), too many exceptions");
        throw;
      }
    }
#endif
  } // while (!m_bStop)
  Destroy();

  CLog::Log(LOGNOTICE, "application stopped..." );
  return 0;
}