EmptyProject.cpp
上传用户:junlon
上传日期:2022-01-05
资源大小:39075k
文件大小:25k
源码类别:

DirextX编程

开发平台:

Visual C++

  1. //--------------------------------------------------------------------------------------
  2. // File: EmptyProject.cpp
  3. //
  4. // Starting point for new Direct3D applications
  5. //
  6. // Copyright (c) Microsoft Corporation. All rights reserved.
  7. //--------------------------------------------------------------------------------------
  8. #include "dxstdafx.h"
  9. #include "resource.h"
  10. #include <list>
  11. #include "d3dutility.h"
  12. #include "particle.h"
  13. //#define DEBUG_VS   // Uncomment this line to debug vertex shaders 
  14. //#define DEBUG_PS   // Uncomment this line to debug pixel shaders 
  15. #define NUMPERBATCH 50
  16. #define NUMTOTAL    1000
  17. using namespace ParticleSystem;
  18. //--------------------------------------------------------------------------------------
  19. // Global variables
  20. //--------------------------------------------------------------------------------------
  21. ID3DXFont*              g_pFont = NULL;         // Font for drawing text
  22. ID3DXSprite*            g_pTextSprite = NULL;   // Sprite for batching draw text calls
  23. ID3DXEffect*            g_pEffect = NULL;       // D3DX effect interface
  24. CFirstPersonCamera      g_Camera;               // A model viewing camera
  25. bool                    g_bShowHelp = true;     // If true, it renders the UI control text
  26. CDXUTDialogResourceManager g_DialogResourceManager; // manager for shared resources of dialogs
  27. CD3DSettingsDlg         g_SettingsDlg;          // Device settings dialog
  28. CDXUTDialog             g_HUD;                  // dialog for standard controls
  29. CDXUTDialog             g_SampleUI;             // dialog for sample specific controls
  30. CRainSystem* g_pRain = NULL;                      //snow system
  31. //--------------------------------------------------------------------------------------
  32. // UI control IDs
  33. //--------------------------------------------------------------------------------------
  34. #define IDC_TOGGLEFULLSCREEN    1
  35. #define IDC_TOGGLEREF           2
  36. #define IDC_CHANGEDEVICE        3
  37. //--------------------------------------------------------------------------------------
  38. // Forward declarations 
  39. //--------------------------------------------------------------------------------------
  40. bool    CALLBACK IsDeviceAcceptable( D3DCAPS9* pCaps, D3DFORMAT AdapterFormat, D3DFORMAT BackBufferFormat, bool bWindowed, void* pUserContext );
  41. bool    CALLBACK ModifyDeviceSettings( DXUTDeviceSettings* pDeviceSettings, const D3DCAPS9* pCaps, void* pUserContext );
  42. HRESULT CALLBACK OnCreateDevice( IDirect3DDevice9* pd3dDevice, const D3DSURFACE_DESC* pBackBufferSurfaceDesc, void* pUserContext );
  43. HRESULT CALLBACK OnResetDevice( IDirect3DDevice9* pd3dDevice, const D3DSURFACE_DESC* pBackBufferSurfaceDesc, void* pUserContext );
  44. void    CALLBACK OnFrameMove( IDirect3DDevice9* pd3dDevice, double fTime, float fElapsedTime, void* pUserContext );
  45. void    CALLBACK OnFrameRender( IDirect3DDevice9* pd3dDevice, double fTime, float fElapsedTime, void* pUserContext );
  46. LRESULT CALLBACK MsgProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, bool* pbNoFurtherProcessing, void* pUserContext );
  47. void    CALLBACK KeyboardProc( UINT nChar, bool bKeyDown, bool bAltDown, void* pUserContext );
  48. void    CALLBACK OnGUIEvent( UINT nEvent, int nControlID, CDXUTControl* pControl, void* pUserContext );
  49. void    CALLBACK OnLostDevice( void* pUserContext );
  50. void    CALLBACK OnDestroyDevice( void* pUserContext );
  51. void    InitApp();
  52. void    RenderText();
  53. //--------------------------------------------------------------------------------------
  54. // Entry point to the program. Initializes everything and goes into a message processing 
  55. // loop. Idle time is used to render the scene.
  56. //--------------------------------------------------------------------------------------
  57. INT WINAPI WinMain( HINSTANCE, HINSTANCE, LPSTR, int )
  58. {
  59.     // Enable run-time memory check for debug builds.
  60. #if defined(DEBUG) | defined(_DEBUG)
  61.     _CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );
  62. #endif
  63.     // Set the callback functions. These functions allow DXUT to notify
  64.     // the application about device changes, user input, and windows messages.  The 
  65.     // callbacks are optional so you need only set callbacks for events you're interested 
  66.     // in. However, if you don't handle the device reset/lost callbacks then the sample 
  67.     // framework won't be able to reset your device since the application must first 
  68.     // release all device resources before resetting.  Likewise, if you don't handle the 
  69.     // device created/destroyed callbacks then DXUT won't be able to 
  70.     // recreate your device resources.
  71.     DXUTSetCallbackDeviceCreated( OnCreateDevice );
  72.     DXUTSetCallbackDeviceReset( OnResetDevice );
  73.     DXUTSetCallbackDeviceLost( OnLostDevice );
  74.     DXUTSetCallbackDeviceDestroyed( OnDestroyDevice );
  75.     DXUTSetCallbackMsgProc( MsgProc );
  76.     DXUTSetCallbackKeyboard( KeyboardProc );
  77.     DXUTSetCallbackFrameRender( OnFrameRender );
  78.     DXUTSetCallbackFrameMove( OnFrameMove );
  79.     // Show the cursor and clip it when in full screen
  80.     DXUTSetCursorSettings( true, true );
  81.     InitApp();
  82.     // Initialize DXUT and create the desired Win32 window and Direct3D 
  83.     // device for the application. Calling each of these functions is optional, but they
  84.     // allow you to set several options which control the behavior of the framework.
  85.     DXUTInit( true, true, true ); // Parse the command line, handle the default hotkeys, and show msgboxes
  86.     DXUTCreateWindow( L"EmptyProject" );
  87.     DXUTCreateDevice( D3DADAPTER_DEFAULT, true, 640, 480, IsDeviceAcceptable, ModifyDeviceSettings );
  88.     // Pass control to DXUT for handling the message pump and 
  89.     // dispatching render calls. DXUT will call your FrameMove 
  90.     // and FrameRender callback when there is idle time between handling window messages.
  91.     DXUTMainLoop();
  92.     // Perform any application-level cleanup here. Direct3D device resources are released within the
  93.     // appropriate callback functions and therefore don't require any cleanup code here.
  94.     return DXUTGetExitCode();
  95. }
  96. //--------------------------------------------------------------------------------------
  97. // Initialize the app 
  98. //--------------------------------------------------------------------------------------
  99. void InitApp()
  100. {
  101.     // Initialize dialogs
  102.     g_SettingsDlg.Init( &g_DialogResourceManager );
  103.     g_HUD.Init( &g_DialogResourceManager );
  104.     g_SampleUI.Init( &g_DialogResourceManager );
  105.     g_HUD.SetCallback( OnGUIEvent ); int iY = 10; 
  106.     g_HUD.AddButton( IDC_TOGGLEFULLSCREEN, L"Toggle full screen", 35, iY, 125, 22 );
  107.     g_HUD.AddButton( IDC_TOGGLEREF, L"Toggle REF (F3)", 35, iY += 24, 125, 22 );
  108.     g_HUD.AddButton( IDC_CHANGEDEVICE, L"Change device (F2)", 35, iY += 24, 125, 22, VK_F2 );
  109.     g_SampleUI.SetCallback( OnGUIEvent ); iY = 10; 
  110. /*
  111.     TODO: add UI controls as needed
  112.     g_SampleUI.AddComboBox( 19, 35, iY += 24, 125, 22 );
  113.     g_SampleUI.GetComboBox( 19 )->AddItem( L"Text1", NULL );
  114.     g_SampleUI.GetComboBox( 19 )->AddItem( L"Text2", NULL );
  115.     g_SampleUI.GetComboBox( 19 )->AddItem( L"Text3", NULL );
  116.     g_SampleUI.GetComboBox( 19 )->AddItem( L"Text4", NULL );
  117.     g_SampleUI.AddCheckBox( 21, L"Checkbox1", 35, iY += 24, 125, 22 );
  118.     g_SampleUI.AddCheckBox( 11, L"Checkbox2", 35, iY += 24, 125, 22 );
  119.     g_SampleUI.AddRadioButton( 12, 1, L"Radio1G1", 35, iY += 24, 125, 22 );
  120.     g_SampleUI.AddRadioButton( 13, 1, L"Radio2G1", 35, iY += 24, 125, 22 );
  121.     g_SampleUI.AddRadioButton( 14, 1, L"Radio3G1", 35, iY += 24, 125, 22 );
  122.     g_SampleUI.GetRadioButton( 14 )->SetChecked( true ); 
  123.     g_SampleUI.AddButton( 17, L"Button1", 35, iY += 24, 125, 22 );
  124.     g_SampleUI.AddButton( 18, L"Button2", 35, iY += 24, 125, 22 );
  125.     g_SampleUI.AddRadioButton( 15, 2, L"Radio1G2", 35, iY += 24, 125, 22 );
  126.     g_SampleUI.AddRadioButton( 16, 2, L"Radio2G3", 35, iY += 24, 125, 22 );
  127.     g_SampleUI.GetRadioButton( 16 )->SetChecked( true );
  128.     g_SampleUI.AddSlider( 20, 50, iY += 24, 100, 22 );
  129.     g_SampleUI.GetSlider( 20 )->SetRange( 0, 100 );
  130.     g_SampleUI.GetSlider( 20 )->SetValue( 50 );
  131.     g_SampleUI.AddEditBox( 20, L"Test", 35, iY += 24, 125, 32 );
  132. */
  133. }
  134. //--------------------------------------------------------------------------------------
  135. // Called during device initialization, this code checks the device for some 
  136. // minimum set of capabilities, and rejects those that don't pass by returning false.
  137. //--------------------------------------------------------------------------------------
  138. bool CALLBACK IsDeviceAcceptable( D3DCAPS9* pCaps, D3DFORMAT AdapterFormat, 
  139.                                   D3DFORMAT BackBufferFormat, bool bWindowed, void* pUserContext )
  140. {
  141.     // Skip backbuffer formats that don't support alpha blending
  142.     IDirect3D9* pD3D = DXUTGetD3DObject(); 
  143.     if( FAILED( pD3D->CheckDeviceFormat( pCaps->AdapterOrdinal, pCaps->DeviceType,
  144.                     AdapterFormat, D3DUSAGE_QUERY_POSTPIXELSHADER_BLENDING, 
  145.                     D3DRTYPE_TEXTURE, BackBufferFormat ) ) )
  146.         return false;
  147.     return true;
  148. }
  149. //--------------------------------------------------------------------------------------
  150. // This callback function is called immediately before a device is created to allow the 
  151. // application to modify the device settings. The supplied pDeviceSettings parameter 
  152. // contains the settings that the framework has selected for the new device, and the 
  153. // application can make any desired changes directly to this structure.  Note however that 
  154. // DXUT will not correct invalid device settings so care must be taken 
  155. // to return valid device settings, otherwise IDirect3D9::CreateDevice() will fail.  
  156. //--------------------------------------------------------------------------------------
  157. bool CALLBACK ModifyDeviceSettings( DXUTDeviceSettings* pDeviceSettings, const D3DCAPS9* pCaps, void* pUserContext )
  158. {
  159.     // If device doesn't support HW T&L or doesn't support 1.1 vertex shaders in HW 
  160.     // then switch to SWVP.
  161.     if( (pCaps->DevCaps & D3DDEVCAPS_HWTRANSFORMANDLIGHT) == 0 ||
  162.          pCaps->VertexShaderVersion < D3DVS_VERSION(1,1) )
  163.     {
  164.         pDeviceSettings->BehaviorFlags = D3DCREATE_SOFTWARE_VERTEXPROCESSING;
  165.     }
  166.     // Debugging vertex shaders requires either REF or software vertex processing 
  167.     // and debugging pixel shaders requires REF.  
  168. #ifdef DEBUG_VS
  169.     if( pDeviceSettings->DeviceType != D3DDEVTYPE_REF )
  170.     {
  171.         pDeviceSettings->BehaviorFlags &= ~D3DCREATE_HARDWARE_VERTEXPROCESSING;
  172.         pDeviceSettings->BehaviorFlags &= ~D3DCREATE_PUREDEVICE;
  173.         pDeviceSettings->BehaviorFlags |= D3DCREATE_SOFTWARE_VERTEXPROCESSING;
  174.     }
  175. #endif
  176. #ifdef DEBUG_PS
  177.     pDeviceSettings->DeviceType = D3DDEVTYPE_REF;
  178. #endif
  179.     // For the first device created if its a REF device, optionally display a warning dialog box
  180.     static bool s_bFirstTime = true;
  181.     if( s_bFirstTime )
  182.     {
  183.         s_bFirstTime = false;
  184.         if( pDeviceSettings->DeviceType == D3DDEVTYPE_REF )
  185.             DXUTDisplaySwitchingToREFWarning();
  186.     }
  187.     return true;
  188. }
  189. //--------------------------------------------------------------------------------------
  190. // This callback function will be called immediately after the Direct3D device has been 
  191. // created, which will happen during application initialization and windowed/full screen 
  192. // toggles. This is the best location to create D3DPOOL_MANAGED resources since these 
  193. // resources need to be reloaded whenever the device is destroyed. Resources created  
  194. // here should be released in the OnDestroyDevice callback. 
  195. //--------------------------------------------------------------------------------------
  196. HRESULT CALLBACK OnCreateDevice( IDirect3DDevice9* pd3dDevice, const D3DSURFACE_DESC* pBackBufferSurfaceDesc, void* pUserContext )
  197. {
  198.     HRESULT hr;
  199.     V_RETURN( g_DialogResourceManager.OnCreateDevice( pd3dDevice ) );
  200.     V_RETURN( g_SettingsDlg.OnCreateDevice( pd3dDevice ) );
  201.     
  202.     // Initialize the font
  203.     V_RETURN( D3DXCreateFont( pd3dDevice, 15, 0, FW_BOLD, 1, FALSE, DEFAULT_CHARSET, 
  204.                          OUT_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE, 
  205.                          L"Arial", &g_pFont ) );
  206.     // Define DEBUG_VS and/or DEBUG_PS to debug vertex and/or pixel shaders with the 
  207.     // shader debugger. Debugging vertex shaders requires either REF or software vertex 
  208.     // processing, and debugging pixel shaders requires REF.  The 
  209.     // D3DXSHADER_FORCE_*_SOFTWARE_NOOPT flag improves the debug experience in the 
  210.     // shader debugger.  It enables source level debugging, prevents instruction 
  211.     // reordering, prevents dead code elimination, and forces the compiler to compile 
  212.     // against the next higher available software target, which ensures that the 
  213.     // unoptimized shaders do not exceed the shader model limitations.  Setting these 
  214.     // flags will cause slower rendering since the shaders will be unoptimized and 
  215.     // forced into software.  See the DirectX documentation for more information about 
  216.     // using the shader debugger.
  217.    /* DWORD dwShaderFlags = D3DXFX_NOT_CLONEABLE;
  218.     #ifdef DEBUG_VS
  219.         dwShaderFlags |= D3DXSHADER_FORCE_VS_SOFTWARE_NOOPT;
  220.     #endif
  221.     #ifdef DEBUG_PS
  222.         dwShaderFlags |= D3DXSHADER_FORCE_PS_SOFTWARE_NOOPT;
  223.     #endif*/
  224.     // Read the D3DX effect file
  225.     //WCHAR str[MAX_PATH];
  226.     //V_RETURN( DXUTFindDXSDKMediaFileCch( str, MAX_PATH, L"EmptyProject.fx" ) );
  227.     //// If this fails, there should be debug output as to 
  228.     //// they the .fx file failed to compile
  229.     //V_RETURN( D3DXCreateEffectFromFile( pd3dDevice, str, NULL, NULL, dwShaderFlags, 
  230.     //                                    NULL, &g_pEffect, NULL ) );
  231.     // Setup the camera's view parameters
  232. g_Camera.SetScalers( 0.01f, 15.0f );
  233. g_Camera.SetRotateButtons( true, false, false );
  234. g_Camera.SetEnablePositionMovement(true);
  235.     D3DXVECTOR3 vecEye(0.0f, 0.0f, -8.0f);
  236.     D3DXVECTOR3 vecAt (0.0f, 0.0f, -0.0f);
  237.     g_Camera.SetViewParams( &vecEye, &vecAt );
  238. //// Setup world matrix
  239. D3DXMATRIX worldMat;
  240. D3DXMatrixIdentity( &worldMat );
  241. pd3dDevice->SetTransform( D3DTS_WORLD, &worldMat );
  242. //粒子系统初始化
  243. BoundingBox boundingBox( D3DXVECTOR3(-4.0f, -4.0f, -4.0f), D3DXVECTOR3(4.0f, 4.0f, 4.0f) );
  244. //第一次只加入50个粒子,之后没渲染一帧增加50个,直至粒子数达到1000
  245. g_pRain = new CRainSystem(&boundingBox, NUMPERBATCH);
  246. LPCTSTR texFileName = L"raindrop.bmp";//纹理图
  247. if(!g_pRain->init(pd3dDevice, texFileName))
  248. {
  249. return false;
  250. }
  251. //粒子系统初始化完毕
  252.     return S_OK;
  253. }
  254. //--------------------------------------------------------------------------------------
  255. // This callback function will be called immediately after the Direct3D device has been 
  256. // reset, which will happen after a lost device scenario. This is the best location to 
  257. // create D3DPOOL_DEFAULT resources since these resources need to be reloaded whenever 
  258. // the device is lost. Resources created here should be released in the OnLostDevice 
  259. // callback. 
  260. //--------------------------------------------------------------------------------------
  261. HRESULT CALLBACK OnResetDevice( IDirect3DDevice9* pd3dDevice, 
  262.                                 const D3DSURFACE_DESC* pBackBufferSurfaceDesc, void* pUserContext )
  263. {
  264.     HRESULT hr;
  265.     V_RETURN( g_DialogResourceManager.OnResetDevice() );
  266.     V_RETURN( g_SettingsDlg.OnResetDevice() );
  267.     if( g_pFont )
  268.         V_RETURN( g_pFont->OnResetDevice() );
  269.     if( g_pEffect )
  270.         V_RETURN( g_pEffect->OnResetDevice() );
  271.     // Create a sprite to help batch calls when drawing many lines of text
  272.     V_RETURN( D3DXCreateSprite( pd3dDevice, &g_pTextSprite ) );
  273.     // Setup the camera's projection parameters
  274.     float fAspectRatio = pBackBufferSurfaceDesc->Width / (FLOAT)pBackBufferSurfaceDesc->Height;
  275.     g_Camera.SetProjParams( D3DX_PI/4, fAspectRatio, /*0.1f, 1000.0f */0.1f, 100.0f );
  276.     g_HUD.SetLocation( pBackBufferSurfaceDesc->Width-170, 0 );
  277.     g_HUD.SetSize( 170, 170 );
  278.     g_SampleUI.SetLocation( pBackBufferSurfaceDesc->Width-170, pBackBufferSurfaceDesc->Height-350 );
  279.     g_SampleUI.SetSize( 170, 300 );
  280.     return S_OK;
  281. }
  282. //--------------------------------------------------------------------------------------
  283. // This callback function will be called once at the beginning of every frame. This is the
  284. // best location for your application to handle updates to the scene, but is not 
  285. // intended to contain actual rendering calls, which should instead be placed in the 
  286. // OnFrameRender callback.  
  287. //--------------------------------------------------------------------------------------
  288. void CALLBACK OnFrameMove( IDirect3DDevice9* pd3dDevice, double fTime, float fElapsedTime, void* pUserContext )
  289. {
  290.     // Update the camera's position based on user input 
  291.     g_Camera.FrameMove( fElapsedTime );
  292. }
  293. //--------------------------------------------------------------------------------------
  294. // This callback function will be called at the end of every frame to perform all the 
  295. // rendering calls for the scene, and it will also be called if the window needs to be 
  296. // repainted. After this function has returned, DXUT will call 
  297. // IDirect3DDevice9::Present to display the contents of the next buffer in the swap chain
  298. //--------------------------------------------------------------------------------------
  299. void CALLBACK OnFrameRender( IDirect3DDevice9* pd3dDevice, double fTime, float fElapsedTime, void* pUserContext )
  300. {
  301.     HRESULT hr;
  302.     D3DXMATRIXA16 mWorld;
  303.     D3DXMATRIXA16 mView;
  304.     D3DXMATRIXA16 mProj;
  305.     D3DXMATRIXA16 mWorldViewProjection;
  306.     
  307.     // If the settings dialog is being shown, then
  308.     // render it instead of rendering the app's scene
  309.     if( g_SettingsDlg.IsActive() )
  310.     {
  311.         g_SettingsDlg.OnRender( fElapsedTime );
  312.         return;
  313.     }
  314.     // Clear the render target and the zbuffer 
  315.     V( pd3dDevice->Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, D3DCOLOR_ARGB(0, 45, 50, 170), 1.0f, 0) );
  316.     // Render the scene
  317.     if( SUCCEEDED( pd3dDevice->BeginScene() ) )
  318.     {
  319.         // Get the projection & view matrix from the camera class
  320.         mWorld = *g_Camera.GetWorldMatrix();
  321.         mProj = *g_Camera.GetProjMatrix();
  322.         mView = *g_Camera.GetViewMatrix();
  323. pd3dDevice->SetTransform( D3DTS_VIEW, &mView );
  324. pd3dDevice->SetTransform( D3DTS_PROJECTION, &mProj );
  325.         mWorldViewProjection = mWorld * mView * mProj;
  326.         // Update the effect's variables.  Instead of using strings, it would 
  327.         // be more efficient to cache a handle to the parameter by calling 
  328.         // ID3DXEffect::GetParameterByName
  329. if( g_pEffect )//加上此判断条件
  330. {
  331. V( g_pEffect->SetMatrix( "g_mWorldViewProjection", &mWorldViewProjection ) );
  332. V( g_pEffect->SetMatrix( "g_mWorld", &mWorld ) );
  333. V( g_pEffect->SetFloat( "g_fTime", (float)fTime ) );
  334. }
  335.  //       DXUT_BeginPerfEvent( DXUT_PERFEVENTCOLOR, L"HUD / Stats" ); // These events are to help PIX identify what the code is doing
  336.         g_pRain->render();
  337. RenderText();
  338.         V( g_HUD.OnRender( fElapsedTime ) );
  339.         V( g_SampleUI.OnRender( fElapsedTime ) );
  340. //        DXUT_EndPerfEvent();
  341.         V( pd3dDevice->EndScene() );
  342.     }
  343. //更新粒子系统
  344. g_pRain->update(/*0.001f**/(fElapsedTime));
  345. //如粒子数未超过总的粒子数--NUMTOTAL,新加入一批粒子
  346. if( NUMTOTAL > g_pRain->getParticleNum() )
  347. {
  348. for(int i=0;i<50;i++)
  349. g_pRain->addParticle();
  350. }
  351. }
  352. //--------------------------------------------------------------------------------------
  353. // Render the help and statistics text. This function uses the ID3DXFont interface for 
  354. // efficient text rendering.
  355. //--------------------------------------------------------------------------------------
  356. void RenderText()
  357. {
  358.     // The helper object simply helps keep track of text position, and color
  359.     // and then it calls pFont->DrawText( m_pSprite, strMsg, -1, &rc, DT_NOCLIP, m_clr );
  360.     // If NULL is passed in as the sprite object, then it will work however the 
  361.     // pFont->DrawText() will not be batched together.  Batching calls will improves performance.
  362.     CDXUTTextHelper txtHelper( g_pFont, g_pTextSprite, 15 );
  363.     // Output statistics
  364.     txtHelper.Begin();
  365.     txtHelper.SetInsertionPos( 5, 5 );
  366.     txtHelper.SetForegroundColor( D3DXCOLOR( 1.0f, 1.0f, 0.0f, 1.0f ) );
  367.     txtHelper.DrawTextLine( DXUTGetFrameStats(true) );
  368.     txtHelper.DrawTextLine( DXUTGetDeviceStats() );
  369. /*
  370.     TODO: add UI text as needed
  371.     txtHelper.SetForegroundColor( D3DXCOLOR( 1.0f, 1.0f, 1.0f, 1.0f ) );
  372.     txtHelper.DrawTextLine( L"Put whatever misc status here" );
  373.     
  374.     // Draw help
  375.     const D3DSURFACE_DESC* pd3dsdBackBuffer = DXUTGetBackBufferSurfaceDesc();
  376.     if( g_bShowHelp )
  377.     {
  378.         txtHelper.SetInsertionPos( 10, pd3dsdBackBuffer->Height-15*6 );
  379.         txtHelper.SetForegroundColor( D3DXCOLOR( 1.0f, 0.75f, 0.0f, 1.0f ) );
  380.         txtHelper.DrawTextLine( L"Controls (F1 to hide):" );
  381.         txtHelper.SetInsertionPos( 40, pd3dsdBackBuffer->Height-15*5 );
  382.         txtHelper.DrawTextLine( L"Quit: ESC" );
  383.     }
  384.     else
  385.     {
  386.         txtHelper.SetInsertionPos( 10, pd3dsdBackBuffer->Height-15*2 );
  387.         txtHelper.SetForegroundColor( D3DXCOLOR( 1.0f, 1.0f, 1.0f, 1.0f ) );
  388.         txtHelper.DrawTextLine( L"Press F1 for help" );
  389.     }
  390. */
  391.     txtHelper.End();
  392. }
  393. //--------------------------------------------------------------------------------------
  394. // Before handling window messages, DXUT passes incoming windows 
  395. // messages to the application through this callback function. If the application sets 
  396. // *pbNoFurtherProcessing to TRUE, then DXUT will not process this message.
  397. //--------------------------------------------------------------------------------------
  398. LRESULT CALLBACK MsgProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, bool* pbNoFurtherProcessing, void* pUserContext )
  399. {
  400.     // Always allow dialog resource manager calls to handle global messages
  401.     // so GUI state is updated correctly
  402.     g_DialogResourceManager.MsgProc( hWnd, uMsg, wParam, lParam );
  403.     if( g_SettingsDlg.IsActive() )
  404.     {
  405.         g_SettingsDlg.MsgProc( hWnd, uMsg, wParam, lParam );
  406.         return 0;
  407.     }
  408.     // Give the dialogs a chance to handle the message first
  409.     *pbNoFurtherProcessing = g_HUD.MsgProc( hWnd, uMsg, wParam, lParam );
  410.     if( *pbNoFurtherProcessing )
  411.         return 0;
  412.     *pbNoFurtherProcessing = g_SampleUI.MsgProc( hWnd, uMsg, wParam, lParam );
  413.     if( *pbNoFurtherProcessing )
  414.         return 0;
  415.     // Pass all remaining windows messages to camera so it can respond to user input
  416.     g_Camera.HandleMessages( hWnd, uMsg, wParam, lParam );
  417.     return 0;
  418. }
  419. //--------------------------------------------------------------------------------------
  420. // As a convenience, DXUT inspects the incoming windows messages for
  421. // keystroke messages and decodes the message parameters to pass relevant keyboard
  422. // messages to the application.  The framework does not remove the underlying keystroke 
  423. // messages, which are still passed to the application's MsgProc callback.
  424. //--------------------------------------------------------------------------------------
  425. void CALLBACK KeyboardProc( UINT nChar, bool bKeyDown, bool bAltDown, void* pUserContext )
  426. {
  427.     if( bKeyDown )
  428.     {
  429.         switch( nChar )
  430.         {
  431.             case VK_F1: g_bShowHelp = !g_bShowHelp; break;
  432.         }
  433.     }
  434. }
  435. //--------------------------------------------------------------------------------------
  436. // Handles the GUI events
  437. //--------------------------------------------------------------------------------------
  438. void CALLBACK OnGUIEvent( UINT nEvent, int nControlID, CDXUTControl* pControl, void* pUserContext )
  439. {
  440.     switch( nControlID )
  441.     {
  442.         case IDC_TOGGLEFULLSCREEN: DXUTToggleFullScreen(); break;
  443.         case IDC_TOGGLEREF:        DXUTToggleREF(); break;
  444.         case IDC_CHANGEDEVICE:     g_SettingsDlg.SetActive( !g_SettingsDlg.IsActive() ); break;
  445.     }
  446. }
  447. //--------------------------------------------------------------------------------------
  448. // This callback function will be called immediately after the Direct3D device has 
  449. // entered a lost state and before IDirect3DDevice9::Reset is called. Resources created
  450. // in the OnResetDevice callback should be released here, which generally includes all 
  451. // D3DPOOL_DEFAULT resources. See the "Lost Devices" section of the documentation for 
  452. // information about lost devices.
  453. //--------------------------------------------------------------------------------------
  454. void CALLBACK OnLostDevice( void* pUserContext )
  455. {
  456.     g_DialogResourceManager.OnLostDevice();
  457.     g_SettingsDlg.OnLostDevice();
  458.     if( g_pFont )
  459.         g_pFont->OnLostDevice();
  460.     if( g_pEffect )
  461.         g_pEffect->OnLostDevice();
  462.     SAFE_RELEASE( g_pTextSprite );
  463. }
  464. //--------------------------------------------------------------------------------------
  465. // This callback function will be called immediately after the Direct3D device has 
  466. // been destroyed, which generally happens as a result of application termination or 
  467. // windowed/full screen toggles. Resources created in the OnCreateDevice callback 
  468. // should be released here, which generally includes all D3DPOOL_MANAGED resources. 
  469. //--------------------------------------------------------------------------------------
  470. void CALLBACK OnDestroyDevice( void* pUserContext )
  471. {
  472. delete g_pRain;
  473.     g_DialogResourceManager.OnDestroyDevice();
  474.     g_SettingsDlg.OnDestroyDevice();
  475.     SAFE_RELEASE( g_pEffect );
  476.     SAFE_RELEASE( g_pFont );
  477. }