0001: //-------------------------------------------------------------
0002: // File: main.cpp
0003: //
0004: // Desc: ハロ
0005: //-------------------------------------------------------------
0006: #define STRICT
0007: #include <windows.h>
0008: #include <commctrl.h>
0009: #include <commdlg.h>
0010: #include <basetsd.h>
0011: #include <math.h>
0012: #include <stdio.h>
0013: #include <d3dx9.h>
0014: #include <dxerr9.h>
0015: #include <tchar.h>
0016: #include "DXUtil.h"
0017: #include "D3DEnumeration.h"
0018: #include "D3DSettings.h"
0019: #include "D3DApp.h"
0020: #include "D3DFont.h"
0021: #include "D3DFile.h"
0022: #include "D3DUtil.h"
0023: #include "resource.h"
0024: #include "main.h"
0025: 
0026: #define RENDERING_WIDTH     512
0027: #define RENDERING_HEIGHT    512
0028: #define MAP_WIDTH           128
0029: #define MAP_HEIGHT          128
0030: 
0031: #define PASS_SCENE          0
0032: #define PASS_REDUCTION      1
0033: #define PASS_X              2
0034: #define PASS_Y              3
0035: #define PASS_FINAL          4
0036: 
0037: // 頂点宣言
0038: D3DVERTEXELEMENT9 decl[] =
0039: {
0040:     {0,  0, D3DDECLTYPE_FLOAT3,   D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_POSITION, 0},
0041:     {0, 12, D3DDECLTYPE_FLOAT2,   D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TEXCOORD, 0},
0042:     D3DDECL_END()
0043: };
0044: 
0045: // 長いから短縮形を作ってみた
0046: #define RS   m_pd3dDevice->SetRenderState
0047: #define TSS  m_pd3dDevice->SetTextureStageState
0048: #define SAMP m_pd3dDevice->SetSamplerState
0049: 
0050: 
0051: //-------------------------------------------------------------
0052: // 頂点の構造体
0053: //-------------------------------------------------------------
0054: typedef struct {
0055:     FLOAT       p[4];
0056:     FLOAT       tu, tv;
0057: } TVERTEX;
0058: typedef struct {
0059:     FLOAT       p[4];
0060:     FLOAT       uv1[2];
0061:     FLOAT       uv2[2];
0062: } T2VERTEX;
0063: 
0064: //-------------------------------------------------------------
0065: // グローバル変数
0066: //-------------------------------------------------------------
0067: CMyD3DApplication* g_pApp  = NULL;
0068: HINSTANCE          g_hInst = NULL;
0069: 
0070: 
0071: //-------------------------------------------------------------
0072: // Name: WinMain()
0073: // Desc: メイン関数
0074: //-------------------------------------------------------------
0075: INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR, INT )
0076: {
0077:     CMyD3DApplication d3dApp;
0078: 
0079:     g_pApp  = &d3dApp;
0080:     g_hInst = hInst;
0081: 
0082:     InitCommonControls();
0083:     if( FAILED( d3dApp.Create( hInst ) ) )
0084:         return 0;
0085: 
0086:     return d3dApp.Run();
0087: }
0088: 
0089: 
0090: 
0091: 
0092: //-------------------------------------------------------------
0093: // Name: CMyD3DApplication()
0094: // Desc: アプリケーションのコンストラクタ
0095: //-------------------------------------------------------------
0096: CMyD3DApplication::CMyD3DApplication()
0097: {
0098:     m_pMesh                     = new CD3DMesh();
0099: 
0100:     m_pMapZ                     = NULL;
0101:     m_pOriginalTex              = NULL;
0102:     m_pOriginalSurf             = NULL;
0103:     m_pLumTex                   = NULL;
0104:     m_pLumSurf                  = NULL;
0105:     m_pXMap                     = NULL;
0106:     m_pXMapSurf                 = NULL;
0107:     m_pLargeTex                 = NULL;
0108:     m_pLargeSurf                = NULL;
0109:     m_pSmallTex                 = NULL;
0110:     m_pSmallSurf                = NULL;
0111: 
0112:     m_pEffect                   = NULL;
0113:     m_hTechnique                = NULL;
0114:     m_hafWeight                 = NULL;
0115:     m_htSrcMap                  = NULL;
0116:     m_htSrcMap2                 = NULL;
0117:     m_hmWVP                     = NULL;
0118:     m_hvLightDir                = NULL;
0119:     m_hvEyePos                  = NULL;
0120:     m_hvCol                     = NULL;
0121:     m_pDecl                     = NULL;
0122: 
0123:     m_fWorldRotX                = -0.41271535f;
0124:     m_fWorldRotY                = D3DX_PI/2;
0125:     m_fViewZoom                 = 2.0f;
0126: 
0127:     m_dwCreationWidth           = 512;
0128:     m_dwCreationHeight          = 512;
0129:     m_strWindowTitle            = TEXT( "main" );
0130:     m_d3dEnumeration.AppUsesDepthBuffer   = TRUE;
0131:     m_bStartFullscreen          = false;
0132:     m_bShowCursorWhenFullscreen = false;
0133: 
0134:     m_pFont                     = new CD3DFont( _T("Arial"), 12, D3DFONT_BOLD );
0135:     m_bLoadingApp               = TRUE;
0136: 
0137:     ZeroMemory( &m_UserInput, sizeof(m_UserInput) );
0138: }
0139: 
0140: 
0141: 
0142: 
0143: //-------------------------------------------------------------
0144: // Name: ~CMyD3DApplication()
0145: // Desc: デストラクタ
0146: //-------------------------------------------------------------
0147: CMyD3DApplication::~CMyD3DApplication()
0148: {
0149: }
0150: 
0151: 
0152: 
0153: 
0154: //-------------------------------------------------------------
0155: // Name: OneTimeSceneInit()
0156: // Desc: 一度だけ行う初期化
0157: //      ウィンドウの初期化やIDirect3D9の初期化は終わってます。
0158: //      ただ、LPDIRECT3DDEVICE9 の初期化は終わっていません。
0159: //-------------------------------------------------------------
0160: HRESULT CMyD3DApplication::OneTimeSceneInit()
0161: {
0162:     // ローディングメッセージを表示する
0163:     SendMessage( m_hWnd, WM_PAINT, 0, 0 );
0164: 
0165:     m_bLoadingApp = FALSE;
0166: 
0167:     return S_OK;
0168: }
0169: 
0170: 
0171: 
0172: 
0173: //-------------------------------------------------------------
0174: // Name: ConfirmDevice()
0175: // Desc: 初期化の時に呼ばれます。必要な能力をチェックします。
0176: //-------------------------------------------------------------
0177: HRESULT CMyD3DApplication::ConfirmDevice( D3DCAPS9* pCaps,
0178:                      DWORD dwBehavior,    D3DFORMAT Format )
0179: {
0180:     UNREFERENCED_PARAMETER( Format );
0181:     UNREFERENCED_PARAMETER( dwBehavior );
0182:     UNREFERENCED_PARAMETER( pCaps );
0183:     
0184: 
0185:     // ピクセルシェーダバージョンチェック
0186:     if( pCaps->PixelShaderVersion < D3DPS_VERSION(2,0) )
0187:         return E_FAIL;
0188: 
0189:     // 頂点シェーダバージョンが上位かソフトウェア頂点処理
0190:     if( pCaps->VertexShaderVersion < D3DVS_VERSION(1,1)
0191:     &&  0==(dwBehavior & D3DCREATE_SOFTWARE_VERTEXPROCESSING) )
0192:             return E_FAIL;
0193: 
0194:     return S_OK;
0195: }
0196: 
0197: 
0198: 
0199: 
0200: //-------------------------------------------------------------
0201: // Name: UpdateWeight()
0202: // Desc: 重みの計算
0203: //-------------------------------------------------------------
0204: VOID CMyD3DApplication::UpdateWeight( )
0205: {
0206:     DWORD i, j;
0207:     FLOAT size[2][3] = {
0208:                         // 赤     緑     青
0209:                         { 30.0f, 17.5f, 9.8f},// 外側
0210:                         { 20.0f, 11.2f, 7.5f},// 内側
0211:                     };
0212:     
0213:     for(j=0;j<2;j++){
0214:         FLOAT total[3]={0,0,0};
0215:         for( i=0; i<WEIGHT_MUN; i++ ){
0216:             FLOAT pos = 1.0f+2.0f*(FLOAT)i;
0217:             // ガウス重みを計算する
0218:             m_tbl[j][i].x = expf(-0.5f*(FLOAT)(pos*pos)/size[j][0]);
0219:             m_tbl[j][i].y = expf(-0.5f*(FLOAT)(pos*pos)/size[j][1]);
0220:             m_tbl[j][i].z = expf(-0.5f*(FLOAT)(pos*pos)/size[j][2]);
0221:             // 規格化のための重みの総和を計算する
0222:             total[0] += 2.0f*m_tbl[j][i].x;
0223:             total[1] += 2.0f*m_tbl[j][i].y;
0224:             total[2] += 2.0f*m_tbl[j][i].z;
0225: 
0226:             m_tbl[j][i].w = 1;
0227:         }
0228:         // 規格化
0229:         for( i=0; i<WEIGHT_MUN; i++ ){
0230:             m_tbl[j][i].x /= total[0];
0231:             m_tbl[j][i].y /= total[1];
0232:             m_tbl[j][i].z /= total[2];
0233:         }
0234:     }
0235: }
0236: 
0237: 
0238: 
0239: 
0240: //-------------------------------------------------------------
0241: // Name: InitDeviceObjects()
0242: // Desc: デバイスが生成された後の初期化をします。
0243: //      フレームバッファフォーマットやデバイスの種類が変わった
0244: //      後に通過します。
0245: //      ここで確保したメモリはDeleteDeviceObjects()で開放します
0246: //-------------------------------------------------------------
0247: HRESULT CMyD3DApplication::InitDeviceObjects()
0248: {
0249:     HRESULT hr;
0250:     D3DXVECTOR4 offset;
0251: 
0252:     // 車の読み込み
0253:     if(FAILED(hr=m_pMesh  ->Create( m_pd3dDevice, _T("ufo.x"))))
0254:         return DXTRACE_ERR( "LoadCar", hr );
0255:         
0256:     // 頂点宣言のオブジェクトの生成
0257:     if( FAILED( hr = m_pd3dDevice->CreateVertexDeclaration( decl, &m_pDecl ) ) )
0258:         return DXTRACE_ERR( "CreateVertexDeclaration", hr );
0259:     
0260:     // シェーダの読み込み
0261:     LPD3DXBUFFER pErr;
0262:     if( FAILED( hr = D3DXCreateEffectFromFile(
0263:                 m_pd3dDevice, "hlsl.fx", NULL, NULL, 
0264:                 D3DXSHADER_DEBUG , NULL, &m_pEffect, &pErr ))){
0265:         MessageBox( NULL, (LPCTSTR)pErr->GetBufferPointer()
0266:                     , "ERROR", MB_OK);
0267:         return DXTRACE_ERR( "CreateEffectFromFile", hr );
0268:     }
0269:     m_hTechnique = m_pEffect->GetTechniqueByName( "TShader" );
0270:     m_hafWeight  = m_pEffect->GetParameterByName( NULL, "weight" );
0271:     m_htSrcMap   = m_pEffect->GetParameterByName( NULL, "SrcMap" );
0272:     m_htSrcMap2  = m_pEffect->GetParameterByName( NULL, "SrcMap2" );
0273:     m_hmWVP      = m_pEffect->GetParameterByName( NULL, "mWVP" );
0274:     m_hvLightDir = m_pEffect->GetParameterByName( NULL, "vLightDir" );
0275:     m_hvEyePos   = m_pEffect->GetParameterByName( NULL, "vEyePos" );
0276:     m_hvCol      = m_pEffect->GetParameterByName( NULL, "vCol" );
0277:     m_pEffect->SetFloat("MAP_WIDTH",  MAP_WIDTH);   // 幅の設定
0278:     m_pEffect->SetFloat("MAP_HEIGHT", MAP_HEIGHT);  // 高さの設定
0279:     
0280:     // シェーダ内で使う8テクセル先を指定する定数
0281:     offset.x = 8.0f/MAP_WIDTH;  offset.y = 0.0f/MAP_HEIGHT;
0282:     m_pEffect->SetVector("offsetX",  &offset);
0283:     offset.x = 0.0f/MAP_WIDTH;  offset.y = 8.0f/MAP_HEIGHT;
0284:     m_pEffect->SetVector("offsetY",  &offset);
0285: 
0286:     // 重みを設定
0287:     this->UpdateWeight();
0288: 
0289:     // フォント
0290:     m_pFont->InitDeviceObjects( m_pd3dDevice );
0291: 
0292:     return S_OK;
0293: }
0294: 
0295: //-------------------------------------------------------------
0296: // Name: RestoreDeviceObjects()
0297: // Desc: 画面のサイズが変更された時等に呼ばれます。
0298: //      確保したメモリはInvalidateDeviceObjects()で開放します。
0299: //-------------------------------------------------------------
0300: HRESULT CMyD3DApplication::RestoreDeviceObjects()
0301: {
0302:     // メッシュ
0303:     m_pMesh  ->RestoreDeviceObjects( m_pd3dDevice );
0304: 
0305:     // レンダリング状態の設定
0306:     RS( D3DRS_DITHERENABLE,   FALSE );
0307:     RS( D3DRS_SPECULARENABLE, FALSE );
0308:     RS( D3DRS_ZENABLE,        TRUE );
0309:     
0310:     TSS( 0, D3DTSS_COLOROP,   D3DTOP_MODULATE );
0311:     TSS( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE );
0312:     TSS( 0, D3DTSS_COLORARG2, D3DTA_DIFFUSE );
0313:     TSS( 0, D3DTSS_ALPHAOP,   D3DTOP_SELECTARG1 );
0314:     TSS( 0, D3DTSS_ALPHAARG1, D3DTA_DIFFUSE );
0315:     SAMP( 0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR );
0316:     SAMP( 0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR );
0317:     SAMP( 0, D3DSAMP_ADDRESSU, D3DTADDRESS_CLAMP );
0318:     SAMP( 0, D3DSAMP_ADDRESSV, D3DTADDRESS_CLAMP );
0319: 
0320:     // ワールド行列
0321:     D3DXMATRIX matIdentity;
0322:     D3DXMatrixIdentity( &m_mWorld );
0323: 
0324:     // ビュー行列
0325:     D3DXVECTOR3 vFromPt   = D3DXVECTOR3( 0.0f, 0.0f, -5.0f );
0326:     D3DXVECTOR3 vLookatPt = D3DXVECTOR3( 0.0f, 0.0f, 0.0f );
0327:     D3DXVECTOR3 vUpVec    = D3DXVECTOR3( 0.0f, 1.0f, 0.0f );
0328:     D3DXMatrixLookAtLH( &m_mView, &vFromPt, &vLookatPt, &vUpVec );
0329: 
0330:     // 射影行列
0331:     FLOAT fAspect = ((FLOAT)m_d3dsdBackBuffer.Width) / m_d3dsdBackBuffer.Height;
0332:     D3DXMatrixPerspectiveFovLH( &m_mProj, D3DX_PI/4, fAspect, 1.0f, 100.0f );
0333: 
0334:     // フォント
0335:     m_pFont->RestoreDeviceObjects();
0336: 
0337:     // レンダリングターゲットの生成
0338:     if (FAILED(m_pd3dDevice->CreateDepthStencilSurface(RENDERING_WIDTH, RENDERING_HEIGHT, 
0339:         D3DFMT_D16, D3DMULTISAMPLE_NONE, 0, TRUE, &m_pMapZ, NULL)))
0340:         return E_FAIL;
0341:     if (FAILED(m_pd3dDevice->CreateTexture(RENDERING_WIDTH, RENDERING_HEIGHT, 1, 
0342:         D3DUSAGE_RENDERTARGET, D3DFMT_A32B32G32R32F, D3DPOOL_DEFAULT, &m_pOriginalTex, NULL)))
0343:         return E_FAIL;
0344:     // 縮小バッファ
0345:     if (FAILED(m_pOriginalTex->GetSurfaceLevel(0, &m_pOriginalSurf)))
0346:         return E_FAIL;
0347:     if (FAILED(m_pd3dDevice->CreateTexture(MAP_WIDTH, MAP_HEIGHT, 1, 
0348:         D3DUSAGE_RENDERTARGET, D3DFMT_A32B32G32R32F, D3DPOOL_DEFAULT, &m_pLumTex, NULL)))
0349:         return E_FAIL;
0350:     if (FAILED(m_pLumTex->GetSurfaceLevel(0, &m_pLumSurf)))
0351:         return E_FAIL;
0352:     // X軸方向のぼかし
0353:     if (FAILED(m_pd3dDevice->CreateTexture(MAP_WIDTH, MAP_HEIGHT, 1, 
0354:         D3DUSAGE_RENDERTARGET, D3DFMT_A32B32G32R32F, D3DPOOL_DEFAULT, &m_pXMap, NULL)))
0355:         return E_FAIL;
0356:     if (FAILED(m_pXMap->GetSurfaceLevel(0, &m_pXMapSurf)))
0357:         return E_FAIL;
0358:     // 大き目の円
0359:     if (FAILED(m_pd3dDevice->CreateTexture(MAP_WIDTH, MAP_HEIGHT, 1, 
0360:         D3DUSAGE_RENDERTARGET, D3DFMT_A32B32G32R32F, D3DPOOL_DEFAULT, &m_pLargeTex, NULL)))
0361:         return E_FAIL;
0362:     if (FAILED(m_pLargeTex->GetSurfaceLevel(0, &m_pLargeSurf)))
0363:         return E_FAIL;
0364:     // 小さ目の円
0365:     if (FAILED(m_pd3dDevice->CreateTexture(MAP_WIDTH, MAP_HEIGHT, 1, 
0366:         D3DUSAGE_RENDERTARGET, D3DFMT_A32B32G32R32F, D3DPOOL_DEFAULT, &m_pSmallTex, NULL)))
0367:         return E_FAIL;
0368:     if (FAILED(m_pSmallTex->GetSurfaceLevel(0, &m_pSmallSurf)))
0369:         return E_FAIL;
0370: 
0371:     m_pEffect->OnResetDevice();
0372: 
0373:     return S_OK;
0374: }
0375: 
0376: 
0377: 
0378: 
0379: //-------------------------------------------------------------
0380: // Name: FrameMove()
0381: // Desc: 毎フレーム呼ばれます。アニメの処理などを行います。
0382: //-------------------------------------------------------------
0383: HRESULT CMyD3DApplication::FrameMove()
0384: {
0385:     // 入力データの更新
0386:     UpdateInput( &m_UserInput );
0387: 
0388:     //---------------------------------------------------------
0389:     // 入力に応じて座標系を更新する
0390:     //---------------------------------------------------------
0391:     // 回転
0392:     D3DXMATRIX matRotY;
0393:     D3DXMATRIX matRotX;
0394: 
0395:     if( m_UserInput.bRotateLeft && !m_UserInput.bRotateRight )
0396:         m_fWorldRotY += m_fElapsedTime;
0397:     else
0398:     if( m_UserInput.bRotateRight && !m_UserInput.bRotateLeft )
0399:         m_fWorldRotY -= m_fElapsedTime;
0400: 
0401:     if( m_UserInput.bRotateUp && !m_UserInput.bRotateDown )
0402:         m_fWorldRotX += m_fElapsedTime;
0403:     else
0404:     if( m_UserInput.bRotateDown && !m_UserInput.bRotateUp )
0405:         m_fWorldRotX -= m_fElapsedTime;
0406: 
0407:     D3DXMatrixRotationX( &matRotX, m_fWorldRotX );
0408:     D3DXMatrixRotationY( &matRotY, m_fWorldRotY );
0409: 
0410:     D3DXMatrixMultiply( &m_mWorld, &matRotY, &matRotX );
0411:     
0412:     //---------------------------------------------------------
0413:     // ビュー行列の設定
0414:     //---------------------------------------------------------
0415:     // ズーム
0416:     if( m_UserInput.bZoomIn && !m_UserInput.bZoomOut )
0417:         m_fViewZoom += m_fElapsedTime;
0418:     else if( m_UserInput.bZoomOut && !m_UserInput.bZoomIn )
0419:         m_fViewZoom -= m_fElapsedTime;
0420: 
0421:     D3DXVECTOR3 vFromPt   = D3DXVECTOR3( 0.0f, 0.0f, -m_fViewZoom );
0422:     D3DXVECTOR3 vLookatPt = D3DXVECTOR3( 0.0f, 0.0f, 0.0f );
0423:     D3DXVECTOR3 vUpVec    = D3DXVECTOR3( 0.0f, 1.0f, 0.0f );
0424:     D3DXMatrixLookAtLH( &m_mView, &vFromPt, &vLookatPt, &vUpVec );
0425: 
0426:     return S_OK;
0427: }
0428: //-------------------------------------------------------------
0429: // Name: UpdateInput()
0430: // Desc: 入力データを更新する
0431: //-------------------------------------------------------------
0432: void CMyD3DApplication::UpdateInput( UserInput* pUserInput )
0433: {
0434:     pUserInput->bRotateUp    = ( m_bActive && (GetAsyncKeyState( VK_UP )    & 0x8000) == 0x8000 );
0435:     pUserInput->bRotateDown  = ( m_bActive && (GetAsyncKeyState( VK_DOWN )  & 0x8000) == 0x8000 );
0436:     pUserInput->bRotateLeft  = ( m_bActive && (GetAsyncKeyState( VK_LEFT )  & 0x8000) == 0x8000 );
0437:     pUserInput->bRotateRight = ( m_bActive && (GetAsyncKeyState( VK_RIGHT ) & 0x8000) == 0x8000 );
0438:     
0439:     pUserInput->bZoomIn      = ( m_bActive && (GetAsyncKeyState( 'Z'     )  & 0x8000) == 0x8000 );
0440:     pUserInput->bZoomOut     = ( m_bActive && (GetAsyncKeyState( 'X'      ) & 0x8000) == 0x8000 );
0441: }
0442: 
0443: 
0444: //-------------------------------------------------------------
0445: // Name: Render()
0446: // Desc: 画面を描画する.
0447: //-------------------------------------------------------------
0448: HRESULT CMyD3DApplication::Render()
0449: {
0450:     D3DXMATRIX m, mL, mR, mView, mProj;
0451:     LPDIRECT3DSURFACE9 pOldBackBuffer, pOldZBuffer;
0452:     D3DVIEWPORT9 oldViewport;
0453:     D3DXVECTOR4 v, light_pos;
0454:     D3DMATERIAL9 *pMtrl;
0455:     DWORD i;
0456: 
0457:     //---------------------------------------------------------
0458:     // 描画
0459:     //---------------------------------------------------------
0460:     if( SUCCEEDED( m_pd3dDevice->BeginScene() ) )
0461:     {
0462:         //-------------------------------------------------
0463:         // レンダリングターゲットの保存
0464:         //-------------------------------------------------
0465:         m_pd3dDevice->GetRenderTarget(0, &pOldBackBuffer);
0466:         m_pd3dDevice->GetDepthStencilSurface(&pOldZBuffer);
0467:         m_pd3dDevice->GetViewport(&oldViewport);
0468: 
0469:         if( m_pEffect != NULL ) 
0470:         {
0471:             //-------------------------------------------------
0472:             // レンダリングターゲットの変更
0473:             //-------------------------------------------------
0474:             m_pd3dDevice->SetRenderTarget(0, m_pOriginalSurf);
0475:             m_pd3dDevice->SetDepthStencilSurface(m_pMapZ);
0476:             // ビューポートの変更
0477:             D3DVIEWPORT9 viewport = {0,0      // 左上の座標
0478:                             , RENDERING_WIDTH  // 幅
0479:                             , RENDERING_HEIGHT // 高さ
0480:                             , 0.0f,1.0f};     // 前面、後面
0481:             m_pd3dDevice->SetViewport(&viewport);
0482: 
0483:             // レンダリングターゲットのクリア
0484:             m_pd3dDevice->Clear(0L, NULL
0485:                             , D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER
0486:                             , 0x000000, 1.0f, 0L);
0487: 
0488:             //-------------------------------------------------
0489:             // シーンの描画
0490:             //-------------------------------------------------
0491:             TSS( 0, D3DTSS_COLOROP,   D3DTOP_SELECTARG1 );
0492:             TSS( 0, D3DTSS_COLORARG1, D3DTA_DIFFUSE );
0493: 
0494:             m_pEffect->SetTechnique( m_hTechnique );
0495:             m_pEffect->Begin( NULL, 0 );
0496:             m_pEffect->Pass( PASS_SCENE );
0497: 
0498:             // 移動
0499:             D3DXMatrixTranslation( &m, 0.5f, 0.0f ,0.0f );
0500:             D3DXMatrixRotationY( &mR,  m_fTime );
0501:             mL = m * mR * m_mWorld;
0502:             // ライトの方向
0503:             D3DXMatrixInverse( &m, NULL, &mL);
0504:             light_pos = D3DXVECTOR4(1,1,-1,0);
0505:             D3DXVec4Transform( &v, &light_pos, &m );
0506:             v.w = 0;
0507:             D3DXVec4Normalize( &v, &v );
0508:             m_pEffect->SetVector( m_hvLightDir, &v );
0509:             // 視点
0510:             D3DXVECTOR3 vFromPt   = D3DXVECTOR3( 0.0f, 0.0f, -m_fViewZoom );
0511:             D3DXVec3Transform( &v, &vFromPt, &m );
0512:             m_pEffect->SetVector( m_hvEyePos, &v );
0513:             // ローカル-射影変換行列
0514:             m = mL * m_mView * m_mProj;
0515:             m_pEffect->SetMatrix( m_hmWVP, &m );
0516: 
0517:             pMtrl = m_pMesh->m_pMaterials;
0518:             for( i=0; i<m_pMesh->m_dwNumMaterials; i++ ) {
0519:                 v.x = pMtrl->Diffuse.r;
0520:                 v.y = pMtrl->Diffuse.g;
0521:                 v.z = pMtrl->Diffuse.b;
0522:                 v.w = pMtrl->Diffuse.a;
0523:                 m_pEffect->SetVector( m_hvCol, &v );
0524:                 m_pMesh->m_pLocalMesh->DrawSubset( i );  // 描画
0525:                 pMtrl++;
0526:             }
0527: 
0528:             m_pEffect->End();
0529: 
0530:             //-------------------------------------------------
0531:             // 縮小マップの作成
0532:             //-------------------------------------------------
0533:             m_pd3dDevice->SetRenderTarget(0, m_pLumSurf);
0534:             D3DVIEWPORT9 viewport_map = {0,0      // 左上の座標
0535:                         , MAP_WIDTH  // 幅
0536:                         , MAP_HEIGHT // 高さ
0537:                         , 0.0f,1.0f};     // 前面、後面
0538:             m_pd3dDevice->SetViewport(&viewport_map);
0539: 
0540:             RS( D3DRS_ZENABLE, FALSE );
0541:             RS( D3DRS_LIGHTING, FALSE );
0542:             TSS(0,D3DTSS_COLOROP,   D3DTOP_SELECTARG1);
0543:             TSS(0,D3DTSS_COLORARG1, D3DTA_TEXTURE);
0544:             TSS(1,D3DTSS_COLOROP,    D3DTOP_DISABLE);
0545: 
0546:             FLOAT w = (FLOAT)MAP_WIDTH;
0547:             FLOAT h = (FLOAT)MAP_HEIGHT;
0548:             FLOAT du = 0.5f/RENDERING_WIDTH;
0549:             FLOAT dv = 0.5f/RENDERING_HEIGHT;
0550:             TVERTEX Vertex0[4] = {
0551:                 //x  y   z    rhw    tu    tv
0552:                 { 0, 0, 0.1f, 1.0f, 0+du, 0+dv,},
0553:                 { w, 0, 0.1f, 1.0f, 1+du, 0+dv,},
0554:                 { w, h, 0.1f, 1.0f, 1+du, 1+dv,},
0555:                 { 0, h, 0.1f, 1.0f, 0+du, 1+dv,},
0556:             };
0557:             m_pd3dDevice->SetFVF( D3DFVF_XYZRHW | D3DFVF_TEX1 );
0558:             m_pd3dDevice->SetTexture(0, m_pOriginalTex);
0559: 
0560:             m_pEffect->SetTechnique( m_hTechnique );
0561:             m_pEffect->Begin( NULL, 0 );
0562:             m_pEffect->Pass( PASS_REDUCTION );
0563:             m_pEffect->SetTexture(m_htSrcMap, m_pOriginalTex);
0564: 
0565:             m_pd3dDevice->DrawPrimitiveUP( D3DPT_TRIANGLEFAN
0566:                                 , 2, Vertex0, sizeof( TVERTEX ) );
0567: 
0568:             m_pEffect->End();
0569: 
0570:             //-------------------------------------------------
0571:             // シェーダの設定
0572:             //-------------------------------------------------
0573:             m_pEffect->SetTechnique( m_hTechnique );
0574:             m_pEffect->Begin( NULL, 0 );
0575: 
0576:             //-------------------------------------------------
0577:             // 大きなぼかしx
0578:             //-------------------------------------------------
0579:             typedef struct {FLOAT p[3];FLOAT tu, tv;} VERTEX;
0580:             VERTEX Vertex1[4] = {
0581:                 //   x      y     z      tu tv
0582:                 {{  1.0f, -1.0f, 0.1f},   1, 1,},
0583:                 {{ -1.0f, -1.0f, 0.1f},   0, 1,},
0584:                 {{ -1.0f,  1.0f, 0.1f},   0, 0,},
0585:                 {{  1.0f,  1.0f, 0.1f},   1, 0,},
0586:             };
0587:             m_pd3dDevice->SetRenderTarget(0, m_pXMapSurf);
0588:             m_pEffect->Pass( PASS_X );
0589:             m_pEffect->SetVectorArray(m_hafWeight
0590:                                     , m_tbl[0], WEIGHT_MUN);
0591: 
0592:             m_pd3dDevice->SetVertexDeclaration( m_pDecl );
0593:             m_pEffect->SetTexture(m_htSrcMap, m_pLumTex);
0594:             m_pd3dDevice->DrawPrimitiveUP( D3DPT_TRIANGLEFAN
0595:                             , 2, Vertex1, sizeof( VERTEX ) );
0596: 
0597:             //-------------------------------------------------
0598:             // 大きなぼかしy
0599:             //-------------------------------------------------
0600:             m_pd3dDevice->SetRenderTarget(0, m_pLargeSurf);
0601:             m_pEffect->Pass( PASS_Y );
0602: 
0603:             m_pEffect->SetTexture(m_htSrcMap, m_pXMap);
0604:             m_pd3dDevice->DrawPrimitiveUP( D3DPT_TRIANGLEFAN
0605:                             , 2, Vertex1, sizeof( VERTEX ) );
0606: 
0607:             //-------------------------------------------------
0608:             // 小さなぼかしx
0609:             //-------------------------------------------------
0610:             m_pd3dDevice->SetRenderTarget(0, m_pXMapSurf);
0611:             m_pEffect->Pass( PASS_X );
0612:             m_pEffect->SetVectorArray(m_hafWeight
0613:                                     , m_tbl[1], WEIGHT_MUN);
0614: 
0615:             m_pEffect->SetTexture(m_htSrcMap, m_pLumTex);
0616:             m_pd3dDevice->DrawPrimitiveUP( D3DPT_TRIANGLEFAN
0617:                             , 2, Vertex1, sizeof( VERTEX ) );
0618: 
0619:             //-------------------------------------------------
0620:             // 小さなぼかしy
0621:             //-------------------------------------------------
0622:             m_pd3dDevice->SetRenderTarget(0, m_pSmallSurf);
0623:             m_pEffect->Pass( PASS_Y );
0624: 
0625:             m_pEffect->SetTexture(m_htSrcMap, m_pXMap);
0626:             m_pd3dDevice->DrawPrimitiveUP( D3DPT_TRIANGLEFAN
0627:                             , 2, Vertex1, sizeof( VERTEX ) );
0628: 
0629:             m_pEffect->End();
0630:         }
0631: 
0632:         //-----------------------------------------------------
0633:         // レンダリングターゲットを元に戻す
0634:         //-----------------------------------------------------
0635:         m_pd3dDevice->SetRenderTarget(0, pOldBackBuffer);
0636:         m_pd3dDevice->SetDepthStencilSurface(pOldZBuffer);
0637:         m_pd3dDevice->SetViewport(&oldViewport);
0638:         pOldBackBuffer->Release();
0639:         pOldZBuffer->Release();
0640: 
0641:         // バッファのクリア
0642:         m_pd3dDevice->Clear( 0L, NULL
0643:                         , D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER
0644:                         , 0x00404080, 1.0f, 0L );
0645: 
0646:         //-----------------------------------------------------
0647:         // そのまま張る
0648:         //-----------------------------------------------------
0649:         FLOAT w = (FLOAT)oldViewport.Width;
0650:         FLOAT h = (FLOAT)oldViewport.Height;
0651:         TVERTEX Vertex1[4] = {
0652:             //x  y   z    rhw  tu tv
0653:             { 0, 0, 0.1f, 1.0f, 0+0.5f/RENDERING_WIDTH, 0+0.5f/RENDERING_HEIGHT,},
0654:             { w, 0, 0.1f, 1.0f, 1+0.5f/RENDERING_WIDTH, 0+0.5f/RENDERING_HEIGHT,},
0655:             { w, h, 0.1f, 1.0f, 1+0.5f/RENDERING_WIDTH, 1+0.5f/RENDERING_HEIGHT,},
0656:             { 0, h, 0.1f, 1.0f, 0+0.5f/RENDERING_WIDTH, 1+0.5f/RENDERING_HEIGHT,},
0657:         };
0658:         m_pd3dDevice->SetFVF( D3DFVF_XYZRHW | D3DFVF_TEX1 );
0659:         m_pd3dDevice->SetTexture(0, m_pOriginalTex);
0660:         m_pd3dDevice->DrawPrimitiveUP( D3DPT_TRIANGLEFAN
0661:                             , 2, Vertex1, sizeof( TVERTEX ) );
0662:         
0663:         //-----------------------------------------------------
0664:         // 最終的に合成する
0665:         //-----------------------------------------------------
0666:         if(m_pEffect){
0667:             FLOAT du = 1.5f/MAP_WIDTH;
0668:             FLOAT dv = 1.5f/MAP_HEIGHT;
0669:             T2VERTEX Vertex2[4] = {
0670:                 //   x    y   z    rhw     tu1      tv1      tu2      tv2
0671:                 { 0.0f,   0, 0.1f, 1.0f, 0.0f+du, 0.0f+dv, 0.0f+du, 0.0f+dv,},
0672:                 { 1.0f*w, 0, 0.1f, 1.0f, 1.0f+du, 0.0f+dv, 1.0f+du, 0.0f+dv,},
0673:                 { 1.0f*w, h, 0.1f, 1.0f, 1.0f+du, 1.0f+dv, 1.0f+du, 1.0f+dv,},
0674:                 { 0.0f,   h, 0.1f, 1.0f, 0.0f+du, 1.0f+dv, 0.0f+du, 1.0f+dv,},
0675:             };
0676:             m_pEffect->SetTechnique( m_hTechnique );
0677:             m_pEffect->Begin( NULL, 0 );
0678:             m_pEffect->Pass( PASS_FINAL );
0679: 
0680:             RS(D3DRS_ALPHABLENDENABLE, TRUE);
0681:             RS(D3DRS_SRCBLEND , D3DBLEND_ONE);
0682:             RS(D3DRS_DESTBLEND , D3DBLEND_ONE);
0683:             m_pd3dDevice->SetFVF( D3DFVF_XYZRHW | D3DFVF_TEX2 );
0684:             m_pEffect->SetTexture(m_htSrcMap,  m_pLargeTex);
0685:             m_pEffect->SetTexture(m_htSrcMap2, m_pSmallTex);
0686:             m_pd3dDevice->DrawPrimitiveUP( D3DPT_TRIANGLEFAN
0687:                                 , 2, Vertex2, sizeof( T2VERTEX ) );
0688:             m_pEffect->End();
0689:         }
0690: 
0691:         RS( D3DRS_ZENABLE, TRUE );
0692:         RS( D3DRS_LIGHTING, TRUE );
0693:         RS(D3DRS_ALPHABLENDENABLE, FALSE );
0694: 
0695:         // ヘルプの表示
0696:         RenderText();
0697: 
0698: #if 1 // デバッグ用にテクスチャを表示する
0699:         {
0700:         m_pd3dDevice->SetTextureStageState(0,D3DTSS_COLOROP,    D3DTOP_SELECTARG1);
0701:         m_pd3dDevice->SetTextureStageState(0,D3DTSS_COLORARG1,  D3DTA_TEXTURE);
0702:         m_pd3dDevice->SetTextureStageState(1,D3DTSS_COLOROP,    D3DTOP_DISABLE);
0703:         m_pd3dDevice->SetVertexShader(NULL);
0704:         m_pd3dDevice->SetFVF( D3DFVF_XYZRHW | D3DFVF_TEX1 );
0705:         m_pd3dDevice->SetPixelShader(0);
0706:         float scale = 100.0f;
0707:         for(DWORD i=0; i<5; i++){
0708:             TVERTEX Vertex[4] = {
0709:                 // x  y  z rhw tu tv
0710:                 {(i+0)*scale,    0,0, 1, 0, 0,},
0711:                 {(i+1)*scale,    0,0, 1, 1, 0,},
0712:                 {(i+1)*scale,scale,0, 1, 1, 1,},
0713:                 {(i+0)*scale,scale,0, 1, 0, 1,},
0714:             };
0715:             if(0==i) m_pd3dDevice->SetTexture( 0, m_pOriginalTex );
0716:             if(1==i) m_pd3dDevice->SetTexture( 0, m_pLumTex );
0717:             if(2==i) m_pd3dDevice->SetTexture( 0, m_pXMap );
0718:             if(3==i) m_pd3dDevice->SetTexture( 0, m_pLargeTex );
0719:             if(4==i) m_pd3dDevice->SetTexture( 0, m_pSmallTex );
0720:             m_pd3dDevice->DrawPrimitiveUP( D3DPT_TRIANGLEFAN, 2, Vertex, sizeof( TVERTEX ) );
0721:         }
0722:         }
0723: #endif      
0724: 
0725:         // 描画の終了
0726:         m_pd3dDevice->EndScene();
0727:     }
0728: 
0729:     return S_OK;
0730: }
0731: 
0732: 
0733: 
0734: 
0735: //-------------------------------------------------------------
0736: // Name: RenderText()
0737: // Desc: 状態やヘルプを画面に表示する
0738: //-------------------------------------------------------------
0739: HRESULT CMyD3DApplication::RenderText()
0740: {
0741:     D3DCOLOR fontColor        = D3DCOLOR_ARGB(255,255,255,0);
0742:     TCHAR szMsg[MAX_PATH] = TEXT("");
0743: 
0744:     FLOAT fNextLine = 40.0f; // 表示する高さ
0745: 
0746:     // 操作法やパラメータを表示する
0747:     fNextLine = (FLOAT) m_d3dsdBackBuffer.Height; 
0748:     lstrcpy( szMsg, TEXT("Press 'F2' to configure display") );
0749:     fNextLine -= 20.0f;
0750:     m_pFont->DrawText( 2, fNextLine, fontColor, szMsg );
0751: 
0752:     lstrcpy( szMsg, m_strDeviceStats );
0753:     fNextLine -= 20.0f;
0754:     m_pFont->DrawText( 2, fNextLine, fontColor, szMsg );
0755:     lstrcpy( szMsg, m_strFrameStats );
0756:     fNextLine -= 20.0f;
0757:     m_pFont->DrawText( 2, fNextLine, fontColor, szMsg );
0758:     
0759:     return S_OK;
0760: }
0761: 
0762: 
0763: 
0764: 
0765: //-------------------------------------------------------------
0766: // Name: MsgProc()
0767: // Desc: WndProc をオーバーライドしたもの
0768: //-------------------------------------------------------------
0769: LRESULT CMyD3DApplication::MsgProc( HWND hWnd, UINT msg,
0770:                                  WPARAM wParam, LPARAM lParam )
0771: {
0772:     switch( msg )
0773:     {
0774:         case WM_PAINT:
0775:         {
0776:             if( m_bLoadingApp )
0777:             {
0778:                 // ロード中
0779:                 HDC hDC = GetDC( hWnd );
0780:                 TCHAR strMsg[MAX_PATH];
0781:                 wsprintf(strMsg, TEXT("Loading... Please wait"));
0782:                 RECT rct;
0783:                 GetClientRect( hWnd, &rct );
0784:                 DrawText( hDC, strMsg, -1, &rct
0785:                         , DT_CENTER|DT_VCENTER|DT_SINGLELINE );
0786:                 ReleaseDC( hWnd, hDC );
0787:             }
0788:             break;
0789:         }
0790: 
0791:     }
0792: 
0793:     return CD3DApplication::MsgProc( hWnd, msg, wParam, lParam );
0794: }
0795: 
0796: 
0797: 
0798: 
0799: //-------------------------------------------------------------
0800: // Name: InvalidateDeviceObjects()
0801: // Desc: RestoreDeviceObjects() で作成したオブジェクトの開放
0802: //-------------------------------------------------------------
0803: HRESULT CMyD3DApplication::InvalidateDeviceObjects()
0804: {
0805:     // シャドウマップ
0806:     SAFE_RELEASE(m_pLargeSurf);
0807:     SAFE_RELEASE(m_pLargeTex);
0808:     SAFE_RELEASE(m_pSmallSurf);
0809:     SAFE_RELEASE(m_pSmallTex);
0810:     SAFE_RELEASE(m_pXMapSurf);
0811:     SAFE_RELEASE(m_pXMap);
0812:     SAFE_RELEASE(m_pLumSurf);
0813:     SAFE_RELEASE(m_pLumTex);
0814:     SAFE_RELEASE(m_pOriginalSurf);
0815:     SAFE_RELEASE(m_pOriginalTex);
0816:     SAFE_RELEASE(m_pMapZ);
0817: 
0818:     m_pMesh  ->InvalidateDeviceObjects(); // メッシュ
0819: 
0820:     m_pFont->InvalidateDeviceObjects(); // フォント
0821: 
0822:     // シェーダ
0823:     if( m_pEffect != NULL ) m_pEffect->OnLostDevice();
0824: 
0825:     return S_OK;
0826: }
0827: 
0828: 
0829: 
0830: 
0831: //-------------------------------------------------------------
0832: // Name: DeleteDeviceObjects()
0833: // Desc: InitDeviceObjects() で作成したオブジェクトを開放する
0834: //-------------------------------------------------------------
0835: HRESULT CMyD3DApplication::DeleteDeviceObjects()
0836: {
0837:     // シェーダ
0838:     SAFE_RELEASE( m_pEffect );
0839:     SAFE_RELEASE( m_pDecl );
0840:     
0841:     // メッシュ
0842:     m_pMesh  ->Destroy();
0843: 
0844:     // フォント
0845:     m_pFont->DeleteDeviceObjects();
0846: 
0847:     return S_OK;
0848: }
0849: 
0850: 
0851: 
0852: 
0853: //-------------------------------------------------------------
0854: // Name: FinalCleanup()
0855: // Desc: 終了する直線に呼ばれる
0856: //-------------------------------------------------------------
0857: HRESULT CMyD3DApplication::FinalCleanup()
0858: {
0859:     SAFE_DELETE( m_pMesh );
0860: 
0861:     SAFE_DELETE( m_pFont ); // フォント
0862: 
0863:     return S_OK;
0864: }
0865: 
0866: 
0867: 
0868: 
0869: