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: