direct3d控件

来源:互联网 发布:后氧传感器数据不变 编辑:程序博客网 时间:2024/05/29 12:14
#ifndef __vertexH__#define __vertexH__struct Vertex{Vertex(){}Vertex(float x, float y, float z,float nx, float ny, float nz,float u, float v){_x  = x;  _y  = y;  _z  = z;_nx = nx; _ny = ny; _nz = nz;_u  = u;  _v  = v;}float _x, _y, _z;float _nx, _ny, _nz;float _u, _v; // texture coordinates};#define FVF_VERTEX (D3DFVF_XYZ | D3DFVF_NORMAL | D3DFVF_TEX1)#endif // __vertexH__


//--------------------------------------------------------------------------------------// File: Test.cpp//// Copyright (c) Microsoft Corporation. All rights reserved.//--------------------------------------------------------------------------------------#include "DXUT.h"#include "SDKmisc.h"#include "resource.h"#include "DXUTcamera.h"#include "vertex.h"#include "DXUTgui.h"#include "DXUTSettingsDlg.h"ID3DXFont*                 g_pFont = NULL;          //ID3DXFont字体对象ID3DXSprite*               g_pTextSprite = NULL;    //ID3DXSprite文本精灵对象LPDIRECT3DVERTEXBUFFER9    g_pVB        = NULL;    //顶点缓冲区对象LPDIRECT3DINDEXBUFFER9     g_pIB        =NULL;     //索引缓冲区对象LPDIRECT3DTEXTURE9         g_pTexture   = NULL;    //纹理对象CModelViewerCamera         g_Camera;                  // A model viewing cameraCDXUTDialogResourceManager  g_DialogResourceManager; // manager for shared resources of dialogsCDXUTDialog                 g_HUD;                  // dialog for standard controls//--------------------------------------------------------------------------------------// UI control IDs//--------------------------------------------------------------------------------------#define IDC_TOGGLEFULLSCREEN    1//--------------------------------------------------------------------------------------// Rejects any D3D9 devices that aren't acceptable to the app by returning false//--------------------------------------------------------------------------------------bool CALLBACK IsD3D9DeviceAcceptable( D3DCAPS9* pCaps, D3DFORMAT AdapterFormat, D3DFORMAT BackBufferFormat,                                      bool bWindowed, void* pUserContext ){// Skip backbuffer formats that don't support alpha blendingIDirect3D9* pD3D = DXUTGetD3D9Object();if( FAILED( pD3D->CheckDeviceFormat( pCaps->AdapterOrdinal, pCaps->DeviceType,AdapterFormat, D3DUSAGE_QUERY_POSTPIXELSHADER_BLENDING,D3DRTYPE_TEXTURE, BackBufferFormat ) ) )return false;// No fallback defined by this app, so reject any device that // doesn't support at least ps2.0if( pCaps->PixelShaderVersion < D3DPS_VERSION( 2, 0 ) )return false;return true;}//--------------------------------------------------------------------------------------// Before a device is created, modify the device settings as needed//--------------------------------------------------------------------------------------bool CALLBACK ModifyDeviceSettings( DXUTDeviceSettings* pDeviceSettings, void* pUserContext ){assert( DXUT_D3D9_DEVICE == pDeviceSettings->ver );// Debugging vertex shaders requires either REF or software vertex processing // and debugging pixel shaders requires REF.  #ifdef DEBUG_VSif( pDeviceSettings->d3d9.DeviceType != D3DDEVTYPE_REF ){pDeviceSettings->d3d9.BehaviorFlags &= ~D3DCREATE_HARDWARE_VERTEXPROCESSING;pDeviceSettings->d3d9.BehaviorFlags &= ~D3DCREATE_PUREDEVICE;pDeviceSettings->d3d9.BehaviorFlags |= D3DCREATE_SOFTWARE_VERTEXPROCESSING;}#endif#ifdef DEBUG_PSpDeviceSettings->d3d9.DeviceType = D3DDEVTYPE_REF;#endif// For the first device created if its a REF device, optionally display a warning dialog boxstatic bool s_bFirstTime = true;if( s_bFirstTime ){s_bFirstTime = false;if( pDeviceSettings->d3d9.DeviceType == D3DDEVTYPE_REF )DXUTDisplaySwitchingToREFWarning( pDeviceSettings->ver );}//不采用默认帧率pDeviceSettings->d3d9.pp.PresentationInterval=D3DPRESENT_INTERVAL_IMMEDIATE;    return true;}//--------------------------------------------------------------------------------------// Create any D3D9 resources that will live through a device reset (D3DPOOL_MANAGED)// and aren't tied to the back buffer size//--------------------------------------------------------------------------------------HRESULT CALLBACK OnD3D9CreateDevice( IDirect3DDevice9* pd3dDevice, const D3DSURFACE_DESC* pBackBufferSurfaceDesc,                                     void* pUserContext ){HRESULT hr; V_RETURN( g_DialogResourceManager.OnD3D9CreateDevice( pd3dDevice ) );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 ) );//创建纹理对象if( FAILED( D3DXCreateTextureFromFile( pd3dDevice, L"texture.jpg", &g_pTexture ) ) ){MessageBox(NULL, L"创建纹理失败", L"Texture.exe", MB_OK);return E_FAIL;}pd3dDevice->CreateVertexBuffer(24 * sizeof(Vertex), D3DUSAGE_WRITEONLY,FVF_VERTEX,D3DPOOL_MANAGED,&g_pVB,0);Vertex* pVertices;g_pVB->Lock(0, 0, (void**)&pVertices, 0);// build box// fill in the front face vertex datapVertices[0] = Vertex(-1.0f, -1.0f, -1.0f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f);pVertices[1] = Vertex(-1.0f,  1.0f, -1.0f, 0.0f, 0.0f, -1.0f, 0.0f, 1.0f);pVertices[2] = Vertex( 1.0f,  1.0f, -1.0f, 0.0f, 0.0f, -1.0f, 1.0f, 1.0f);pVertices[3] = Vertex( 1.0f, -1.0f, -1.0f, 0.0f, 0.0f, -1.0f, 1.0f, 0.0f);// fill in the back face vertex datapVertices[4] = Vertex(-1.0f, -1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f);pVertices[5] = Vertex( 1.0f, -1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f);pVertices[6] = Vertex( 1.0f,  1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f);pVertices[7] = Vertex(-1.0f,  1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f);// fill in the top face vertex datapVertices[8]  = Vertex(-1.0f, 1.0f, -1.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f);pVertices[9]  = Vertex(-1.0f, 1.0f,  1.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f);pVertices[10] = Vertex( 1.0f, 1.0f,  1.0f, 0.0f, 1.0f, 0.0f, 1.0f, 1.0f);pVertices[11] = Vertex( 1.0f, 1.0f, -1.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f);// fill in the bottom face vertex datapVertices[12] = Vertex(-1.0f, -1.0f, -1.0f, 0.0f, -1.0f, 0.0f, 0.0f, 0.0f);pVertices[13] = Vertex( 1.0f, -1.0f, -1.0f, 0.0f, -1.0f, 0.0f, 0.0f, 1.0f);pVertices[14] = Vertex( 1.0f, -1.0f,  1.0f, 0.0f, -1.0f, 0.0f, 1.0f, 1.0f);pVertices[15] = Vertex(-1.0f, -1.0f,  1.0f, 0.0f, -1.0f, 0.0f, 1.0f, 0.0f);// fill in the left face vertex datapVertices[16] = Vertex(-1.0f, -1.0f,  1.0f, -1.0f, 0.0f, 0.0f, 0.0f, 0.0f);pVertices[17] = Vertex(-1.0f,  1.0f,  1.0f, -1.0f, 0.0f, 0.0f, 0.0f, 1.0f);pVertices[18] = Vertex(-1.0f,  1.0f, -1.0f, -1.0f, 0.0f, 0.0f, 1.0f, 1.0f);pVertices[19] = Vertex(-1.0f, -1.0f, -1.0f, -1.0f, 0.0f, 0.0f, 1.0f, 0.0f);// fill in the right face vertex datapVertices[20] = Vertex( 1.0f, -1.0f, -1.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f);pVertices[21] = Vertex( 1.0f,  1.0f, -1.0f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f);pVertices[22] = Vertex( 1.0f,  1.0f,  1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f);pVertices[23] = Vertex( 1.0f, -1.0f,  1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f);g_pVB->Unlock();pd3dDevice->CreateIndexBuffer(36 * sizeof(WORD),D3DUSAGE_WRITEONLY,D3DFMT_INDEX16,D3DPOOL_MANAGED,&g_pIB,0);WORD* pIndices = 0;g_pIB->Lock(0, 0, (void**)&pIndices, 0);// fill in the front face index datapIndices[0] = 0; pIndices[1] = 1; pIndices[2] = 2;pIndices[3] = 0; pIndices[4] = 2; pIndices[5] = 3;// fill in the back face index datapIndices[6] = 4; pIndices[7]  = 5; pIndices[8]  = 6;pIndices[9] = 4; pIndices[10] = 6; pIndices[11] = 7;// fill in the top face index datapIndices[12] = 8; pIndices[13] =  9; pIndices[14] = 10;pIndices[15] = 8; pIndices[16] = 10; pIndices[17] = 11;// fill in the bottom face index datapIndices[18] = 12; pIndices[19] = 13; pIndices[20] = 14;pIndices[21] = 12; pIndices[22] = 14; pIndices[23] = 15;// fill in the left face index datapIndices[24] = 16; pIndices[25] = 17; pIndices[26] = 18;pIndices[27] = 16; pIndices[28] = 18; pIndices[29] = 19;// fill in the right face index datapIndices[30] = 20; pIndices[31] = 21; pIndices[32] = 22;pIndices[33] = 20; pIndices[34] = 22; pIndices[35] = 23;g_pIB->Unlock();// 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 );FLOAT fObjectRadius=1;g_Camera.SetRadius( fObjectRadius * 3.0f, fObjectRadius * 0.5f, fObjectRadius * 10.0f );    return S_OK;}//--------------------------------------------------------------------------------------// Create any D3D9 resources that won't live through a device reset (D3DPOOL_DEFAULT) // or that are tied to the back buffer size //--------------------------------------------------------------------------------------HRESULT CALLBACK OnD3D9ResetDevice( IDirect3DDevice9* pd3dDevice, const D3DSURFACE_DESC* pBackBufferSurfaceDesc,                                    void* pUserContext ){HRESULT hr;//恢复字体if( g_pFont )V_RETURN( g_pFont->OnResetDevice() );//创建ID3DXSprite接口对象V_RETURN( D3DXCreateSprite( pd3dDevice, &g_pTextSprite ) );V_RETURN( g_DialogResourceManager.OnD3D9ResetDevice() );g_HUD.SetLocation( pBackBufferSurfaceDesc->Width - 170, 0 );g_HUD.SetSize( 170, 170 );//设置剔出模式为不剔出任何面(正面和反面)pd3dDevice->SetRenderState( D3DRS_CULLMODE, D3DCULL_NONE );//关闭光照处理, 默认情况下启用光照处理pd3dDevice->SetRenderState( D3DRS_LIGHTING, FALSE );//Setup the camera's projection parametersfloat fAspectRatio = pBackBufferSurfaceDesc->Width / ( FLOAT )pBackBufferSurfaceDesc->Height;g_Camera.SetProjParams( D3DX_PI / 2, fAspectRatio, 0.1f, 5000.0f );g_Camera.SetWindow( pBackBufferSurfaceDesc->Width, pBackBufferSurfaceDesc->Height );g_Camera.SetButtonMasks( MOUSE_LEFT_BUTTON, MOUSE_WHEEL, MOUSE_MIDDLE_BUTTON );    return S_OK;}//--------------------------------------------------------------------------------------// Handle updates to the scene.  This is called regardless of which D3D API is used//--------------------------------------------------------------------------------------void CALLBACK OnFrameMove( double fTime, float fElapsedTime, void* pUserContext ){g_Camera.FrameMove( fElapsedTime );}//-----------------------------------------------------------------------------// Desc: 渲染文本//-----------------------------------------------------------------------------void RenderText(){CDXUTTextHelper txtHelper( g_pFont, g_pTextSprite, 15 );//显示当前Direct3D设备状态和渲染帧速率txtHelper.Begin();txtHelper.SetInsertionPos( 5, 5 );txtHelper.SetForegroundColor( D3DXCOLOR( 1.0f, 1.0f, 0.0f, 1.0f ) );txtHelper.DrawTextLine( DXUTGetFrameStats(true) );txtHelper.DrawTextLine( DXUTGetDeviceStats() );txtHelper.End();}//--------------------------------------------------------------------------------------// Render the scene using the D3D9 device//--------------------------------------------------------------------------------------void CALLBACK OnD3D9FrameRender( IDirect3DDevice9* pd3dDevice, double fTime, float fElapsedTime, void* pUserContext ){    HRESULT hr;    // 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 ) );// Set world matrixD3DXMATRIX world = *g_Camera.GetWorldMatrix() ;pd3dDevice->SetTransform(D3DTS_WORLD, &world) ;// Set view matrixD3DXMATRIX view  = *g_Camera.GetViewMatrix() ;pd3dDevice->SetTransform(D3DTS_VIEW, &view) ;// Set projection matrixD3DXMATRIX proj  = *g_Camera.GetProjMatrix() ;pd3dDevice->SetTransform(D3DTS_PROJECTION, &proj) ;    // Render the scene    if( SUCCEEDED( pd3dDevice->BeginScene() ) )    {DXUT_BeginPerfEvent( DXUT_PERFEVENTCOLOR, L"HUD / Stats" ); RenderText();V( g_HUD.OnRender( fElapsedTime ) );DXUT_EndPerfEvent();pd3dDevice->SetTexture( 0, g_pTexture ); //设置纹理pd3dDevice->SetStreamSource(0, g_pVB, 0, sizeof(Vertex));pd3dDevice->SetIndices(g_pIB);pd3dDevice->SetFVF(FVF_VERTEX);pd3dDevice->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, 0, 0,24,0,12);         V( pd3dDevice->EndScene() );    }}//--------------------------------------------------------------------------------------// Handles the GUI events//--------------------------------------------------------------------------------------void CALLBACK OnGUIEvent( UINT nEvent, int nControlID, CDXUTControl* pControl, void* pUserContext ){switch( nControlID ){case IDC_TOGGLEFULLSCREEN:DXUTToggleFullScreen(); break;}}//--------------------------------------------------------------------------------------// Handle messages to the application //--------------------------------------------------------------------------------------LRESULT CALLBACK MsgProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam,                          bool* pbNoFurtherProcessing, void* pUserContext ){// Pass all remaining windows messages to camera so it can respond to user input*pbNoFurtherProcessing = g_DialogResourceManager.MsgProc( hWnd, uMsg, wParam, lParam );if( *pbNoFurtherProcessing )return 0;*pbNoFurtherProcessing = g_HUD.MsgProc( hWnd, uMsg, wParam, lParam );if( *pbNoFurtherProcessing )return 0;g_Camera.HandleMessages( hWnd, uMsg, wParam, lParam );    return 0;}//--------------------------------------------------------------------------------------// Release D3D9 resources created in the OnD3D9ResetDevice callback //--------------------------------------------------------------------------------------void CALLBACK OnD3D9LostDevice( void* pUserContext ){g_DialogResourceManager.OnD3D9LostDevice();if( g_pFont )g_pFont->OnLostDevice();SAFE_RELEASE( g_pTextSprite );}//--------------------------------------------------------------------------------------// Release D3D9 resources created in the OnD3D9CreateDevice callback //--------------------------------------------------------------------------------------void CALLBACK OnD3D9DestroyDevice( void* pUserContext ){ g_DialogResourceManager.OnD3D9DestroyDevice();SAFE_RELEASE( g_pFont );}//--------------------------------------------------------------------------------------// Initialize the app //--------------------------------------------------------------------------------------void InitApp(){g_HUD.Init( &g_DialogResourceManager );g_HUD.SetCallback( OnGUIEvent ); int iY = 10;g_HUD.AddButton( IDC_TOGGLEFULLSCREEN, L"Toggle full screen", 35, iY, 125, 22 );}//--------------------------------------------------------------------------------------// Initialize everything and go into a render loop//--------------------------------------------------------------------------------------INT WINAPI wWinMain( HINSTANCE, HINSTANCE, LPWSTR, 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    DXUTSetCallbackD3D9DeviceAcceptable( IsD3D9DeviceAcceptable );    DXUTSetCallbackD3D9DeviceCreated( OnD3D9CreateDevice );    DXUTSetCallbackD3D9DeviceReset( OnD3D9ResetDevice );    DXUTSetCallbackD3D9FrameRender( OnD3D9FrameRender );    DXUTSetCallbackD3D9DeviceLost( OnD3D9LostDevice );    DXUTSetCallbackD3D9DeviceDestroyed( OnD3D9DestroyDevice );    DXUTSetCallbackDeviceChanging( ModifyDeviceSettings );    DXUTSetCallbackMsgProc( MsgProc );    DXUTSetCallbackFrameMove( OnFrameMove );    // TODO: Perform any application-level initialization hereInitApp();    // Initialize DXUT and create the desired Win32 window and Direct3D device for the application    DXUTInit( true, true ); // Parse the command line and show msgboxes    DXUTSetHotkeyHandling( true, true, true );  // handle the default hotkeys    DXUTSetCursorSettings( true, true ); // Show the cursor and clip it when in full screen    DXUTCreateWindow( L"Test" );    DXUTCreateDevice( true, 640, 480 );    // Start the render loop    DXUTMainLoop();    // TODO: Perform any application-level cleanup here    return DXUTGetExitCode();}


原创粉丝点击