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 <stdio.h> 0012: #include <windows.h> 0013: #include <d3d8.h> 0014: #include <d3dx8.h> 0015: #include "main.h" 0016: #include "draw.h" 0017: #include "font.h" 0018: 0019: // ---------------------------------------------------------------------------- 0020: // オブジェクト 0021: // ---------------------------------------------------------------------------- 0022: static LPDIRECT3D8 s_lpD3D = NULL; 0023: static LPDIRECT3DDEVICE8 s_lpD3DDEV = NULL; 0024: static D3DPRESENT_PARAMETERS s_d3dpp; 0025: static CMyFont sFont; 0026: 0027: static bool s_end; // 終了フラグ 0028: 0029: // ---------------------------------------------------------------------------- 0030: // プロトタイプ宣言 0031: // ---------------------------------------------------------------------------- 0032: int PASCAL WinMain(HINSTANCE hInst,HINSTANCE hPrev,char *CmdLine,int CmdShow); 0033: LRESULT CALLBACK MsgProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam); 0034: HRESULT InitD3D( HWND hWnd ); // DirectX の初期化 0035: static void fps_disp(); 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: sFont.Init(s_lpD3DDEV, 12, 24); 0087: 0088: if(FAILED(InitRender(s_lpD3DDEV))) s_end = true; 0089: 0090: ShowWindow(hWnd, SW_SHOW); 0091: UpdateWindow(hWnd); 0092: 0093: // メインループ 0094: MSG msg; 0095: while (!s_end) 0096: { 0097: if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)){ 0098: // メッセージの処理 0099: TranslateMessage(&msg); 0100: DispatchMessage(&msg); 0101: }else{ 0102: // Direct3D の描画 0103: // バックバッファと Z バッファをクリア 0104: s_lpD3DDEV->Clear(0,NULL,D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER,D3DCOLOR_XRGB(0,0,0),1.0f,0); 0105: // シーン開始 0106: s_lpD3DDEV->BeginScene(); 0107: 0108: Render(s_lpD3DDEV); // 描画などの処理 0109: fps_disp(); // fpsの描画 0110: 0111: // シーン終了 0112: s_lpD3DDEV->EndScene(); 0113: if (FAILED(s_lpD3DDEV->Present(NULL,NULL,NULL,NULL))) 0114: s_lpD3DDEV->Reset(&s_d3dpp);// バックバッファをプライマリバッファにコピー 0115: } 0116: } 0117: } 0118: 0119: // 終了 0120: CleanRender(s_lpD3DDEV); 0121: RELEASE(s_lpD3DDEV); 0122: RELEASE(s_lpD3D); 0123: 0124: return 0; 0125: } 0126: // ---------------------------------------------------------------------------- 0127: // Name: MsgProc() 0128: // Desc: メインウインドウのイベントを処理する 0129: //----------------------------------------------------------------------------- 0130: extern float g_val; 0131: extern float g_diff; 0132: extern float g_val2; 0133: extern float g_diff2; 0134: 0135: LRESULT CALLBACK MsgProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam) 0136: { 0137: switch (msg){ 0138: case WM_KEYDOWN: // 何かキーが押された 0139: case WM_CLOSE: // ×ボタンを押した 0140: s_end = true; 0141: return 1; 0142: break; 0143: default: 0144: break; 0145: } 0146: return DefWindowProc(hWnd,msg,wParam,lParam); 0147: } 0148: //----------------------------------------------------------------------------- 0149: // Name: InitD3D() 0150: // Desc: Direct3D の初期化 0151: //----------------------------------------------------------------------------- 0152: HRESULT InitD3D( HWND hWnd ) 0153: { 0154: // Direct3D オブジェクトを作成 0155: if (NULL == (s_lpD3D = Direct3DCreate8(D3D_SDK_VERSION))){ 0156: MessageBox(NULL,"Direct3D の作成に失敗しました。",CAPTION,MB_OK | MB_ICONSTOP); 0157: return E_FAIL; 0158: } 0159: 0160: // 現在の画面モードを取得 0161: D3DDISPLAYMODE d3ddm; 0162: if( FAILED( s_lpD3D->GetAdapterDisplayMode( D3DADAPTER_DEFAULT, &d3ddm ) ) ) return E_FAIL; 0163: // ビデオカードの能力を調べる 0164: D3DCAPS8 caps; 0165: s_lpD3D->GetDeviceCaps(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, &caps); 0166: 0167: // Direct3D 初期化パラメータの設定 0168: ZeroMemory(&s_d3dpp, sizeof(D3DPRESENT_PARAMETERS)); 0169: 0170: s_d3dpp.BackBufferCount = 1; 0171: if (FULLSCREEN){ 0172: s_d3dpp.Windowed = FALSE; 0173: s_d3dpp.BackBufferWidth = WIDTH; 0174: s_d3dpp.BackBufferHeight = HEIGHT; 0175: }else{ 0176: s_d3dpp.Windowed = TRUE; 0177: s_d3dpp.BackBufferWidth = WIDTH; 0178: s_d3dpp.BackBufferHeight = HEIGHT; 0179: } 0180: // ウインドウ : 現在の画面モードを使用 0181: s_d3dpp.BackBufferFormat = d3ddm.Format; 0182: s_d3dpp.MultiSampleType = D3DMULTISAMPLE_NONE; 0183: s_d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; 0184: s_d3dpp.hDeviceWindow = hWnd; 0185: // Z バッファの自動作成 0186: s_d3dpp.EnableAutoDepthStencil = TRUE; 0187: if( FAILED( s_lpD3D->CheckDeviceFormat( caps.AdapterOrdinal, 0188: caps.DeviceType, d3ddm.Format, 0189: D3DUSAGE_DEPTHSTENCIL, 0190: D3DRTYPE_SURFACE, 0191: D3DFMT_D24S8 ) ) ){ 0192: s_d3dpp.AutoDepthStencilFormat = D3DFMT_D16; 0193: }else{ 0194: s_d3dpp.AutoDepthStencilFormat = D3DFMT_D24S8; 0195: } 0196: 0197: DWORD vs[] = {D3DCREATE_HARDWARE_VERTEXPROCESSING, D3DCREATE_MIXED_VERTEXPROCESSING, D3DCREATE_SOFTWARE_VERTEXPROCESSING,0 }; 0198: D3DDEVTYPE ps[] = {D3DDEVTYPE_HAL, D3DDEVTYPE_REF, (D3DDEVTYPE)0}; 0199: 0200: DWORD v = (caps.VertexShaderVersion < D3DVS_VERSION(1,0)) ? 1 : 0; 0201: DWORD p = (caps.PixelShaderVersion < D3DPS_VERSION(1,0)) ? 1 : 0; 0202: 0203: for(;ps[p];p++){ 0204: for(;vs[v];v++){ 0205: if(SUCCEEDED(s_lpD3D->CreateDevice(D3DADAPTER_DEFAULT, ps[p],hWnd,vs[v],&s_d3dpp,&s_lpD3DDEV))) goto set_up; 0206: } 0207: } 0208: set_up: 0209: return S_OK; 0210: } 0211: // ---------------------------------------------------------------------------- 0212: // Name: set_fps() 0213: // Desc: フレーム数の表示 0214: //----------------------------------------------------------------------------- 0215: static void fps_disp() 0216: { 0217: static DWORD last = timeGetTime(); 0218: static DWORD frames = 0; 0219: static char buf[256] = ""; 0220: DWORD current; 0221: 0222: current = timeGetTime(); 0223: frames++; 0224: 0225: if(500 <= current - last) {// 0.5秒後とに更新 0226: float dt = (float)(current - last) / 1000.0f; 0227: float fps = (float)frames / dt; 0228: last = current; 0229: frames = 0; 0230: sprintf(buf, "%.02f fps", fps); 0231: } 0232: sFont.Print(buf, 0,0); 0233: } 0234: