0001: // ----------------------------------------------------------------------------
0002: //
0003: // draw.cpp - 描画部分
0004: // 
0005: // Copyright (c) 2002 IF (imagire@gmail.com)
0006: // All Rights Reserved.
0007: //
0008: // ----------------------------------------------------------------------------
0009: #define STRICT
0010: 
0011: #include <windows.h>
0012: #include "main.h"
0013: #include "draw.h"
0014: 
0015: #include "Cg/cgD3D.h"
0016: 
0017: // Cg 環境
0018: cgDirect3D cg;
0019: cgContextContainer * pContextContainer = 0;
0020: // 頂点シェーダー
0021: cgProgramContainer *pVertexProgramContainer = 0;    // 頂点シェーダーを扱うコンテナ
0022: cgBindIter * vertex_mat_iter = 0;                   // ローカル/射影変換を扱う反復子
0023: // ピクセルシェーダー
0024: cgProgramContainer  *pPixelProgramContainer = 0;    // ピクセルシェーダーを扱うコンテナ
0025: cgBindIter * tex0_iter = 0;                         // テクスチャーを扱う反復子
0026: 
0027: 
0028: 
0029: 
0030: 
0031: 
0032: // ----------------------------------------------------------------------------
0033: // 外部関数
0034: void InitBg(LPDIRECT3DDEVICE8 lpD3DDev);
0035: void DrawBg(LPDIRECT3DDEVICE8 lpD3DDev, D3DXMATRIX &mVP);
0036: void CleanBg(LPDIRECT3DDEVICE8 lpD3DDev);
0037: 
0038: 
0039: //-----------------------------------------------------------------------------
0040: // Name: InitRender()
0041: // Desc: 初期化
0042: //-----------------------------------------------------------------------------
0043: HRESULT InitRender(LPDIRECT3DDEVICE8 lpD3DDev)
0044: {
0045:     // 背景部分の初期化
0046:     InitBg(lpD3DDev);
0047: 
0048:     // プログラマぶるシェーダーを使えるようにする
0049:     cg.AddFilePath("..");
0050:     pContextContainer = cg.CreateContextContainer(lpD3DDev);
0051: 
0052:     // 
0053:     // 頂点シェーダー
0054:     // 
0055:     cgVertexDefinition  vertex_attributes[] = {
0056:         {D3DVSDT_FLOAT4, "position", 0},
0057:         {D3DVSDT_FLOAT2, "texcoord0", 0},
0058:         CGVERTEXDEFINITIONEND
0059:     };
0060: 
0061:     pVertexProgramContainer = pContextContainer->LoadCGProgramFromFile(
0062:         "vs.cg", "Vertex Shader", cgDX8VertexProfile, vertex_attributes);
0063: 
0064:     if (pVertexProgramContainer == NULL) {
0065:         // エラー表示
0066:         const char * listing = pContextContainer->GetLastListing();
0067:         if (listing == 0) listing = "Could not find cgc.exe.";
0068:         cg.NotePad("頂点シェーダープログラムの生成に失敗しました\n\n", listing);    // メモ帳に出力
0069: 
0070:         exit(1);    // 終了
0071:     }
0072:     // 頂点データの反復子と、.cg ファイルの引数を関連付ける
0073:     vertex_mat_iter = pVertexProgramContainer->GetParameterBindByName("worldviewproj_matrix");
0074: 
0075: // ここのコメントをはずすと、生成されたソースコードが表示される
0076: //  const char * object_code = pVertexProgramContainer->GetProgramObjectCode();
0077: //  cg.NotePad("", object_code);
0078:         
0079:         
0080: // ここのコメントをはずすと、入力すべき頂点情報が表示される
0081: //  const char * vert = pVertexProgramContainer->GetVertexDeclaration(); 
0082: //  cg.NotePad("cg program expects the vertex be defined like this:\n", vert);
0083: 
0084:     // 
0085:     // ピクセルシェーダー
0086:     // 
0087:     pPixelProgramContainer = pContextContainer->LoadCGProgramFromFile(
0088:                                 "ps.cg", "test", cgDX8PixelProfile);
0089:     
0090:     if (NULL == pPixelProgramContainer) {
0091:         // エラー表示
0092:         const char * error_text = pContextContainer->GetLastListing();
0093:         cg.NotePad("ピクセルシェーダープログラムの生成に失敗しました\n\n\n", error_text);
0094: 
0095:         exit(1);    // 終了
0096:     }
0097: // ここのコメントをはずすと、生成されたソースコードが表示される
0098: //  const char *pixel_object_code = pPixelProgramContainer->GetProgramObjectCode();
0099: //  cg.NotePad("", pixel_object_code);
0100: 
0101:     // テクスチャーの反復子と、.cg ファイルの引数を関連付ける
0102:     tex0_iter = pPixelProgramContainer->GetTextureBindByName("tex0");
0103:     int t0 = pPixelProgramContainer->GetTexturePosition(tex0_iter);
0104: 
0105:     
0106:     // 不変なレジスタの設定
0107:     lpD3DDev->SetRenderState( D3DRS_ZENABLE, TRUE );
0108:     lpD3DDev->SetRenderState( D3DRS_LIGHTING,  FALSE );
0109:     lpD3DDev->SetRenderState( D3DRS_ALPHABLENDENABLE, FALSE);
0110: 
0111:     return S_OK;
0112: }
0113: 
0114: //-----------------------------------------------------------------------------
0115: // Name: Render()
0116: // Desc: Draws the scene
0117: //-----------------------------------------------------------------------------
0118: VOID Render(LPDIRECT3DDEVICE8 lpD3DDev)
0119: {
0120:     D3DXMATRIX mWorld, mView, mProj, m;
0121:     
0122:     // ビュー行列
0123:     D3DXVECTOR3 eye    = D3DXVECTOR3(0.0f,  2.0f,  4.0f);
0124:     D3DXVECTOR3 lookAt = D3DXVECTOR3(0.0f,  1.0f,  0.0f);
0125:     D3DXVECTOR3 up     = D3DXVECTOR3(0.0f,  1.0f,  0.0f);
0126:     // 通常表示
0127:     D3DXMatrixLookAtLH(&mView, &eye, &lookAt, &up);
0128:     D3DXMatrixPerspectiveFovLH(&mProj
0129:         ,60.0f*PI/180.0f                        // 視野角
0130:         ,(float)WIDTH/(float)HEIGHT             // アスペクト比
0131:         ,0.01f,100.0f                           // 最近接距離,最遠方距離
0132:         );
0133:     D3DXMATRIX mat = mView * mProj;
0134:     
0135:     //
0136:     // 描画
0137:     // 
0138: 
0139:     // プログラマぶるシェーダーを有効にする
0140:     pVertexProgramContainer->SetShaderActive();
0141:     pPixelProgramContainer->SetShaderActive();
0142:     
0143:     DrawBg(lpD3DDev, mat);
0144: }
0145: //-----------------------------------------------------------------------------
0146: // Name: CleanRender()
0147: // Desc: 後始末
0148: //-----------------------------------------------------------------------------
0149: void CleanRender(LPDIRECT3DDEVICE8 lpD3DDev)
0150: {
0151:     CleanBg(lpD3DDev);
0152: }
0153: