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