前田稔(Maeda Minoru)の超初心者のプログラム入門
//Global Area MyD3D *myd3d = NULL; HWND g_hWnd = NULL; LPDIRECT3DDEVICE9 g_pDEV = NULL; LPDIRECT3DTEXTURE9 g_pTexture = NULL; bool g_bActive = false; D3DXVECTOR3 ViewForm(0.0f, 0.0f, -5.0f); char imgfile[]= "c:\\data\\test\\ayu.jpg"; |
#define D3DFVF_VERTEX (D3DFVF_XYZ | D3DFVF_DIFFUSE | D3DFVF_TEX1) typedef struct _D3DLVERTEX_ { float x,y,z; // The position D3DCOLOR color; // The color FLOAT tu, tv; // The texture coordinates } D3DMYVERTEX; //四角形の定義 //一個の矩形に6枚貼り付け D3DMYVERTEX vtx1[]= { { -2.2f, 1.0f, 0.0f, 0xffffffff, 0.0f, 0.0f }, //左上 { -0.2f, 1.0f, 0.0f, 0xffffffff, 2.0f, 0.0f }, //右上 { -2.2f, -1.0f, 0.0f, 0xffffffff, 0.0f, 3.0f }, //左下 { -0.2f, -1.0f, 0.0f, 0xffffffff, 2.0f, 3.0f }, //右下 }; //三個の矩形に1枚貼り付け D3DMYVERTEX vtx2[]= { { 2.0f, 1.0f, 0.0f, 0xffffffff, 1.0f, 0.0f }, //右上 { 2.0f, -1.0f, 0.0f, 0xffffffff, 1.0f, 1.0f }, //右下 { 1.0f, 1.0f, 0.0f, 0xffffffff, 0.5f, 0.0f }, //中上 { 1.0f, -1.0f, 0.0f, 0xffffffff, 0.5f, 1.0f }, //中下 { 0.0f, 1.0f, 0.0f, 0xffffffff, 0.0f, 0.0f }, //左上 { 0.0f, -1.0f, 0.0f, 0xffffffff, 0.0f, 1.0f }, //左下 }; |
int WINAPI WinMain(HINSTANCE hInst, HINSTANCE, LPSTR, int) { MSG msg; : : if (!g_hWnd) return FALSE; if (FAILED(InitD3D())) return FALSE; ShowWindow(g_hWnd,SW_SHOWDEFAULT); UpdateWindow(g_hWnd); ZeroMemory(&msg,sizeof(msg)); while(msg.message!=WM_QUIT) { if (PeekMessage(&msg,NULL,0U,0U,PM_REMOVE)) { TranslateMessage(&msg); DispatchMessage(&msg); } } |
LRESULT WINAPI MsgProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam) { switch(msg) { case WM_ACTIVATE: g_bActive= (LOWORD(wParam)!=0); break; case WM_PAINT: Draw(); return 0; case WM_KEYDOWN: switch(wParam) { case VK_ESCAPE: case VK_F12: PostMessage(hWnd,WM_CLOSE,0,0); return 0L; } break; case WM_DESTROY: PostQuitMessage(0); return 0L; } return DefWindowProc(hWnd,msg,wParam,lParam); } |
//デバイス/モード等の初期化 HRESULT InitD3D() { myd3d= new MyD3D(g_hWnd); myd3d->InitD3D(&g_pDEV); // テクスチャ読み込み g_pTexture= myd3d->LoadTexture(imgfile); return S_OK; } |
void Draw(void) { if (!g_pDEV || !g_bActive) return; g_pDEV->Clear(0,NULL,D3DCLEAR_TARGET,D3DCOLOR_XRGB(0,60,80),1.0,0); if (SUCCEEDED(g_pDEV->BeginScene())) { SetupMatrices(); //頂点フォーマットの設定 g_pDEV->SetFVF(D3DFVF_VERTEX); // 描画処理 g_pDEV->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP,2,vtx1,sizeof(D3DMYVERTEX)); g_pDEV->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP,4,vtx2,sizeof(D3DMYVERTEX)); g_pDEV->EndScene(); } g_pDEV->Present(NULL,NULL,NULL,NULL); } |
void SetupMatrices(void) { D3DXMATRIX matView; D3DXMATRIX matProj; RECT rect; GetClientRect(g_hWnd,&rect); //View 座標の設定 D3DXMatrixLookAtLH(&matView,&ViewForm, &D3DXVECTOR3(0.0f,0.0f,0.0f),&D3DXVECTOR3(0.0f,1.0f,0.0f)); g_pDEV->SetTransform(D3DTS_VIEW,&matView); //透視変換の設定 D3DXMatrixPerspectiveFovLH(&matProj,D3DXToRadian(45.0f),(float)rect.right/(float)rect.bottom,1,50); g_pDEV->SetTransform(D3DTS_PROJECTION,&matProj); //Zバッファの設定 g_pDEV->SetRenderState(D3DRS_ZENABLE,D3DZB_FALSE); g_pDEV->SetRenderState(D3DRS_LIGHTING,FALSE); g_pDEV->SetTexture(0,g_pTexture); g_pDEV->SetTextureStageState(0,D3DTSS_COLOROP, D3DTOP_MODULATE); g_pDEV->SetTextureStageState(0,D3DTSS_COLORARG1,D3DTA_TEXTURE); g_pDEV->SetTextureStageState(0,D3DTSS_COLORARG2,D3DTA_DIFFUSE); } |
void Cleanup(void) { SAFE_RELEASE(g_pTexture); SAFE_DELETE(myd3d); } |
前田稔(Maeda Minoru)の超初心者のプログラム入門