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: