1st_dx8.cpp
上传用户:hnchaoyang
上传日期:2022-04-10
资源大小:13k
文件大小:8k
源码类别:

DirextX编程

开发平台:

Visual C++

  1. /*------------------------------------------------------------
  2. MY FIRST C++/DIRECTX PROGRAM - BY SIMON PRICE
  3.   ----------------------------------------------------------*/
  4. // include files
  5. #include <d3dx9.h>
  6. #include <mmsystem.h>
  7. // global variables
  8. LPDIRECT3D8             g_pD3D       = NULL; // pointer to d3d
  9. LPDIRECT3DDEVICE8       g_pD3Ddevice = NULL; // pointer to rendering device
  10. LPDIRECT3DVERTEXBUFFER8 g_pD3Dvb     = NULL; // pointer to vertex buffer
  11. //LPDIRECT3DINDEXBUFFER8  g_pD3Dib     = NULL; // pointer to index buffer
  12. INT                    g_iCur       = 0;    // used to show/hide cursor
  13. // a structure which holds untransformed, lit vertices
  14. struct LVERTEX
  15. {
  16.     FLOAT x, y, z;      // untransformed position
  17.     DWORD color;        // vertex color
  18. };
  19. // describes the vertex format
  20. #define D3DFVF_LVERTEX (D3DFVF_XYZ|D3DFVF_DIFFUSE)
  21. // INITD3D: INITIALIZES DIRECT3D AND THE RENDERING DEVICE
  22. HRESULT InitD3D( HWND hWnd )
  23. {
  24.     // get a pointer to direct3d
  25.     if( NULL == ( g_pD3D = Direct3DCreate8( D3D_SDK_VERSION ) ) )
  26.         return E_FAIL;
  27. // get display mode format
  28.     D3DDISPLAYMODE D3Ddm;
  29.     if( FAILED( g_pD3D->GetAdapterDisplayMode( D3DADAPTER_DEFAULT, &D3Ddm ) ) )
  30.         return E_FAIL;
  31.     // set d3ddevice parameters
  32.     D3DPRESENT_PARAMETERS D3Dpp;
  33.     ZeroMemory( &D3Dpp, sizeof(D3Dpp) );
  34.     //D3Dpp.Windowed = TRUE ;
  35.     D3Dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
  36.     D3Dpp.BackBufferFormat = D3Ddm.Format;
  37. D3Dpp.BackBufferWidth = D3Ddm.Width;
  38. D3Dpp.BackBufferHeight = D3Ddm.Height;
  39.     // create the rendering device
  40.     if( FAILED( g_pD3D->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &D3Dpp, &g_pD3Ddevice ) ) )
  41.     {
  42.         return E_FAIL;
  43.     }
  44.     // turn off culling
  45.     //g_pD3Ddevice->SetRenderState( D3DRS_CULLMODE, D3DCULL_NONE );
  46.     // turn off lighting (vertices will be supplied already lit)
  47.     g_pD3Ddevice->SetRenderState( D3DRS_LIGHTING, FALSE );
  48. // hide the cursor
  49. g_iCur = ShowCursor( 0 );
  50.     return S_OK;
  51. }
  52. // RGB: CREATES A LONG COLOR FROM RED, GREEN AND BLUE COMPONENTS
  53. inline long RGB2long(int Red,int Green,int Blue)
  54. {
  55.     Red*=65536;
  56.     Green*=256;
  57.     return(Red+Green+Blue);
  58. }
  59. // INITGEOMETRY: INITIALIZES GEOMETRY AND VERTEX BUFFER
  60. HRESULT InitGeometry()
  61. {
  62.     // initialize 8 vertices in a cube shape
  63.     LVERTEX Vertices[] =
  64.     {
  65.         { 0.0f,1.0f,0.0f, RGB2long(255,255,255) },
  66.         { 1.0f,-1.0f,-1.0f, RGB2long(0,255,0) },
  67.         { -1.0f,-1.0f,-1.0f, RGB2long(255,0,0) },
  68.         { -0.0f,1.0f,0.0f, RGB2long(255,255,255) },
  69.         { -1.0f,-1.0f,-1.0f, RGB2long(255,0,0) },
  70.         { 0.0f,-1.0f,1.0f, RGB2long(0,0,255) },
  71.         { 0.0f,1.0f,0.0f, RGB2long(255,255,255) },
  72.         { 0.0f,-1.0f,1.0f, RGB2long(0,0,255) },
  73.         { 1.0f,-1.0f,-1.0f, RGB2long(0,255,0) },
  74.         { 0.0f,-1.0f,1.0f, RGB2long(0,0,255) },
  75.         { -1.0f,-1.0f,-1.0f, RGB2long(255,0,0) },
  76.         { 1.0f,-1.0f,-1.0f, RGB2long(0,255,0) },
  77.     };
  78.     // create the vertex buffer
  79.     if( FAILED( g_pD3Ddevice->CreateVertexBuffer( 12*sizeof(LVERTEX), 0, D3DFVF_LVERTEX, D3DPOOL_DEFAULT, &g_pD3Dvb ) ) )
  80.     {
  81.         return E_FAIL;
  82.     }
  83.     // fill the vertex buffer
  84.     VOID* pVertices;
  85.     if( FAILED( g_pD3Dvb->Lock( 0, sizeof(Vertices), (BYTE**)&pVertices, 0 ) ) )
  86.         return E_FAIL;
  87.     memcpy( pVertices, Vertices, sizeof(Vertices) );
  88.     g_pD3Dvb->Unlock();
  89. /* // initialize indices
  90. DWORD Indices[] =
  91. {
  92. 0,1,2,2,1,3,
  93. 4,5,0,0,5,3,
  94. 4,0,6,6,0,2,
  95. 1,2,3,3,5,7,
  96. 5,4,7,7,4,6,
  97. 2,3,6,6,3,7,
  98. };
  99. // create index buffer
  100. if( FAILED( g_pD3Ddevice->CreateIndexBuffer( 36*sizeof(DWORD), D3DUSAGE_SOFTWAREPROCESSING , D3DFMT_INDEX16, D3DPOOL_DEFAULT, &g_pD3Dib ) ) )
  101. return E_FAIL;
  102. // fill index buffer
  103. VOID* pIndices;
  104. if( FAILED( g_pD3Dib->Lock( 0, sizeof(Indices), (BYTE**)&pIndices, 0 ) ) )           
  105. return E_FAIL;
  106. memcpy( pIndices, Indices, sizeof(Vertices) );
  107. g_pD3Dib->Unlock();*/
  108.     return S_OK;
  109. }
  110. // CLEANUP: RELEASES D3D POINTERS
  111. VOID Cleanup()
  112. {
  113. // show the cursor again
  114. g_iCur = ShowCursor( g_iCur );
  115. // release vertex buffer
  116.     if( g_pD3Dvb != NULL )
  117.         g_pD3Dvb->Release();
  118. // release rendering device
  119.     if( g_pD3Ddevice != NULL )
  120.         g_pD3Ddevice->Release();
  121. // release direct3d
  122.     if( g_pD3D != NULL )
  123.         g_pD3D->Release();
  124. }
  125. // SETUPMATRICES: SETS WORLD, VIEW AND PROJECTION MATRICES
  126. VOID SetupMatrices()
  127. {
  128.     // rotate the world about the y axis
  129.     D3DXMATRIX matWorld;
  130.     D3DXMatrixRotationYawPitchRoll( &matWorld, timeGetTime()/450.0f, sin(timeGetTime()/850.0f), 0.0f );
  131.     g_pD3Ddevice->SetTransform( D3DTS_WORLD, &matWorld );
  132. // set camera position
  133.     D3DXMATRIX matView;
  134.     D3DXMatrixLookAtLH( &matView, &D3DXVECTOR3( 0.0f, 3.0f,-2.0f ),
  135.                                   &D3DXVECTOR3( 0.0f, 0.0f, 0.0f ),
  136.                                   &D3DXVECTOR3( 0.0f, 1.0f, 0.0f ) );
  137.     g_pD3Ddevice->SetTransform( D3DTS_VIEW, &matView );
  138. // set projection (includes clip distances, field of view, perspective ratio)
  139.     D3DXMATRIX matProj;
  140.     D3DXMatrixPerspectiveFovLH( &matProj, D3DX_PI/4, 1.0f, 1.0f, 100.0f );
  141.     g_pD3Ddevice->SetTransform( D3DTS_PROJECTION, &matProj );
  142. }
  143. // RENDER: DRAWS THE GEOMETRY IN THE VERTEX BUFFER
  144. VOID Render()
  145. {
  146.     // clear the backbuffer
  147.     g_pD3Ddevice->Clear( 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0,0,0), 1.0f, 0 );
  148.     // begin rendering
  149.     g_pD3Ddevice->BeginScene();
  150.     // setup the world, view, and projection matrices
  151.     SetupMatrices();
  152. // set vertex buffer source for rendering device
  153.     g_pD3Ddevice->SetStreamSource( 0, g_pD3Dvb, sizeof(LVERTEX) );
  154.     // set vertex description
  155. g_pD3Ddevice->SetVertexShader( D3DFVF_LVERTEX );
  156. // set index buffer source for rendering device
  157. //g_pD3Ddevice->SetIndices( g_pD3Dib, 0 );
  158. // draw contents of vertex buffer
  159. //g_pD3Ddevice->DrawIndexedPrimitive( D3DPT_TRIANGLELIST, 0, 4, 0, 4);
  160.     g_pD3Ddevice->DrawPrimitive( D3DPT_TRIANGLELIST, 0, 4 );
  161.     // end rendering
  162.     g_pD3Ddevice->EndScene();
  163.     // present backbuffer contents to the window
  164.     g_pD3Ddevice->Present( NULL, NULL, NULL, NULL );
  165. }
  166. // MSGHANDLER: HANDLES MESSAGES FROM WINDOWS
  167. LRESULT WINAPI MsgHandler( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam )
  168. {
  169. // check which message has been recieved
  170.     switch( msg )
  171.     {
  172. // quit application
  173.         case WM_DESTROY:
  174.             PostQuitMessage( 0 );
  175.             return 0;
  176. case WM_KEYDOWN:
  177.             PostQuitMessage( 0 );
  178.             return 0;
  179.     }
  180. // message not handled
  181.     return DefWindowProc( hWnd, msg, wParam, lParam );
  182. }
  183. // WINMAIN: THE START OF THE PROGRAM
  184. INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR, INT )
  185. {
  186.     // Register the window class
  187.     WNDCLASSEX wc = { sizeof(WNDCLASSEX), CS_CLASSDC, MsgHandler, 0L, 0L, GetModuleHandle(NULL), NULL, NULL, NULL, NULL, "1st_dx8", NULL };
  188.     RegisterClassEx( &wc );
  189.     // create a window
  190.     HWND hWnd = CreateWindow( "1st_dx8", "Si's First C++/DX8 Program!", WS_OVERLAPPEDWINDOW, 100, 100, 500, 500, GetDesktopWindow(), NULL, wc.hInstance, NULL );
  191.     // initialize direct3d
  192.     if( SUCCEEDED( InitD3D( hWnd ) ) )
  193.     {
  194.         // initialize geometry
  195.         if( SUCCEEDED( InitGeometry() ) )
  196.         {
  197.             // show the window
  198.             ShowWindow( hWnd, SW_SHOWDEFAULT );
  199.             UpdateWindow( hWnd );
  200.             // enter the message loop
  201.             MSG msg;
  202.             ZeroMemory( &msg, sizeof(msg) );
  203.             while( msg.message!=WM_QUIT )
  204.             {
  205. // check for message
  206.                 if( PeekMessage( &msg, NULL, 0U, 0U, PM_REMOVE ) )
  207.                 {
  208.                     TranslateMessage( &msg );
  209.                     DispatchMessage( &msg );
  210.                 }
  211.                 else // no messages in queue so render
  212.                     Render();
  213.             }
  214.         }
  215.     }
  216.     // clean up and exit the app
  217.     Cleanup();
  218.     UnregisterClass( "1st_dx8", wc.hInstance );
  219.     return 0;
  220. }