#include #include #include #define THROW_ERROR_AND_EXIT(x) { \ MessageBox(0,x,0,0); \ return -1; \ } LRESULT CALLBACK WndProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam ) { // Handle close event switch( msg ) { case WM_DESTROY: PostQuitMessage( 0 ); return 0; } return DefWindowProc( hWnd, msg, wParam, lParam ); } int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { // Registering class WNDCLASSEX wcex; wcex.cbSize = sizeof(WNDCLASSEX); wcex.style= CS_HREDRAW | CS_VREDRAW; wcex.lpfnWndProc= (WNDPROC)WndProc; wcex.cbClsExtra= 0; wcex.cbWndExtra= 0; wcex.hInstance= hInstance; wcex.hIcon= 0; wcex.hCursor= LoadCursor(NULL, IDC_ARROW); wcex.hbrBackground= (HBRUSH)(COLOR_WINDOW+1); wcex.lpszMenuName= 0; wcex.lpszClassName= "MyMeshViewer"; wcex.hIconSm= 0; RegisterClassEx(&wcex); // Creating Window HWND hWnd = CreateWindow("MyMeshViewer", "MyMeshViewer", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL); // Creating Direct3D object LPDIRECT3D9 d3dObject=NULL; LPDIRECT3DDEVICE9 d3dDevice=NULL; d3dObject=Direct3DCreate9(D3D_SDK_VERSION); // Creating Direct3D device if(NULL == d3dObject) THROW_ERROR_AND_EXIT("NULL == d3dObject"); D3DPRESENT_PARAMETERS presParams; ZeroMemory(&presParams,sizeof(presParams)); presParams.Windowed=TRUE; presParams.SwapEffect=D3DSWAPEFFECT_DISCARD; presParams.BackBufferFormat=D3DFMT_UNKNOWN; presParams.PresentationInterval=D3DPRESENT_INTERVAL_ONE; HRESULT hr=d3dObject->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,hWnd, D3DCREATE_HARDWARE_VERTEXPROCESSING, &presParams, &d3dDevice); if(FAILED(hr)) THROW_ERROR_AND_EXIT("d3dObject->CreateDevice"); // Loading the mesh LPD3DXBUFFER materialBuffer = NULL; DWORD numMaterials = 0; LPD3DXMESH mesh = NULL; hr=D3DXLoadMeshFromX("d:\\temp\\tiger.x", D3DXMESH_SYSTEMMEM, d3dDevice, NULL, &materialBuffer,NULL, &numMaterials, &mesh ); if(FAILED(hr)) THROW_ERROR_AND_EXIT("hr=D3DXLoadMeshFromX"); // Loading the material buffer D3DXMATERIAL* d3dxMaterials = (D3DXMATERIAL*)materialBuffer->GetBufferPointer(); // Holding material and texture pointers D3DMATERIAL9 *meshMaterials = new D3DMATERIAL9[numMaterials]; LPDIRECT3DTEXTURE9 *meshTextures = new LPDIRECT3DTEXTURE9[numMaterials]; // Filling material and texture arrays for (DWORD i=0; iRelease(); // Show Window ShowWindow(hWnd, nCmdShow); UpdateWindow(hWnd); // Handle messages MSG msg; ZeroMemory( &msg, sizeof(msg) ); while( msg.message!=WM_QUIT ) { if( PeekMessage( &msg, NULL, 0U, 0U, PM_REMOVE ) ) { TranslateMessage( &msg ); DispatchMessage( &msg ); } else { // Rendering d3dDevice->Clear(0,NULL,D3DCLEAR_TARGET, D3DCOLOR_XRGB(255,255,255),1.0f,0); // Turn on wireframe mode d3dDevice->SetRenderState(D3DRS_FILLMODE,D3DFILL_WIREFRAME); d3dDevice->BeginScene(); for (DWORD i=0; iSetMaterial(&meshMaterials[i]); d3dDevice->SetTexture(0,meshTextures[i]); // Draw the mesh subset mesh->DrawSubset( i ); } d3dDevice->EndScene(); d3dDevice->Present(NULL, NULL, NULL, NULL); Sleep(0); } } return (int)msg.wParam; }