0001: // ----------------------------------------------------------------------------
0002: //
0003: // main.cpp - ウィンドウズメイン部分
0004: // 
0005: // Copyright (c) 2002 IMAGIRE Takashi (imagire@gmail.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: extern float a;
0027: extern float b;
0028: 
0029: 
0030: // ----------------------------------------------------------------------------
0031: // プロトタイプ宣言
0032: // ----------------------------------------------------------------------------
0033: int PASCAL WinMain(HINSTANCE hInst,HINSTANCE hPrev,char *CmdLine,int CmdShow);
0034: LRESULT CALLBACK MsgProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam);
0035: HRESULT InitD3D( HWND hWnd );           // DirectX の初期化
0036: 
0037: // ----------------------------------------------------------------------------
0038: // 外部関数
0039: // ----------------------------------------------------------------------------
0040: 
0041: // ----------------------------------------------------------------------------
0042: // 関数
0043: // ----------------------------------------------------------------------------
0044: // ----------------------------------------------------------------------------
0045: // Name: WinMain()
0046: // Desc: Windows アプリケーションはここから始まる
0047: //-----------------------------------------------------------------------------
0048: int PASCAL WinMain(HINSTANCE hInst,HINSTANCE hPrev,char *CmdLine,int CmdShow)
0049: {
0050:     s_end = 0;
0051:     
0052:     // ウインドウの作成
0053:     RECT    rect;
0054:     SetRect(&rect, 0, 0, WIDTH, HEIGHT);
0055:     DWORD   style = (FULLSCREEN) ? WS_POPUP :(WS_CAPTION|WS_SYSMENU|WS_BORDER|WS_MINIMIZEBOX);
0056:     AdjustWindowRect(&rect, style, FALSE);  // ウィンドウスタイルを設定したときの、ウィンドウの大きさを調べる
0057:     int width  = rect.right - rect.left;
0058:     int height = rect.bottom - rect.top;    
0059:     
0060:     WNDCLASS wc;
0061:     ZeroMemory(&wc, sizeof(WNDCLASS));
0062:     wc.hbrBackground    = (HBRUSH)GetStockObject(BLACK_BRUSH);
0063:     wc.hCursor          = LoadCursor(NULL, IDC_ARROW);
0064:     wc.hInstance        = hInst;
0065:     wc.lpfnWndProc      = MsgProc;
0066:     wc.lpszClassName    = CAPTION;
0067:     if(RegisterClass(&wc) == 0) return 0; //ウィンドウ作成に使用できる新しいウィンドウクラスを作成する。
0068:     
0069:     HWND hWnd = CreateWindow(CAPTION        // 登録されているクラス名
0070:                             ,CAPTION        // ウィンドウ名
0071:                             ,style          // ウィンドウスタイル
0072:                             ,CW_USEDEFAULT  // ウィンドウの横方向の位置
0073:                             ,CW_USEDEFAULT  // ウィンドウの縦方向の位置
0074:                             ,width          // ウィンドウの幅
0075:                             ,height         // ウィンドウの高さ
0076:                             ,NULL           // 親ウィンドウまたはオーナーウィンドウのハンドル
0077:                             ,NULL           // メニューハンドルまたは子ウィンドウ ID
0078:                             ,hInst          // アプリケーションインスタンスのハンドル
0079:                             ,NULL           // ウィンドウ作成データ
0080:                             );
0081:     if(hWnd == NULL) return 0;
0082:     
0083:     // Direct3D の初期化
0084:     if(SUCCEEDED(InitD3D(hWnd))){
0085:         
0086:         if(FAILED(InitRender(s_lpD3DDEV))) s_end = true;
0087:         
0088:         ShowWindow(hWnd, SW_SHOW);
0089:         UpdateWindow(hWnd);
0090:     
0091:         // メインループ
0092:         MSG msg;
0093:         while (!s_end)
0094:         {
0095:             if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)){
0096:                 // メッセージの処理
0097:                 TranslateMessage(&msg);
0098:                 DispatchMessage(&msg);
0099:             }else{
0100:                 // Direct3D の描画
0101:                 // バックバッファと Z バッファをクリア
0102: //              s_lpD3DDEV->Clear(0,NULL,D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER,D3DCOLOR_XRGB(0,0,0),1.0f,0);
0103:                 
0104:                 Render(s_lpD3DDEV); // 描画などの処理
0105:                 
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:     if( FAILED( s_lpD3D->CheckDeviceFormat( caps.AdapterOrdinal, 
0176:                                            caps.DeviceType, d3ddm.Format, 
0177:                                            D3DUSAGE_DEPTHSTENCIL, 
0178:                                            D3DRTYPE_SURFACE,
0179:                                            D3DFMT_D24S8 ) ) ){
0180:         s_d3dpp.AutoDepthStencilFormat = D3DFMT_D16;
0181:     }else{
0182:         s_d3dpp.AutoDepthStencilFormat = D3DFMT_D24S8;
0183:     }
0184: 
0185:     // ハードウェアシャドウマップのサポートのチェック
0186:     if(FAILED(s_lpD3D->CheckDeviceFormat(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,D3DFMT_X8R8G8B8,
0187:                                     D3DUSAGE_DEPTHSTENCIL, D3DRTYPE_TEXTURE,s_d3dpp.AutoDepthStencilFormat)))
0188:         return -1;
0189:     
0190:     DWORD  vs[] = {D3DCREATE_HARDWARE_VERTEXPROCESSING, D3DCREATE_MIXED_VERTEXPROCESSING, D3DCREATE_SOFTWARE_VERTEXPROCESSING,0 };
0191:     D3DDEVTYPE ps[] = {D3DDEVTYPE_HAL, D3DDEVTYPE_REF, (D3DDEVTYPE)0};
0192:     
0193:     DWORD v = (caps.VertexShaderVersion < D3DVS_VERSION(1,1)) ? 1 : 0;
0194:     DWORD p = (caps.PixelShaderVersion  < D3DPS_VERSION(1,1)) ? 1 : 0;
0195: 
0196:     // キューブマップをサポートしていなかったら、REF
0197:     if( 0 == ( caps.TextureCaps & D3DPTEXTURECAPS_CUBEMAP ) ){
0198:         p=1;
0199:     }
0200: 
0201:     for(;ps[p];p++){
0202:     for(;vs[v];v++){
0203:         if(SUCCEEDED(s_lpD3D->CreateDevice(D3DADAPTER_DEFAULT, ps[p],hWnd,vs[v],&s_d3dpp,&s_lpD3DDEV))) goto set_up;
0204:     }
0205:     }
0206: set_up:
0207:     return S_OK;
0208: }
0209: