SimpleSample.cpp
资源名称:Direct3D.rar [点击查看]
上传用户:junlon
上传日期:2022-01-05
资源大小:39075k
文件大小:30k
源码类别:
DirextX编程
开发平台:
Visual C++
- //--------------------------------------------------------------------------------------
- // File: SimpleSample.cpp
- //
- // Basic starting point for new Direct3D samples
- //
- // Copyright (c) Microsoft Corporation. All rights reserved.
- //--------------------------------------------------------------------------------------
- #include "dxstdafx.h"
- #include "resource.h"
- #include "object.h"
- #include "plane.h"
- //#define DEBUG_VS // Uncomment this line to debug vertex shaders
- //#define DEBUG_PS // Uncomment this line to debug pixel shaders
- //--------------------------------------------------------------------------------------
- // Global variables
- //--------------------------------------------------------------------------------------
- ID3DXFont* g_pFont = NULL; // Font for drawing text
- ID3DXSprite* g_pTextSprite = NULL; // Sprite for batching draw text calls
- ID3DXEffect* g_pEffect = NULL; // D3DX effect interface
- CModelViewerCamera g_Camera; // A model viewing camera
- bool g_bShowHelp = true; // If true, it renders the UI control text
- CDXUTDialogResourceManager g_DialogResourceManager; // manager for shared resources of dialogs
- CD3DSettingsDlg g_SettingsDlg; // Device settings dialog
- CDXUTDialog g_HUD; // dialog for standard controls
- CDXUTDialog g_SampleUI; // dialog for sample specific controls
- CSpotLight g_spotLight;
- CPlane g_plane( 2, 2, D3DXVECTOR3( -4.0f, -1.0f, -4.0f ), D3DXVECTOR3( 12.4f, -1.0f, 12.4f ) );
- IDirect3DVertexShader9* g_pVertexShader = NULL;
- IDirect3DPixelShader9* g_pPixelShader = NULL;
- //int g_iDevCreate = 0;
- //int g_iDevLost = 0;
- //int g_iDevReset = 0;
- //--------------------------------------------------------------------------------------
- // UI control IDs
- //--------------------------------------------------------------------------------------
- #define IDC_TOGGLEFULLSCREEN 1
- #define IDC_TOGGLEREF 2
- #define IDC_CHANGEDEVICE 3
- //--------------------------------------------------------------------------------------
- // Forward declarations
- //--------------------------------------------------------------------------------------
- bool CALLBACK IsDeviceAcceptable( D3DCAPS9* pCaps, D3DFORMAT AdapterFormat, D3DFORMAT BackBufferFormat, bool bWindowed, void* pUserContext );
- bool CALLBACK ModifyDeviceSettings( DXUTDeviceSettings* pDeviceSettings, const D3DCAPS9* pCaps, void* pUserContext );
- HRESULT CALLBACK OnCreateDevice( IDirect3DDevice9* pd3dDevice, const D3DSURFACE_DESC* pBackBufferSurfaceDesc, void* pUserContext );
- HRESULT CALLBACK OnResetDevice( IDirect3DDevice9* pd3dDevice, const D3DSURFACE_DESC* pBackBufferSurfaceDesc, void* pUserContext );
- void CALLBACK OnFrameMove( IDirect3DDevice9* pd3dDevice, double fTime, float fElapsedTime, void* pUserContext );
- void CALLBACK OnFrameRender( IDirect3DDevice9* pd3dDevice, double fTime, float fElapsedTime, void* pUserContext );
- LRESULT CALLBACK MsgProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, bool* pbNoFurtherProcessing, void* pUserContext );
- void CALLBACK KeyboardProc( UINT nChar, bool bKeyDown, bool bAltDown, void* pUserContext );
- void CALLBACK OnGUIEvent( UINT nEvent, int nControlID, CDXUTControl* pControl, void* pUserContext );
- void CALLBACK OnLostDevice( void* pUserContext );
- void CALLBACK OnDestroyDevice( void* pUserContext );
- void InitApp();
- void RenderText( IDirect3DDevice9* pd3dDevice );
- //--------------------------------------------------------------------------------------
- // Entry point to the program. Initializes everything and goes into a message processing
- // loop. Idle time is used to render the scene.
- //--------------------------------------------------------------------------------------
- INT WINAPI WinMain( HINSTANCE, HINSTANCE, LPSTR, int )
- {
- // Enable run-time memory check for debug builds.
- #if defined(DEBUG) | defined(_DEBUG)
- _CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );
- #endif
- // Set the callback functions. These functions allow DXUT to notify
- // the application about device changes, user input, and windows messages. The
- // callbacks are optional so you need only set callbacks for events you're interested
- // in. However, if you don't handle the device reset/lost callbacks then the sample
- // framework won't be able to reset your device since the application must first
- // release all device resources before resetting. Likewise, if you don't handle the
- // device created/destroyed callbacks then DXUT won't be able to
- // recreate your device resources.
- DXUTSetCallbackDeviceCreated( OnCreateDevice );
- DXUTSetCallbackDeviceReset( OnResetDevice );
- DXUTSetCallbackDeviceLost( OnLostDevice );
- DXUTSetCallbackDeviceDestroyed( OnDestroyDevice );
- DXUTSetCallbackMsgProc( MsgProc );
- DXUTSetCallbackKeyboard( KeyboardProc );
- DXUTSetCallbackFrameRender( OnFrameRender );
- DXUTSetCallbackFrameMove( OnFrameMove );
- // Show the cursor and clip it when in full screen
- DXUTSetCursorSettings( true, true );
- InitApp();
- // Initialize DXUT and create the desired Win32 window and Direct3D
- // device for the application. Calling each of these functions is optional, but they
- // allow you to set several options which control the behavior of the framework.
- DXUTInit( true, true, true ); // Parse the command line, handle the default hotkeys, and show msgboxes
- DXUTCreateWindow( L"SimpleSample" );
- DXUTCreateDevice( D3DADAPTER_DEFAULT, true, 640, 480, IsDeviceAcceptable, ModifyDeviceSettings );
- // Pass control to DXUT for handling the message pump and
- // dispatching render calls. DXUT will call your FrameMove
- // and FrameRender callback when there is idle time between handling window messages.
- DXUTMainLoop();
- // Perform any application-level cleanup here. Direct3D device resources are released within the
- // appropriate callback functions and therefore don't require any cleanup code here.
- return DXUTGetExitCode();
- }
- //--------------------------------------------------------------------------------------
- // Initialize the app
- //--------------------------------------------------------------------------------------
- void InitApp()
- {
- // Initialize dialogs
- g_SettingsDlg.Init( &g_DialogResourceManager );
- g_HUD.Init( &g_DialogResourceManager );
- g_SampleUI.Init( &g_DialogResourceManager );
- g_HUD.SetCallback( OnGUIEvent ); int iY = 10;
- g_HUD.AddButton( IDC_TOGGLEFULLSCREEN, L"Toggle full screen", 35, iY, 125, 22 );
- g_HUD.AddButton( IDC_TOGGLEREF, L"Toggle REF (F3)", 35, iY += 24, 125, 22 );
- g_HUD.AddButton( IDC_CHANGEDEVICE, L"Change device (F2)", 35, iY += 24, 125, 22, VK_F2 );
- g_SampleUI.SetCallback( OnGUIEvent ); iY = 10;
- /*
- TODO: add UI controls as needed
- g_SampleUI.AddComboBox( 19, 35, iY += 24, 125, 22 );
- g_SampleUI.GetComboBox( 19 )->AddItem( L"Text1", NULL );
- g_SampleUI.GetComboBox( 19 )->AddItem( L"Text2", NULL );
- g_SampleUI.GetComboBox( 19 )->AddItem( L"Text3", NULL );
- g_SampleUI.GetComboBox( 19 )->AddItem( L"Text4", NULL );
- g_SampleUI.AddCheckBox( 21, L"Checkbox1", 35, iY += 24, 125, 22 );
- g_SampleUI.AddCheckBox( 11, L"Checkbox2", 35, iY += 24, 125, 22 );
- g_SampleUI.AddRadioButton( 12, 1, L"Radio1G1", 35, iY += 24, 125, 22 );
- g_SampleUI.AddRadioButton( 13, 1, L"Radio2G1", 35, iY += 24, 125, 22 );
- g_SampleUI.AddRadioButton( 14, 1, L"Radio3G1", 35, iY += 24, 125, 22 );
- g_SampleUI.GetRadioButton( 14 )->SetChecked( true );
- g_SampleUI.AddButton( 17, L"Button1", 35, iY += 24, 125, 22 );
- g_SampleUI.AddButton( 18, L"Button2", 35, iY += 24, 125, 22 );
- g_SampleUI.AddRadioButton( 15, 2, L"Radio1G2", 35, iY += 24, 125, 22 );
- g_SampleUI.AddRadioButton( 16, 2, L"Radio2G3", 35, iY += 24, 125, 22 );
- g_SampleUI.GetRadioButton( 16 )->SetChecked( true );
- g_SampleUI.AddSlider( 20, 50, iY += 24, 100, 22 );
- g_SampleUI.GetSlider( 20 )->SetRange( 0, 100 );
- g_SampleUI.GetSlider( 20 )->SetValue( 50 );
- g_SampleUI.AddEditBox( 20, L"Test", 35, iY += 24, 125, 32 );
- */
- }
- //--------------------------------------------------------------------------------------
- // Called during device initialization, this code checks the device for some
- // minimum set of capabilities, and rejects those that don't pass by returning false.
- //--------------------------------------------------------------------------------------
- bool CALLBACK IsDeviceAcceptable( D3DCAPS9* pCaps, D3DFORMAT AdapterFormat,
- D3DFORMAT BackBufferFormat, bool bWindowed, void* pUserContext )
- {
- // Skip backbuffer formats that don't support alpha blending
- IDirect3D9* pD3D = DXUTGetD3DObject();
- if( FAILED( pD3D->CheckDeviceFormat( pCaps->AdapterOrdinal, pCaps->DeviceType,
- AdapterFormat, D3DUSAGE_QUERY_POSTPIXELSHADER_BLENDING,
- D3DRTYPE_TEXTURE, BackBufferFormat ) ) )
- return false;
- return true;
- }
- //--------------------------------------------------------------------------------------
- // This callback function is called immediately before a device is created to allow the
- // application to modify the device settings. The supplied pDeviceSettings parameter
- // contains the settings that the framework has selected for the new device, and the
- // application can make any desired changes directly to this structure. Note however that
- // DXUT will not correct invalid device settings so care must be taken
- // to return valid device settings, otherwise IDirect3D9::CreateDevice() will fail.
- //--------------------------------------------------------------------------------------
- bool CALLBACK ModifyDeviceSettings( DXUTDeviceSettings* pDeviceSettings, const D3DCAPS9* pCaps, void* pUserContext )
- {
- // If device doesn't support HW T&L or doesn't support 1.1 vertex shaders in HW
- // then switch to SWVP.
- if( (pCaps->DevCaps & D3DDEVCAPS_HWTRANSFORMANDLIGHT) == 0 ||
- pCaps->VertexShaderVersion < D3DVS_VERSION(1,1) )
- {
- pDeviceSettings->BehaviorFlags = D3DCREATE_SOFTWARE_VERTEXPROCESSING;
- }
- // Debugging vertex shaders requires either REF or software vertex processing
- // and debugging pixel shaders requires REF.
- #ifdef DEBUG_VS
- if( pDeviceSettings->DeviceType != D3DDEVTYPE_REF )
- {
- pDeviceSettings->BehaviorFlags &= ~D3DCREATE_HARDWARE_VERTEXPROCESSING;
- pDeviceSettings->BehaviorFlags &= ~D3DCREATE_PUREDEVICE;
- pDeviceSettings->BehaviorFlags |= D3DCREATE_SOFTWARE_VERTEXPROCESSING;
- }
- #endif
- #ifdef DEBUG_PS
- pDeviceSettings->DeviceType = D3DDEVTYPE_REF;
- #endif
- // For the first device created if its a REF device, optionally display a warning dialog box
- static bool s_bFirstTime = true;
- if( s_bFirstTime )
- {
- s_bFirstTime = false;
- if( pDeviceSettings->DeviceType == D3DDEVTYPE_REF )
- DXUTDisplaySwitchingToREFWarning();
- }
- return true;
- }
- //--------------------------------------------------------------------------------------
- // This callback function will be called immediately after the Direct3D device has been
- // created, which will happen during application initialization and windowed/full screen
- // toggles. This is the best location to create D3DPOOL_MANAGED resources since these
- // resources need to be reloaded whenever the device is destroyed. Resources created
- // here should be released in the OnDestroyDevice callback.
- //--------------------------------------------------------------------------------------
- HRESULT CALLBACK OnCreateDevice( IDirect3DDevice9* pd3dDevice, const D3DSURFACE_DESC* pBackBufferSurfaceDesc, void* pUserContext )
- {
- // g_iDevCreate ++ ;
- HRESULT hr;
- V_RETURN( g_DialogResourceManager.OnCreateDevice( pd3dDevice ) );
- V_RETURN( g_SettingsDlg.OnCreateDevice( pd3dDevice ) );
- // Initialize the font
- V_RETURN( D3DXCreateFont( pd3dDevice, 15, 0, FW_BOLD, 1, FALSE, DEFAULT_CHARSET,
- OUT_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE,
- L"Arial", &g_pFont ) );
- // 创建台灯模型
- V_RETURN( g_spotLight.OnCreateDevice( pd3dDevice ) );
- // 初始化台灯光
- D3DVECTOR position, direction, upVec;
- position.x = 0.0f; position.y = 0.0f; position.z = 0.0f;
- direction.x = 0.0f; direction.y = -1.0f; direction.z = 0.0f;
- upVec.x = 0.0f; upVec.y = 0.0f; upVec.z = 1.0f;
- g_spotLight.InitLight( position, direction, upVec );
- // 创建平面
- V_RETURN( g_plane.OnCreateDevice( pd3dDevice ) );
- // Define DEBUG_VS and/or DEBUG_PS to debug vertex and/or pixel shaders with the
- // shader debugger. Debugging vertex shaders requires either REF or software vertex
- // processing, and debugging pixel shaders requires REF. The
- // D3DXSHADER_FORCE_*_SOFTWARE_NOOPT flag improves the debug experience in the
- // shader debugger. It enables source level debugging, prevents instruction
- // reordering, prevents dead code elimination, and forces the compiler to compile
- // against the next higher available software target, which ensures that the
- // unoptimized shaders do not exceed the shader model limitations. Setting these
- // flags will cause slower rendering since the shaders will be unoptimized and
- // forced into software. See the DirectX documentation for more information about
- // using the shader debugger.
- DWORD dwShaderFlags = D3DXFX_NOT_CLONEABLE;
- #ifdef DEBUG_VS
- dwShaderFlags |= D3DXSHADER_FORCE_VS_SOFTWARE_NOOPT;
- #endif
- #ifdef DEBUG_PS
- dwShaderFlags |= D3DXSHADER_FORCE_PS_SOFTWARE_NOOPT;
- #endif
- // Read the D3DX effect file
- WCHAR str[MAX_PATH];
- V_RETURN( DXUTFindDXSDKMediaFileCch( str, MAX_PATH, L"SimpleSample.fx" ));
- // If this fails, there should be debug output as to
- // they the .fx file failed to compile
- V_RETURN( D3DXCreateEffectFromFile( pd3dDevice, str, NULL, NULL, dwShaderFlags,
- NULL, &g_pEffect, NULL ) );
- // Setup the camera's view parameters
- D3DXVECTOR3 vecEye(0.0f, 0.0f, -5.0f);
- D3DXVECTOR3 vecAt (0.0f, 0.0f, -0.0f);
- g_Camera.SetViewParams( &vecEye, &vecAt );
- // Create vertex shader
- ID3DXBuffer* pShaderBuffer, *pErrorBuffer;
- hr = D3DXAssembleShaderFromFileA( "vertex.vsd", NULL, NULL, D3DXSHADER_DEBUG, &pShaderBuffer, &pErrorBuffer );
- if( FAILED(hr) )
- {
- MessageBoxA(NULL, "Assemble vertex shader failed!", "Running Error!", MB_OK );
- return hr;
- }
- hr = pd3dDevice->CreateVertexShader( (DWORD*)(pShaderBuffer->GetBufferPointer()), &g_pVertexShader );
- if( FAILED(hr) )
- {
- MessageBoxA(NULL, "Create vertex shader failed!", "Running Error!", MB_OK );
- return hr;
- }
- // Create pixel shader
- hr = D3DXAssembleShaderFromFileA( "pixel.psd", NULL, NULL, D3DXSHADER_DEBUG, &pShaderBuffer, &pErrorBuffer );
- if( FAILED(hr) )
- {
- MessageBoxA(NULL, "Assemble pixel shader failed!", "Running Error!", MB_OK );
- return hr;
- }
- hr = pd3dDevice->CreatePixelShader( (DWORD*)(pShaderBuffer->GetBufferPointer()), &g_pPixelShader );
- if( FAILED(hr) )
- {
- switch (hr)
- {
- case D3DERR_INVALIDCALL:
- break;
- case D3DERR_OUTOFVIDEOMEMORY:
- break;
- case E_OUTOFMEMORY:
- break;
- default:
- break;
- }
- MessageBoxA(NULL, "Create pixel shader failed!", "Running Error!", MB_OK );
- return hr;
- }
- pShaderBuffer->Release();
- return S_OK;
- }
- //--------------------------------------------------------------------------------------
- // This callback function will be called immediately after the Direct3D device has been
- // reset, which will happen after a lost device scenario. This is the best location to
- // create D3DPOOL_DEFAULT resources since these resources need to be reloaded whenever
- // the device is lost. Resources created here should be released in the OnLostDevice
- // callback.
- //--------------------------------------------------------------------------------------
- HRESULT CALLBACK OnResetDevice( IDirect3DDevice9* pd3dDevice,
- const D3DSURFACE_DESC* pBackBufferSurfaceDesc, void* pUserContext )
- {
- // g_iDevReset ++ ;
- HRESULT hr;
- V_RETURN( g_DialogResourceManager.OnResetDevice() );
- V_RETURN( g_SettingsDlg.OnResetDevice() );
- if( g_pFont )
- V_RETURN( g_pFont->OnResetDevice() );
- if( g_pEffect )
- V_RETURN( g_pEffect->OnResetDevice() );
- // Create a sprite to help batch calls when drawing many lines of text
- V_RETURN( D3DXCreateSprite( pd3dDevice, &g_pTextSprite ) );
- // Setup the camera's projection parameters
- float fAspectRatio = pBackBufferSurfaceDesc->Width / (FLOAT)pBackBufferSurfaceDesc->Height;
- g_Camera.SetProjParams( D3DX_PI/4, fAspectRatio, 0.1f, 1000.0f );
- g_Camera.SetWindow( pBackBufferSurfaceDesc->Width, pBackBufferSurfaceDesc->Height );
- g_HUD.SetLocation( pBackBufferSurfaceDesc->Width-170, 0 );
- g_HUD.SetSize( 170, 170 );
- g_SampleUI.SetLocation( pBackBufferSurfaceDesc->Width-170, pBackBufferSurfaceDesc->Height-350 );
- g_SampleUI.SetSize( 170, 300 );
- return S_OK;
- }
- //--------------------------------------------------------------------------------------
- // This callback function will be called once at the beginning of every frame. This is the
- // best location for your application to handle updates to the scene, but is not
- // intended to contain actual rendering calls, which should instead be placed in the
- // OnFrameRender callback.
- //--------------------------------------------------------------------------------------
- void CALLBACK OnFrameMove( IDirect3DDevice9* pd3dDevice, double fTime, float fElapsedTime, void* pUserContext )
- {
- // Update the camera's position based on user input
- g_Camera.FrameMove( fElapsedTime );
- g_spotLight.FrameMove( fElapsedTime );
- }
- //--------------------------------------------------------------------------------------
- // This callback function will be called at the end of every frame to perform all the
- // rendering calls for the scene, and it will also be called if the window needs to be
- // repainted. After this function has returned, DXUT will call
- // IDirect3DDevice9::Present to display the contents of the next buffer in the swap chain
- //--------------------------------------------------------------------------------------
- void CALLBACK OnFrameRender( IDirect3DDevice9* pd3dDevice, double fTime, float fElapsedTime, void* pUserContext )
- {
- HRESULT hr;
- D3DXMATRIXA16 mWorld;
- D3DXMATRIXA16 mView;
- D3DXMATRIXA16 mProj;
- D3DXMATRIXA16 mWorldViewProjection, mWorldViewProjectionT;
- // If the settings dialog is being shown, then
- // render it instead of rendering the app's scene
- if( g_SettingsDlg.IsActive() )
- {
- g_SettingsDlg.OnRender( fElapsedTime );
- return;
- }
- // Clear the render target and the zbuffer
- V( pd3dDevice->Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, D3DCOLOR_ARGB(0, 45, 50, 170), 1.0f, 0) );
- // Render the scene
- if( SUCCEEDED( pd3dDevice->BeginScene() ) )
- {
- // Get the projection & view matrix from the camera class
- mWorld = *g_Camera.GetWorldMatrix();
- mProj = *g_Camera.GetProjMatrix();
- mView = *g_Camera.GetViewMatrix();
- // set transform
- pd3dDevice->SetTransform( D3DTS_VIEW, &mView );
- pd3dDevice->SetTransform( D3DTS_PROJECTION, &mProj );
- mWorldViewProjection = mWorld * mView * mProj;
- // Update the effect's variables. Instead of using strings, it would
- // be more efficient to cache a handle to the parameter by calling
- // ID3DXEffect::GetParameterByName
- V( g_pEffect->SetMatrix( "g_mWorldViewProjection", &mWorldViewProjection ) );
- V( g_pEffect->SetMatrix( "g_mWorld", &mWorld ) );
- V( g_pEffect->SetFloat( "g_fTime", (float)fTime ) );
- DXUT_BeginPerfEvent( DXUT_PERFEVENTCOLOR, L"HUD / Stats" ); // These events are to help PIX identify what the code is doing
- RenderText( pd3dDevice );
- // 设置环境光
- /*D3DLIGHT9 light;
- ZeroMemory( &light, sizeof(light) );
- light.Type = D3DLIGHT_DIRECTIONAL;
- light.Diffuse.r = 1.0f;
- light.Diffuse.g = 1.0f;
- light.Diffuse.b = 1.0f;
- light.Diffuse.a = 1.0f;
- light.Direction.x = light.Direction.y = 1.0f; light.Direction.z = 0.0f;
- pd3dDevice->SetLight( 0, &light );
- pd3dDevice->LightEnable( 0, TRUE );*/
- pd3dDevice->SetRenderState( D3DRS_LIGHTING, TRUE );
- pd3dDevice->SetRenderState( D3DRS_AMBIENT, 0xff202020 );
- // 渲染台灯模型
- g_spotLight.OnRender();
- // 渲染平面
- pd3dDevice->SetLight( 0, &g_spotLight.m_light );
- pd3dDevice->LightEnable( 0, TRUE );
- // Set vertex constants
- D3DXMATRIXA16 planeWorld, planeWorldViewProjection, planeWorldT, planeWorldViewProjectionT;
- D3DXMatrixIdentity( &planeWorld );
- D3DXMatrixTranspose( &planeWorldT, &planeWorld);
- pd3dDevice->SetVertexShaderConstantF( 8, (float*)&planeWorldT, 4 );
- planeWorldViewProjection = planeWorld * mView * mProj;
- D3DXMatrixTranspose( &planeWorldViewProjectionT, &planeWorldViewProjection);
- pd3dDevice->SetVertexShaderConstantF( 0, (float*)&planeWorldViewProjectionT, 4 );
- D3DXVECTOR4 ambientLight( 0.12f, 0.12f, 0.12f, 1.0f );
- pd3dDevice->SetVertexShaderConstantF( 4, (float*)&ambientLight, 1 );
- // Set pixel constants
- D3DVECTOR vecPos = g_spotLight.m_light.Position;
- D3DVECTOR vecDirection = g_spotLight.m_light.Direction;
- D3DXVECTOR4 lightPos( (float)vecPos.x, (float)vecPos.y, (float)vecPos.z, 1.0f );
- pd3dDevice->SetPixelShaderConstantF( 0, (float*)&lightPos, 1 );
- D3DXVECTOR4 lightDirection( (float)vecDirection.x, (float)vecDirection.y, (float)vecDirection.z,
- 0.0f );
- // Normalize the lightDirection vector
- D3DXVec4Normalize( &lightDirection, &lightDirection );
- // Set the spotlight's Phi_angle
- #define Phi_angle 0.3f
- lightDirection.w = 1.0f - Phi_angle;
- pd3dDevice->SetPixelShaderConstantF( 1, (float*)&lightDirection, 1 );
- // Set shader
- pd3dDevice->SetVertexShader(g_pVertexShader);
- pd3dDevice->SetPixelShader( g_pPixelShader);
- g_plane.OnRender( pd3dDevice );
- pd3dDevice->SetVertexShader(NULL);
- pd3dDevice->SetPixelShader(NULL);
- V( g_HUD.OnRender( fElapsedTime ) );
- V( g_SampleUI.OnRender( fElapsedTime ) );
- DXUT_EndPerfEvent();
- V( pd3dDevice->EndScene() );
- }
- }
- //--------------------------------------------------------------------------------------
- // Render the help and statistics text. This function uses the ID3DXFont interface for
- // efficient text rendering.
- //--------------------------------------------------------------------------------------
- void RenderText( IDirect3DDevice9* pd3dDevice )
- {
- // The helper object simply helps keep track of text position, and color
- // and then it calls pFont->DrawText( m_pSprite, strMsg, -1, &rc, DT_NOCLIP, m_clr );
- // If NULL is passed in as the sprite object, then it will work however the
- // pFont->DrawText() will not be batched together. Batching calls will improves performance.
- CDXUTTextHelper txtHelper( g_pFont, g_pTextSprite, 15 );
- WCHAR szDevInfo[60];
- memset( szDevInfo, 0, 120 );
- // Output statistics
- txtHelper.Begin();
- txtHelper.SetInsertionPos( 5, 5 );
- txtHelper.SetForegroundColor( D3DXCOLOR( 1.0f, 1.0f, 0.0f, 1.0f ) );
- txtHelper.DrawTextLine( DXUTGetFrameStats(true) );
- txtHelper.DrawTextLine( DXUTGetDeviceStats() );
- /*memset( szDevInfo, 0, 120 );
- wsprintf( szDevInfo, L"Ever create device %d times", g_iDevCreate );
- txtHelper.DrawTextLine( szDevInfo );
- memset( szDevInfo, 0, 120 );
- wsprintf( szDevInfo, L"Ever lost device %d times", g_iDevLost );
- txtHelper.DrawTextLine( szDevInfo );
- memset( szDevInfo, 0, 120 );
- wsprintf( szDevInfo, L"Ever reset device %d times", g_iDevReset );
- txtHelper.DrawTextLine( szDevInfo );
- memset( szDevInfo, 0, 120 );
- wsprintf( szDevInfo, L"the value of pd3dDevice is %x", (int)pd3dDevice );
- txtHelper.DrawTextLine( szDevInfo );*/
- /*static int addDevice = 0;
- memset( szDevInfo, 0, 120 );
- if( addDevice != 0 )
- {
- if( addDevice == (int)pd3dDevice )
- wsprintf( szDevInfo, L"Device never changed");
- else
- wsprintf( szDevInfo, L"Device ever changed");
- txtHelper.DrawTextLine( szDevInfo );
- }
- addDevice = (int)pd3dDevice;*/
- /*
- TODO: add UI text as needed
- txtHelper.SetForegroundColor( D3DXCOLOR( 1.0f, 1.0f, 1.0f, 1.0f ) );
- txtHelper.DrawTextLine( L"Put whatever misc status here" );
- // Draw help
- const D3DSURFACE_DESC* pd3dsdBackBuffer = DXUTGetBackBufferSurfaceDesc();
- if( g_bShowHelp )
- {
- txtHelper.SetInsertionPos( 10, pd3dsdBackBuffer->Height-15*6 );
- txtHelper.SetForegroundColor( D3DXCOLOR( 1.0f, 0.75f, 0.0f, 1.0f ) );
- txtHelper.DrawTextLine( L"Controls (F1 to hide):" );
- txtHelper.SetInsertionPos( 40, pd3dsdBackBuffer->Height-15*5 );
- txtHelper.DrawTextLine( L"Quit: ESC" );
- }
- else
- {
- txtHelper.SetInsertionPos( 10, pd3dsdBackBuffer->Height-15*2 );
- txtHelper.SetForegroundColor( D3DXCOLOR( 1.0f, 1.0f, 1.0f, 1.0f ) );
- txtHelper.DrawTextLine( L"Press F1 for help" );
- }
- */
- txtHelper.End();
- }
- //--------------------------------------------------------------------------------------
- // Before handling window messages, DXUT passes incoming windows
- // messages to the application through this callback function. If the application sets
- // *pbNoFurtherProcessing to TRUE, then DXUT will not process this message.
- //--------------------------------------------------------------------------------------
- LRESULT CALLBACK MsgProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, bool* pbNoFurtherProcessing, void* pUserContext )
- {
- // Always allow dialog resource manager calls to handle global messages
- // so GUI state is updated correctly
- *pbNoFurtherProcessing = g_DialogResourceManager.MsgProc( hWnd, uMsg, wParam, lParam );
- if( *pbNoFurtherProcessing )
- return 0;
- if( g_SettingsDlg.IsActive() )
- {
- g_SettingsDlg.MsgProc( hWnd, uMsg, wParam, lParam );
- return 0;
- }
- // Give the dialogs a chance to handle the message first
- *pbNoFurtherProcessing = g_HUD.MsgProc( hWnd, uMsg, wParam, lParam );
- if( *pbNoFurtherProcessing )
- return 0;
- *pbNoFurtherProcessing = g_SampleUI.MsgProc( hWnd, uMsg, wParam, lParam );
- if( *pbNoFurtherProcessing )
- return 0;
- // Pass all remaining windows messages to camera so it can respond to user input
- g_Camera.HandleMessages( hWnd, uMsg, wParam, lParam );
- g_spotLight.HandleMessages( hWnd, uMsg, wParam, lParam );
- return 0;
- }
- //--------------------------------------------------------------------------------------
- // As a convenience, DXUT inspects the incoming windows messages for
- // keystroke messages and decodes the message parameters to pass relevant keyboard
- // messages to the application. The framework does not remove the underlying keystroke
- // messages, which are still passed to the application's MsgProc callback.
- //--------------------------------------------------------------------------------------
- void CALLBACK KeyboardProc( UINT nChar, bool bKeyDown, bool bAltDown, void* pUserContext )
- {
- if( bKeyDown )
- {
- switch( nChar )
- {
- case VK_F1: g_bShowHelp = !g_bShowHelp; break;
- }
- }
- }
- //--------------------------------------------------------------------------------------
- // Handles the GUI events
- //--------------------------------------------------------------------------------------
- void CALLBACK OnGUIEvent( UINT nEvent, int nControlID, CDXUTControl* pControl, void* pUserContext )
- {
- switch( nControlID )
- {
- case IDC_TOGGLEFULLSCREEN: DXUTToggleFullScreen(); break;
- case IDC_TOGGLEREF: DXUTToggleREF(); break;
- case IDC_CHANGEDEVICE: g_SettingsDlg.SetActive( !g_SettingsDlg.IsActive() ); break;
- }
- }
- //--------------------------------------------------------------------------------------
- // This callback function will be called immediately after the Direct3D device has
- // entered a lost state and before IDirect3DDevice9::Reset is called. Resources created
- // in the OnResetDevice callback should be released here, which generally includes all
- // D3DPOOL_DEFAULT resources. See the "Lost Devices" section of the documentation for
- // information about lost devices.
- //--------------------------------------------------------------------------------------
- void CALLBACK OnLostDevice( void* pUserContext )
- {
- // g_iDevLost ++ ;
- g_DialogResourceManager.OnLostDevice();
- g_SettingsDlg.OnLostDevice();
- if( g_pFont )
- g_pFont->OnLostDevice();
- if( g_pEffect )
- g_pEffect->OnLostDevice();
- SAFE_RELEASE( g_pTextSprite );
- }
- //--------------------------------------------------------------------------------------
- // This callback function will be called immediately after the Direct3D device has
- // been destroyed, which generally happens as a result of application termination or
- // windowed/full screen toggles. Resources created in the OnCreateDevice callback
- // should be released here, which generally includes all D3DPOOL_MANAGED resources.
- //--------------------------------------------------------------------------------------
- void CALLBACK OnDestroyDevice( void* pUserContext )
- {
- g_DialogResourceManager.OnDestroyDevice();
- g_SettingsDlg.OnDestroyDevice();
- g_spotLight.OnDestroyDevice();
- g_plane.OnDestroyDevice();
- SAFE_RELEASE( g_pVertexShader );
- SAFE_RELEASE( g_pPixelShader );
- SAFE_RELEASE( g_pEffect );
- SAFE_RELEASE( g_pFont );
- }