#include<d3d9.h> #include<d3dx9.h> #define WINDOW_CLASS "UGPDX" #define WINDOW_NAME "Built-in Direct3D Shapes" #define WINDOW_WIDTH 640 #define WINDOW_HEIGHT 480 bool InitializeD3D(HWND hWnd, bool fullscreen); bool InitializeObjects(); void RenderScene(); void Shutdown(); LPDIRECT3D9 g_D3D = NULL; LPDIRECT3DDEVICE9 g_D3DDevice = NULL; D3DXMATRIX g_projection; D3DXMATRIX g_ViewMatrix; D3DXMATRIX g_WorldMatrix; LPD3DXMESH g_teapot = NULL; LPD3DXMESH g_cube = NULL; LPD3DXMESH g_sphere = NULL; LPD3DXMESH g_torus = NULL; LRESULT WINAPI MsgProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp) { switch(msg) { case WM_DESTROY: PostQuitMessage(0); return 0; break; case WM_KEYUP: if(wp == VK_ESCAPE) PostQuitMessage(0); break; } return DefWindowProc(hWnd, msg, wp, lp); } int WINAPI WinMain(HINSTANCE hInst, HINSTANCE ph, LPSTR cmd, int s) { WNDCLASSEX wc = { sizeof(WNDCLASSEX), CS_CLASSDC, MsgProc, 0L, 0L, GetModuleHandle(NULL), NULL, NULL, NULL, NULL, WINDOW_CLASS, NULL }; RegisterClassEx(&wc); HWND hWnd = CreateWindow(WINDOW_CLASS, WINDOW_NAME, WS_OVERLAPPEDWINDOW, 100, 100, WINDOW_WIDTH, WINDOW_HEIGHT, GetDesktopWindow(), NULL, wc.hInstance, NULL); if(InitializeD3D(hWnd, false)) { // Show the window ShowWindow(hWnd, SW_SHOWDEFAULT); UpdateWindow(hWnd); // Enter the message loop MSG msg; ZeroMemory(&msg, sizeof(msg)); while(msg.message != WM_QUIT) { if(PeekMessage(&msg, NULL, 0U, 0U, PM_REMOVE)) { TranslateMessage(&msg); DispatchMessage(&msg); } else RenderScene(); } } // Release any and all resources. Shutdown(); // Unregister our window. UnregisterClass(WINDOW_CLASS, wc.hInstance); return 0; } bool InitializeD3D(HWND hWnd, bool fullscreen) { D3DDISPLAYMODE displayMode; g_D3D = Direct3DCreate9(D3D_SDK_VERSION); if(g_D3D == NULL) return false; if(FAILED(g_D3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &displayMode))) return false; D3DPRESENT_PARAMETERS d3dpp; ZeroMemory(&d3dpp, sizeof(d3dpp)); if(fullscreen) { d3dpp.Windowed = FALSE; d3dpp.BackBufferWidth = WINDOW_WIDTH; d3dpp.BackBufferHeight = WINDOW_HEIGHT; } else d3dpp.Windowed = TRUE; d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; d3dpp.BackBufferFormat = displayMode.Format; if(FAILED(g_D3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &g_D3DDevice))) return false; D3DXMatrixPerspectiveFovLH(&g_projection, 45.0f, WINDOW_WIDTH/WINDOW_HEIGHT, 0.1f, 1000.0f); g_D3DDevice->SetTransform(D3DTS_PROJECTION, &g_projection); if(!InitializeObjects()) return false; return true; } bool InitializeObjects() { g_D3DDevice->SetRenderState(D3DRS_LIGHTING,false); if(FAILED(D3DXCreateTeapot(g_D3DDevice, &g_teapot, NULL))) return false; if(FAILED(D3DXCreateBox(g_D3DDevice, 2, 2, 2, &g_cube, NULL))) return false; if(FAILED(D3DXCreateSphere(g_D3DDevice, 1.5, 25, 25, &g_sphere, NULL))) return false; if(FAILED(D3DXCreateTorus(g_D3DDevice, 0.5f, 1.2f, 25, 25, &g_torus, NULL))) return false; D3DXVECTOR3 cameraPos(0.0f, 0.0f, -8.0f); D3DXVECTOR3 lookAtPos(0.0f, 0.0f, 0.0f); D3DXVECTOR3 upDir(0.0f, 1.0f, 0.0f); D3DXMatrixLookAtLH(&g_ViewMatrix, &cameraPos, &lookAtPos, &upDir); return true; } void RenderScene() { g_D3DDevice->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0,0,0), 1.0f, 0); g_D3DDevice->BeginScene(); g_D3DDevice->SetTransform(D3DTS_VIEW, &g_ViewMatrix); D3DXMatrixTranslation(&g_WorldMatrix, 2.0f, -2.0, 0.0f); g_D3DDevice->SetTransform(D3DTS_WORLD, &g_WorldMatrix); g_teapot->DrawSubset(0); D3DXMatrixTranslation(&g_WorldMatrix, -2.0f, -2.0, 0.0f); g_D3DDevice->SetTransform(D3DTS_WORLD, &g_WorldMatrix); g_cube->DrawSubset(0); D3DXMatrixTranslation(&g_WorldMatrix, 2.0f, 2.0, 0.0f); g_D3DDevice->SetTransform(D3DTS_WORLD, &g_WorldMatrix); g_sphere->DrawSubset(0); D3DXMatrixTranslation(&g_WorldMatrix, -2.0f, 2.0, 0.0f); g_D3DDevice->SetTransform(D3DTS_WORLD, &g_WorldMatrix); g_torus->DrawSubset(0); g_D3DDevice->EndScene(); g_D3DDevice->Present(NULL, NULL, NULL, NULL); } void Shutdown() { if(g_D3DDevice != NULL) g_D3DDevice->Release(); if(g_D3D != NULL) g_D3D->Release(); if(g_teapot != NULL) { g_teapot->Release(); g_teapot = NULL; } if(g_cube != NULL) { g_cube->Release(); g_cube = NULL; } if(g_sphere != NULL) { g_sphere->Release(); g_sphere = NULL; } if(g_torus != NULL) { g_torus->Release(); g_torus = NULL; } }