加载.X文件 1
来源:互联网 发布:淘宝便宜又好的文具店 编辑:程序博客网 时间:2024/06/04 19:33
-
-
-
- #include <D3DX9.H></D3DX9.H>
-
-
-
-
-
- LPDIRECT3D9 g_pD3D = NULL;
- LPDIRECT3DDEVICE9 g_pd3dDevice = NULL;
-
- LPD3DXMESH g_pMesh =NULL;
- D3DMATERIAL9 *g_pMeshMaterials=NULL;
- LPDIRECT3DTEXTURE9 *g_pMeshTextures=NULL;
- DWORD g_dwNumMaterials=0L;
-
- VOID SetWorldMatrix()
- {
- D3DXMATRIXA16 matWorld;
- D3DXMatrixRotationY(&matWorld,timeGetTime()/1000.0f);
- g_pd3dDevice->SetTransform(D3DTS_WORLD,&matWorld);
-
- }
- VOID SetViewAndProjMatrix()
- {
-
- D3DXVECTOR3 vEyePt(0.0f,10.0f,-20.0f);
- D3DXVECTOR3 vLookatPt(0.0f,0.0f,0.0f);
- D3DXVECTOR3 vUpVec(0.0f,1.0f,0.0f);
- D3DXMATRIXA16 matView;
- D3DXMatrixLookAtLH(&matView,&vEyePt,&vLookatPt,&vUpVec);
- g_pd3dDevice->SetTransform(D3DTS_VIEW,&matView);
-
-
- D3DXMATRIXA16 matProj;
- D3DXMatrixPerspectiveFovLH(&matProj,D3DX_PI/4,1.0f,1.0f,100.0f);
- g_pd3dDevice->SetTransform(D3DTS_PROJECTION,&matProj);
- }
-
-
-
- HRESULT InitD3D( HWND hWnd )
- {
-
- if( NULL == ( g_pD3D = Direct3DCreate9( D3D_SDK_VERSION ) ) )
- return E_FAIL;
-
-
- D3DPRESENT_PARAMETERS d3dpp;
- ZeroMemory( &d3dpp, sizeof(d3dpp) );
- d3dpp.Windowed = TRUE;
- d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
- d3dpp.BackBufferFormat = D3DFMT_UNKNOWN;
- d3dpp.EnableAutoDepthStencil=TRUE;
- d3dpp.AutoDepthStencilFormat=D3DFMT_D16;
-
-
- if( FAILED( g_pD3D->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,
- D3DCREATE_SOFTWARE_VERTEXPROCESSING,
- &d3dpp, &g_pd3dDevice ) ) )
- {
- return E_FAIL;
- }
-
-
- g_pd3dDevice->SetRenderState(D3DRS_AMBIENT,0xffffffff);
-
- SetViewAndProjMatrix();
- return S_OK;
- }
-
-
- void RemovePathFromFileName(LPSTR fullPath,LPWSTR fileName)
- {
-
- WCHAR wszBuf[MAX_PATH];
- MultiByteToWideChar(CP_ACP,0,fullPath,-1,wszBuf,MAX_PATH);
- wszBuf[MAX_PATH-1]=L'/0';
- WCHAR *wszFullPath=wszBuf;
-
- LPWSTR pch=wcsrchr(wszFullPath,'//');
- if(pch)
- lstrcpy(fileName,++pch);
- else
- lstrcpy(fileName,wszFullPath);
- }
-
- HRESULT InitGeometry()
- {
- LPD3DXBUFFER pD3DXMtrlBuffer;
-
- if(FAILED(D3DXLoadMeshFromX(L"airplane.x",D3DXMESH_MANAGED,g_pd3dDevice,NULL,&pD3DXMtrlBuffer,NULL,&g_dwNumMaterials,&g_pMesh)))
- {
- MessageBox(NULL,L"不能找到airplane.x文件",L"mesh",MB_OK);
- return E_FAIL;
- }
-
- D3DXMATERIAL *d3dxMaterials=(D3DXMATERIAL*)pD3DXMtrlBuffer->GetBufferPointer();
- g_pMeshMaterials=new D3DMATERIAL9[g_dwNumMaterials];
- if(g_pMeshMaterials==NULL)
- return E_OUTOFMEMORY;
- g_pMeshTextures=new LPDIRECT3DTEXTURE9[g_dwNumMaterials];
- if(g_pMeshTextures==NULL)
- return E_OUTOFMEMORY;
-
- for(DWORD i=0;i0)
- {
-
- WCHAR filename[256];
- RemovePathFromFileName(d3dxMaterials[i].pTextureFilename,filename);
-
- if(FAILED(D3DXCreateTextureFromFile(g_pd3dDevice,filename,&g_pMeshTextures[i])))
- {
- MessageBox(NULL,L"找不到纹理文件!",L"Mesh",MB_OK);
- }
- }
- }
-
- pD3DXMtrlBuffer->Release();
- return S_OK;
- }
-
-
-
-
-
- VOID Cleanup()
- {
-
- if(g_pMeshMaterials!=NULL)
- delete [] g_pMeshMaterials;
-
- if(g_pMeshTextures)
- {
- for(DWORD i=0;iRelease();
- }
- delete [] g_pMeshTextures;
- }
-
- if(g_pMesh!=NULL)
- g_pMesh->Release();
-
- if( g_pd3dDevice != NULL)
- g_pd3dDevice->Release();
-
-
- if( g_pD3D != NULL)
- g_pD3D->Release();
- }
-
-
-
-
-
- VOID Render()
- {
-
- g_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(0, 0, 170), 1.0f, 0 );
-
-
- if( SUCCEEDED( g_pd3dDevice->BeginScene() ) )
- {
-
- SetWorldMatrix();
-
- for(DWORD i=0;iSetMaterial(&g_pMeshMaterials[i]);
- g_pd3dDevice->SetTexture(0,g_pMeshTextures[i]);
-
- g_pMesh->DrawSubset(i);
- }
-
-
- g_pd3dDevice->EndScene();
- }
-
-
- g_pd3dDevice->Present( NULL, NULL, NULL, NULL );
- }
-
-
-
-
-
- LRESULT WINAPI MsgProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam )
- {
- switch( msg )
- {
- case WM_DESTROY:
- Cleanup();
- PostQuitMessage( 0 );
- return 0;
-
- case WM_PAINT:
- Render();
- ValidateRect( hWnd, NULL );
- return 0;
- }
-
- return DefWindowProc( hWnd, msg, wParam, lParam );
- }
-
-
-
-
-
- INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR, INT )
- {
-
- WNDCLASSEX wc = { sizeof(WNDCLASSEX), CS_CLASSDC, MsgProc, 0L, 0L,
- GetModuleHandle(NULL), NULL, NULL, NULL, NULL,
- L"ClassName", NULL };
- RegisterClassEx( &wc );
-
-
- HWND hWnd = CreateWindow( L"ClassName", L"最简单的Direct3D程序",
- WS_OVERLAPPEDWINDOW, 200, 100, 600, 500,
- NULL, NULL, wc.hInstance, NULL );
-
-
- if( SUCCEEDED( InitD3D( hWnd ) ) )
- {
- if(SUCCEEDED(InitGeometry()))
- {
-
- ShowWindow( hWnd, SW_SHOWDEFAULT );
- UpdateWindow( hWnd );
-
-
- MSG msg;
- ZeroMemory( &msg, sizeof(msg) );
- while( msg.message!=WM_QUIT )
- {
- if( PeekMessage( &msg, NULL, 0U, 0U, PM_REMOVE ) )
- {
- TranslateMessage( &msg );
- DispatchMessage( &msg );
- }
- else
- {
- Render();
- }
- }
- }
- }
- UnregisterClass( L"ClassName", wc.hInstance );
- return 0;
- }