#include "stdafx.h" #define WINDOW_CLASS _T("UGPDX") #define WINDOW_NAME _T("D3D Texture Mapping") #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; LPDIRECT3DVERTEXBUFFER9 g_VertexBuffer = NULL; LPDIRECT3DTEXTURE9 g_Texture = NULL; struct stD3DVertex { float x, y, z; float tu, tv; }; LRESULT WINAPI MsgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch(msg) { case WM_DESTROY: PostQuitMessage(0); return 0; break; case WM_KEYUP: if(wParam == VK_ESCAPE) PostQuitMessage(0); break; } return DefWindowProc(hWnd, msg, wParam, lParam); } int WINAPI WinMain(HINSTANCE hInst, HINSTANCE prevhInst, LPSTR cmdLine, int show) { 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)) { 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 RenderScene(); } } Shutdown(); 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; } if(!InitializeObjects()) return false; return true; } bool InitializeObjects() { stD3DVertex objData[] = { {-3.0f, -4.0f, 0, 0, 1}, {3.0f, -4.0f, 0, 1, 1}, {3.0f, 4.0f, 0, 1, 0}, {3.0f, 4.0f, 0, 1, 0}, {-3.0f, 4.0f, 0,0, 0}, {-3.0f, -4.0f, 0,0, 1} }; if(FAILED(g_D3DDevice->CreateVertexBuffer(sizeof(objData),0, D3DTEXTUREFVF, D3DPOOL_DEFAULT, &g_VertexBuffer, NULL))) return false; void *ptr; if(FAILED(g_VertexBuffer->Lock(0, sizeof(objData), (void**)&ptr, 0))) return false; memcpy(ptr, objData, sizeof(objData)); g_VertexBuffer->Unlock(); if(D3DXCreateTextureFromFile(g_D3DDevice, _T(".\\skybox\\3\\Right3.JPG"), &g_Texture) != D3D_OK) return false; /*g_D3DDevice->SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR); g_D3DDevice->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR);*/ g_D3DDevice->SetRenderState(D3DRS_LIGHTING, FALSE); g_D3DDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_CW); D3DXMatrixPerspectiveFovLH(&g_projection, 45.0f, WINDOW_WIDTH/WINDOW_HEIGHT, 1.0f, 1000.0f); g_D3DDevice->SetTransform(D3DTS_PROJECTION, &g_projection); D3DXVECTOR3 cameraPos(0.0f, 0.0f, -10.0f); D3DXVECTOR3 lookAtPos(0.0f, 0.0f, 0.0f); D3DXVECTOR3 upDir(0.0f, 1.0f, 0.0f); D3DXMatrixLookAtLH(&g_ViewMatrix, &cameraPos, &lookAtPos, &upDir); g_D3DDevice->SetTransform(D3DTS_VIEW, &g_ViewMatrix); return true; } void RenderScene() { g_D3DDevice->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0,0,0), 1.0f, 0); g_D3DDevice->BeginScene(); g_D3DDevice->SetTexture(0, g_Texture); g_D3DDevice->SetStreamSource(0, g_VertexBuffer, 0, sizeof(stD3DVertex)); g_D3DDevice->SetFVF(D3DTEXTUREFVF); g_D3DDevice->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 2); g_D3DDevice->EndScene(); g_D3DDevice->Present(NULL,NULL,NULL,NULL); } void Shutdown() { if(g_D3DDevice != NULL) g_D3DDevice->Release(); g_D3DDevice = NULL; if(g_D3D != NULL) g_D3D->Release(); g_D3D = NULL; if(g_VertexBuffer != NULL) g_VertexBuffer->Release(); g_VertexBuffer = NULL; if(g_Texture != NULL) g_Texture->Release(); g_Texture = NULL; }