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 <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: // ----------------------------------------------------------------------------
0027: // プロトタイプ宣言
0028: // ----------------------------------------------------------------------------
0029: int PASCAL WinMain(HINSTANCE hInst,HINSTANCE hPrev,char *CmdLine,int CmdShow);
0030: LRESULT CALLBACK MsgProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam);
0031: HRESULT InitD3D( HWND hWnd ); // DirectX の初期化
0032:
0033: // ----------------------------------------------------------------------------
0034: // 外部関数
0035: // ----------------------------------------------------------------------------
0036:
0037: // ----------------------------------------------------------------------------
0038: // 関数
0039: // ----------------------------------------------------------------------------
0040: // ----------------------------------------------------------------------------
0041: // Name: WinMain()
0042: // Desc: Windows アプリケーションはここから始まる
0043: //-----------------------------------------------------------------------------
0044: int PASCAL WinMain(HINSTANCE hInst,HINSTANCE hPrev,char *CmdLine,int CmdShow)
0045: {
0046: s_end = 0;
0047:
0048: // ウインドウの作成
0049: RECT rect;
0050: SetRect(&rect, 0, 0, WIDTH, HEIGHT);
0051: DWORD style = (FULLSCREEN) ? WS_POPUP :(WS_CAPTION|WS_SYSMENU|WS_BORDER|WS_MINIMIZEBOX);
0052: AdjustWindowRect(&rect, style, FALSE); // ウィンドウスタイルを設定したときの、ウィンドウの大きさを調べる
0053: int width = rect.right - rect.left;
0054: int height = rect.bottom - rect.top;
0055:
0056: WNDCLASS wc;
0057: ZeroMemory(&wc, sizeof(WNDCLASS));
0058: wc.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);
0059: wc.hCursor = LoadCursor(NULL, IDC_ARROW);
0060: wc.hInstance = hInst;
0061: wc.lpfnWndProc = MsgProc;
0062: wc.lpszClassName = CAPTION;
0063: if(RegisterClass(&wc) == 0) return 0; //ウィンドウ作成に使用できる新しいウィンドウクラスを作成する。
0064:
0065: HWND hWnd = CreateWindow(CAPTION // 登録されているクラス名
0066: ,CAPTION // ウィンドウ名
0067: ,style // ウィンドウスタイル
0068: ,CW_USEDEFAULT // ウィンドウの横方向の位置
0069: ,CW_USEDEFAULT // ウィンドウの縦方向の位置
0070: ,width // ウィンドウの幅
0071: ,height // ウィンドウの高さ
0072: ,NULL // 親ウィンドウまたはオーナーウィンドウのハンドル
0073: ,NULL // メニューハンドルまたは子ウィンドウ ID
0074: ,hInst // アプリケーションインスタンスのハンドル
0075: ,NULL // ウィンドウ作成データ
0076: );
0077: if(hWnd == NULL) return 0;
0078:
0079: // Direct3D の初期化
0080: if(SUCCEEDED(InitD3D(hWnd))){
0081:
0082: if(FAILED(InitRender(s_lpD3DDEV))) s_end = true;
0083:
0084: ShowWindow(hWnd, SW_SHOW);
0085: UpdateWindow(hWnd);
0086:
0087: // メインループ
0088: MSG msg;
0089: while (!s_end)
0090: {
0091: if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)){
0092: // メッセージの処理
0093: TranslateMessage(&msg);
0094: DispatchMessage(&msg);
0095: }else{
0096: // Direct3D の描画
0097: // バックバッファと Z バッファをクリア
0098: s_lpD3DDEV->Clear(0,NULL,D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER,D3DCOLOR_XRGB(0,0,0),1.0f,0);
0099: // シーン開始
0100: s_lpD3DDEV->BeginScene();
0101:
0102: Render(s_lpD3DDEV); // 描画などの処理
0103:
0104: // シーン終了
0105: s_lpD3DDEV->EndScene();
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: #include <iostream.h>
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: D3DCAPS8 caps;
0154: s_lpD3D->GetDeviceCaps(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, &caps);
0155:
0156: // Direct3D 初期化パラメータの設定
0157: ZeroMemory(&s_d3dpp, sizeof(D3DPRESENT_PARAMETERS));
0158:
0159: s_d3dpp.BackBufferCount = 1;
0160: if (FULLSCREEN){
0161: s_d3dpp.Windowed = FALSE;
0162: s_d3dpp.BackBufferWidth = WIDTH;
0163: s_d3dpp.BackBufferHeight = HEIGHT;
0164: }else{
0165: s_d3dpp.Windowed = TRUE;
0166: s_d3dpp.BackBufferWidth = WIDTH;
0167: s_d3dpp.BackBufferHeight = HEIGHT;
0168: }
0169: // ウインドウ : 現在の画面モードを使用
0170: s_d3dpp.BackBufferFormat = d3ddm.Format;
0171: s_d3dpp.MultiSampleType = D3DMULTISAMPLE_NONE;
0172: s_d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
0173: s_d3dpp.hDeviceWindow = hWnd;
0174: // Z バッファの自動作成
0175: s_d3dpp.EnableAutoDepthStencil = TRUE;
0176: if( FAILED( s_lpD3D->CheckDeviceFormat( caps.AdapterOrdinal,
0177: caps.DeviceType, d3ddm.Format,
0178: D3DUSAGE_DEPTHSTENCIL,
0179: D3DRTYPE_SURFACE,
0180: D3DFMT_D24S8 ) ) ){
0181: s_d3dpp.AutoDepthStencilFormat = D3DFMT_D16;
0182: }else{
0183: s_d3dpp.AutoDepthStencilFormat = D3DFMT_D24S8;
0184: }
0185:
0186: DWORD vs[] = {D3DCREATE_HARDWARE_VERTEXPROCESSING, D3DCREATE_MIXED_VERTEXPROCESSING, D3DCREATE_SOFTWARE_VERTEXPROCESSING,0 };
0187: D3DDEVTYPE ps[] = {D3DDEVTYPE_HAL, D3DDEVTYPE_REF, (D3DDEVTYPE)0};
0188:
0189: DWORD v = (caps.VertexShaderVersion < D3DVS_VERSION(1,0)) ? 1 : 0;
0190: DWORD p = (caps.PixelShaderVersion < D3DPS_VERSION(1,0)) ? 1 : 0;
0191:
0192: for(;ps[p];p++){
0193: for(;vs[v];v++){
0194: if(SUCCEEDED(s_lpD3D->CreateDevice(D3DADAPTER_DEFAULT, ps[p],hWnd,vs[v],&s_d3dpp,&s_lpD3DDEV))) goto set_up;
0195: }
0196: }
0197: set_up:
0198: return S_OK;
0199: }
0200: