メッシュの表示。


【サンプルプロジェクトのダウンロード】


Tuto02.zip<-リンクをダウンロードして下さい。


【プログラム解説】


このプログラムは、前回のプログラムの内容とさほど変わりありません。

プロジェクトをダウンロードしてコンパイル・実行すればメッシュが表示されますが、
前回のプログラムを改造しても同じものが作れます。
以下、前回のプログラムを改造する場合に、変更が必要な箇所を太字で示します。

#include "stdafx.h"

#include <d3dx9.h>
#include "D3DQuickLib.h"
CD3DEnv	*g_pD3DEnv = NULL; // D3DQuickLib が提供する描画環境。
CEnhancedMesh *g_pMesh = NULL; // D3DQuickLib によるモデリングクラス。
float   g_fTime = 0;       // アニメーションで使用する

LRESULT CALLBACK WndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam);

//------------------------------------------------------------
// Name: FrameMove
// Desc: アニメーションを行う。
//		UpdateScene 関数 からコールバックされる。
//------------------------------------------------------------
void FrameMove(float timeElapsed)
{
    g_fTime += timeElapsed;
    if (g_fTime > 600.0f)
        g_fTime -= 600.0f;
}

//------------------------------------------------------------
// Name: RenderScene
// Desc: レンダリングを行う。
//		UpdateScene 関数 からコールバックされる。
//------------------------------------------------------------
void RenderScene(LPDIRECT3DDEVICE9 lpd3ddev)
{
    D3DXMATRIX	matWorld;
    D3DXMatrixRotationY(&matWorld,(D3DX_PI /60.0f)* g_fTime);
    lpd3ddev->SetRenderState(D3DRS_ALPHABLENDENABLE,FALSE);
    lpd3ddev->SetRenderState(D3DRS_LIGHTING, TRUE );
    lpd3ddev->SetTransform( D3DTS_WORLD, &matWorld );
    g_pMesh->Render(lpd3ddev);
}

int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow )
{
    WNDCLASSEX wcex;
    wcex.cbSize = sizeof(WNDCLASSEX); 
    wcex.style            = CS_HREDRAW | CS_VREDRAW;
    wcex.lpfnWndProc    = (WNDPROC)WndProc;
    wcex.cbClsExtra        = 0;
    wcex.cbWndExtra        = 0;
    wcex.hInstance        = hInstance;
    wcex.hIcon            = LoadIcon(NULL, MAKEINTRESOURCE(IDI_APPLICATION));
    wcex.hCursor        = LoadCursor(NULL, MAKEINTRESOURCE(IDC_ARROW));
    wcex.hbrBackground    = (HBRUSH)(COLOR_WINDOW+1);
    wcex.lpszMenuName    = NULL;
    wcex.lpszClassName    = "Game";
    wcex.hIconSm        = LoadIcon(NULL, IDI_APPLICATION);
    RegisterClassEx(&wcex);

    HWND hWnd;
    hWnd = CreateWindowEx(WS_EX_OVERLAPPEDWINDOW,wcex.lpszClassName,"Game",
                WS_VISIBLE|WS_CAPTION|WS_SYSMENU|WS_MINIMIZEBOX|WS_MAXIMIZEBOX,
                CW_USEDEFAULT,0,640,480,NULL,NULL,hInstance,NULL);
    if( !hWnd )
        return FALSE;

    RECT    bounds,client;
    GetWindowRect(hWnd,&bounds);
    GetClientRect(hWnd,&client);
    MoveWindow(hWnd,bounds.left,bounds.top,
        640 * 2 - client.right,
        480 * 2 - client.bottom,
        false );

    ShowWindow( hWnd, nCmdShow );
    UpdateWindow( hWnd );

    //    D3DQuickLib の初期化
    g_pD3DEnv = new CD3DEnv();
    if (FAILED(g_pD3DEnv->InitD3D(hWnd))){
        DestroyWindow(hWnd);
    }else{
        g_pMesh = new CEnhancedMesh(g_pD3DEnv,"smile\\smile.x");
        g_pD3DEnv->ReloadGraphics();
    }

    MSG        msg;
    while(true){
        if(PeekMessage(&msg, 0, 0, 0, PM_REMOVE)){
            if(msg.message == WM_QUIT)
                break;
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }else{
            g_pD3DEnv->UpdateScene(FrameMove,RenderScene);
        }
    }
    //    D3DQuickLib の終了
    SAFE_DELETE(g_pMesh);
    SAFE_DELETE(g_pD3DEnv);
    
    return msg.wParam;
}


LRESULT CALLBACK WndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)
{
    switch (message){
        case    WM_SIZE:
            //    ウインドウが最大化されたら、フルスクリーンモードにする。
            if (SIZE_MAXIMIZED == wParam){
                if (g_pD3DEnv->IsWindowed())
                    g_pD3DEnv->ToggleFullscreen();
            }
            break;
        case    WM_SETCURSOR:
            //    フルスクリーン時はカーソルを表示させない。
            if (g_pD3DEnv->IsWindowed())
                ::SetCursor(::LoadCursor(NULL,IDC_ARROW));
            else
                ::SetCursor(NULL);
            break;
        case    WM_SYSCHAR:
            //    Alt-Enter でフルスクリーンモードへ切り替える
            if (lParam&0x20000000){
                if (wParam == '\x0d'){
                    g_pD3DEnv->ToggleFullscreen();
                    break;
                }
            }
            return DefWindowProc( hWnd, message, wParam, lParam );
        case    WM_SYSCOMMAND:
            if (!g_pD3DEnv->IsWindowed()){    //    フルスクリーン時
                if (wParam != SC_CLOSE)
                    break;

                //    Windowが閉じられる前にWindowモードに戻しておく。
                g_pD3DEnv->ToggleFullscreen();
                Sleep(100);
            }
            return DefWindowProc( hWnd, message, wParam, lParam );

        case WM_DESTROY:
            PostQuitMessage(0);
            break;
        default:
            return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return    0;
}



【画像データの保存】

表示させるデータをプログラムから読み込み可能なフォルダに保存します。

【ステップ1 プロジェクトを開く】
解説
チュートリアル1の時と同様にプロジェクトのフォルダを開きます。 すると、画面は左図のようになったはずです。

ここで、「Debug」フォルダを開きます。
図1 フォルダ Game


【ステップ2 Debug フォルダにデータを保存1】
解説
すると、画面は左図のようになったはずです。 ここに画像データを置きます。

データをダウンロードして、 このフォルダに保存して下さい。
図2 フォルダ Debug


【ステップ3 Debug フォルダにデータを保存2】
解説
すると、画面は左図のようになったはずです。
これでデータが設置されました。

確認の為、「smile」フォルダを開いてみてください。
図3 フォルダ Debug


【ステップ4 Smile フォルダ】
解説
左図のようになれば完成です。
これでデータが設置されました。

コンパイルして実行してみましょう。
図4 フォルダ smile


コンパイルして実行してみましょう。
下の図のようになったでしょうか?




これで完成です。