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: