0001: // ---------------------------------------------------------------------------- 0002: // 0003: // main.cpp - ウィンドウズメイン部分 0004: // 0005: // Copyright (c) 2001 if (if@edokko.com) 0006: // All Rights Reserved. 0007: // 0008: // ---------------------------------------------------------------------------- 0009: #define STRICT 0010: 0011: #include <windows.h> 0012: #include <d3d8.h> 0013: #include <d3dx8.h> 0014: #include "main.h" 0015: #include "draw.h" 0016: 0017: // ---------------------------------------------------------------------------- 0018: // オブジェクト 0019: // ---------------------------------------------------------------------------- 0020: static LPDIRECT3D8 s_lpD3D = NULL; 0021: static LPDIRECT3DDEVICE8 s_lpD3DDEV = NULL; 0022: static D3DPRESENT_PARAMETERS s_d3dpp; 0023: 0024: static bool s_end; // 終了フラグ 0025: 0026: // ---------------------------------------------------------------------------- 0027: // プロトタイプ宣言 0028: // ---------------------------------------------------------------------------- 0029: int PASCAL WinMain(HINSTANCE hInst,HINSTANCE hPrev,char *CmdLine,int CmdShow); 0030: LRESULT CALLBACK MsgProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam); 0031: HRESULT InitD3D( HWND hWnd ); // DirectX の初期化 0032: 0033: // ---------------------------------------------------------------------------- 0034: // 外部関数 0035: // ---------------------------------------------------------------------------- 0036: 0037: // ---------------------------------------------------------------------------- 0038: // 関数 0039: // ---------------------------------------------------------------------------- 0040: // ---------------------------------------------------------------------------- 0041: // Name: WinMain() 0042: // Desc: Windows アプリケーションはここから始まる 0043: //----------------------------------------------------------------------------- 0044: int PASCAL WinMain(HINSTANCE hInst,HINSTANCE hPrev,char *CmdLine,int CmdShow) 0045: { 0046: s_end = 0; 0047: 0048: // ウインドウの作成 0049: RECT rect; 0050: SetRect(&rect, 0, 0, WIDTH, HEIGHT); 0051: DWORD style = (FULLSCREEN) ? WS_POPUP :(WS_CAPTION|WS_SYSMENU|WS_BORDER|WS_MINIMIZEBOX); 0052: AdjustWindowRect(&rect, style, FALSE); // ウィンドウスタイルを設定したときの、ウィンドウの大きさを調べる 0053: int width = rect.right - rect.left; 0054: int height = rect.bottom - rect.top; 0055: 0056: WNDCLASS wc; 0057: ZeroMemory(&wc, sizeof(WNDCLASS)); 0058: wc.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH); 0059: wc.hCursor = LoadCursor(NULL, IDC_ARROW); 0060: wc.hInstance = hInst; 0061: wc.lpfnWndProc = MsgProc; 0062: wc.lpszClassName = CAPTION; 0063: if(RegisterClass(&wc) == 0) return 0; //ウィンドウ作成に使用できる新しいウィンドウクラスを作成する。 0064: 0065: HWND hWnd = CreateWindow(CAPTION // 登録されているクラス名 0066: ,CAPTION // ウィンドウ名 0067: ,style // ウィンドウスタイル 0068: ,CW_USEDEFAULT // ウィンドウの横方向の位置 0069: ,CW_USEDEFAULT // ウィンドウの縦方向の位置 0070: ,width // ウィンドウの幅 0071: ,height // ウィンドウの高さ 0072: ,NULL // 親ウィンドウまたはオーナーウィンドウのハンドル 0073: ,NULL // メニューハンドルまたは子ウィンドウ ID 0074: ,hInst // アプリケーションインスタンスのハンドル 0075: ,NULL // ウィンドウ作成データ 0076: ); 0077: if(hWnd == NULL) return 0; 0078: 0079: // Direct3D の初期化 0080: if(SUCCEEDED(InitD3D(hWnd))){ 0081: 0082: if(FAILED(InitRender(s_lpD3DDEV))) s_end = true; 0083: 0084: ShowWindow(hWnd, SW_SHOW); 0085: UpdateWindow(hWnd); 0086: 0087: // メインループ 0088: MSG msg; 0089: while (!s_end) 0090: { 0091: if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)){ 0092: // メッセージの処理 0093: TranslateMessage(&msg); 0094: DispatchMessage(&msg); 0095: }else{ 0096: // Direct3D の描画 0097: // バックバッファと Z バッファをクリア 0098: // s_lpD3DDEV->Clear(0,NULL,D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER,D3DCOLOR_XRGB(0,0,0),1.0f,0); 0099: // シーン開始 0100: s_lpD3DDEV->BeginScene(); 0101: 0102: Render(s_lpD3DDEV); // 描画などの処理 0103: 0104: // シーン終了 0105: s_lpD3DDEV->EndScene(); 0106: if (FAILED(s_lpD3DDEV->Present(NULL,NULL,NULL,NULL))) 0107: s_lpD3DDEV->Reset(&s_d3dpp);// バックバッファをプライマリバッファにコピー 0108: } 0109: } 0110: } 0111: 0112: // 終了 0113: CleanRender(s_lpD3DDEV); 0114: RELEASE(s_lpD3DDEV); 0115: RELEASE(s_lpD3D); 0116: 0117: return 0; 0118: } 0119: // ---------------------------------------------------------------------------- 0120: // Name: MsgProc() 0121: // Desc: メインウインドウのイベントを処理する 0122: //----------------------------------------------------------------------------- 0123: LRESULT CALLBACK MsgProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam) 0124: { 0125: switch (msg){ 0126: case WM_KEYDOWN: // 何かキーが押された 0127: case WM_CLOSE: // ×ボタンを押した 0128: s_end = true; 0129: return 1; 0130: break; 0131: default: 0132: break; 0133: } 0134: return DefWindowProc(hWnd,msg,wParam,lParam); 0135: } 0136: //----------------------------------------------------------------------------- 0137: // Name: InitD3D() 0138: // Desc: Direct3D の初期化 0139: //----------------------------------------------------------------------------- 0140: HRESULT InitD3D( HWND hWnd ) 0141: { 0142: // Direct3D オブジェクトを作成 0143: if (NULL == (s_lpD3D = Direct3DCreate8(D3D_SDK_VERSION))){ 0144: MessageBox(NULL,"Direct3D の作成に失敗しました。",CAPTION,MB_OK | MB_ICONSTOP); 0145: return E_FAIL; 0146: } 0147: 0148: // 現在の画面モードを取得 0149: D3DDISPLAYMODE d3ddm; 0150: if( FAILED( s_lpD3D->GetAdapterDisplayMode( D3DADAPTER_DEFAULT, &d3ddm ) ) ) return E_FAIL; 0151: // ビデオカードの能力を調べる 0152: D3DCAPS8 caps; 0153: s_lpD3D->GetDeviceCaps(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, &caps); 0154: 0155: // Direct3D 初期化パラメータの設定 0156: ZeroMemory(&s_d3dpp, sizeof(D3DPRESENT_PARAMETERS)); 0157: 0158: s_d3dpp.BackBufferCount = 1; 0159: if (FULLSCREEN){ 0160: s_d3dpp.Windowed = FALSE; 0161: s_d3dpp.BackBufferWidth = WIDTH; 0162: s_d3dpp.BackBufferHeight = HEIGHT; 0163: }else{ 0164: s_d3dpp.Windowed = TRUE; 0165: s_d3dpp.BackBufferWidth = WIDTH; 0166: s_d3dpp.BackBufferHeight = HEIGHT; 0167: } 0168: // ウインドウ : 現在の画面モードを使用 0169: s_d3dpp.BackBufferFormat = d3ddm.Format; 0170: s_d3dpp.MultiSampleType = D3DMULTISAMPLE_NONE; 0171: s_d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; 0172: s_d3dpp.hDeviceWindow = hWnd; 0173: // Z バッファの自動作成 0174: s_d3dpp.EnableAutoDepthStencil = TRUE; 0175: // ★ステンシルバッファをサポートするフォーマットを使う 0176: if( FAILED( s_lpD3D->CheckDeviceFormat( caps.AdapterOrdinal, 0177: caps.DeviceType, d3ddm.Format, 0178: D3DUSAGE_DEPTHSTENCIL, 0179: D3DRTYPE_SURFACE, 0180: D3DFMT_D24S8 ) ) ){ 0181: s_d3dpp.AutoDepthStencilFormat = D3DFMT_D15S1; 0182: }else{ 0183: s_d3dpp.AutoDepthStencilFormat = D3DFMT_D24S8; 0184: } 0185: 0186: 0187: DWORD vs[] = {D3DCREATE_HARDWARE_VERTEXPROCESSING, D3DCREATE_MIXED_VERTEXPROCESSING, D3DCREATE_SOFTWARE_VERTEXPROCESSING,0 }; 0188: D3DDEVTYPE ps[] = {D3DDEVTYPE_HAL, D3DDEVTYPE_REF, (D3DDEVTYPE)0}; 0189: 0190: DWORD v = (caps.VertexShaderVersion < D3DVS_VERSION(1,0)) ? 1 : 0; 0191: DWORD p = (caps.PixelShaderVersion < D3DPS_VERSION(1,0)) ? 1 : 0; 0192: 0193: // ★ステンシルバッファのサポートのチェック 0194: if(FAILED(s_lpD3D->CheckDepthStencilMatch(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, 0195: d3ddm.Format, d3ddm.Format, s_d3dpp.AutoDepthStencilFormat))){ 0196: p = 1; // HEL で実行 0197: } 0198: 0199: 0200: for(;ps[p];p++){ 0201: for(;vs[v];v++){ 0202: if(SUCCEEDED(s_lpD3D->CreateDevice(D3DADAPTER_DEFAULT, ps[p],hWnd,vs[v],&s_d3dpp,&s_lpD3DDEV))) goto set_up; 0203: } 0204: } 0205: set_up: 0206: return S_OK; 0207: } 0208: