0001: // ----------------------------------------------------------------------------
0002: //
0003: // draw.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 "main.h"
0013: #include "draw.h"
0014: #include "load.h"
0015:
0016: #define RENDER_CAR0 (1<<0)
0017: #define RENDER_CAR1 (1<<1)
0018: #define RENDER_BG (1<<2)
0019:
0020: static const int SHADOWMAP_HEIGHT = 512;
0021: static const int SHADOWMAP_WIDTH = 512;
0022:
0023: LPDIRECT3DVERTEXBUFFER8 pMeshVB = NULL;
0024: LPDIRECT3DINDEXBUFFER8 pMeshIndex = NULL;
0025: D3DXATTRIBUTERANGE *pSubsetTable = NULL;
0026: DWORD nMeshFaces = 0;
0027: DWORD nMeshVertices = 0;
0028: D3DMATERIAL8 *pMeshMaterials = NULL; // メッシュの質感
0029: LPDIRECT3DTEXTURE8 *pMeshTextures = NULL; // メッシュのテクスチャー
0030: DWORD dwNumMaterials = 0L; // マテリアルの数
0031: FLOAT MeshRadius; // メッシュの大きさ
0032:
0033: DWORD hVertexShader=~0; // モデルの描画
0034: DWORD hPixelShader=~0; // モデルの描画
0035: DWORD hVertexShaderFish=~0; // モデルの描画
0036: DWORD hPixelShaderFish=~0; // モデルの描画
0037: DWORD hVertexShaderDPEM=~0; // モデルの描画
0038: DWORD hPixelShaderDPEM=~0; // モデルの描画
0039:
0040: LPDIRECT3DTEXTURE8 pTexture0[2];
0041: LPDIRECT3DTEXTURE8 pTexture1[2];
0042: LPDIRECT3DSURFACE8 pTextureSurface0[2];
0043: LPDIRECT3DSURFACE8 pTextureSurface1[2];
0044: LPDIRECT3DSURFACE8 pBackbuffer = NULL;
0045: LPDIRECT3DSURFACE8 lpZbuffer = NULL;
0046:
0047: // ----------------------------------------------------------------------------
0048: // 外部関数
0049: void InitBg(LPDIRECT3DDEVICE8 lpD3DDev);
0050: void DrawBg(LPDIRECT3DDEVICE8 lpD3DDev);
0051: void CleanBg(LPDIRECT3DDEVICE8 lpD3DDev);
0052:
0053:
0054:
0055: // ----------------------------------------------------------------------------
0056: // Name: LoadXFile(char* filename, LPDIRECT3DDEVICE8 lpD3DDev)
0057: // Desc: X-Fileの読み込み
0058: //-----------------------------------------------------------------------------
0059: HRESULT LoadXFile(char* filename, LPDIRECT3DDEVICE8 lpD3DDev)
0060: {
0061: LPD3DXMESH pMesh, pMeshOpt;
0062: LPD3DXBUFFER pD3DXMtrlBuffer = NULL;
0063: DWORD i;
0064: HRESULT hr;
0065:
0066: hr = D3DXLoadMeshFromX(filename, D3DXMESH_MANAGED,
0067: lpD3DDev, NULL,
0068: &pD3DXMtrlBuffer, &dwNumMaterials,
0069: &pMesh);
0070: if(FAILED(hr)) return E_FAIL;
0071:
0072: //並び替えておく
0073: pMesh->Optimize(D3DXMESHOPT_ATTRSORT, NULL, NULL, NULL, NULL, &pMeshOpt);
0074: RELEASE(pMesh);
0075:
0076: //アトリビュートテーブル
0077: pMeshOpt->GetAttributeTable(NULL,&dwNumMaterials);
0078: pSubsetTable = new D3DXATTRIBUTERANGE[dwNumMaterials];
0079: pMeshOpt->GetAttributeTable(pSubsetTable, &dwNumMaterials);
0080:
0081: // FVF変換
0082: hr = pMeshOpt->CloneMeshFVF(pMeshOpt->GetOptions(), D3DFVF_VERTEX, lpD3DDev, &pMesh);
0083: if(FAILED(hr)) return E_FAIL;
0084: RELEASE(pMeshOpt);
0085: D3DXComputeNormals(pMesh, NULL);
0086:
0087: //Vertex Bufferにコピーする
0088: D3DVERTEX* pSrc;
0089: D3D_CUSTOMVERTEX* pDest;
0090: LPDIRECT3DINDEXBUFFER8 pSrcIndex;
0091: WORD* pISrc;
0092: WORD* pIDest;
0093:
0094: DWORD nMeshVertices = pMesh->GetNumVertices();
0095: DWORD nMeshFaces = pMesh->GetNumFaces();
0096: lpD3DDev->CreateVertexBuffer(nMeshVertices * sizeof(D3D_CUSTOMVERTEX),0,D3DFVF_CUSTOMVERTEX,D3DPOOL_MANAGED,&pMeshVB);
0097: lpD3DDev->CreateIndexBuffer(nMeshFaces * 3 * sizeof(WORD),0,D3DFMT_INDEX16,D3DPOOL_MANAGED,&pMeshIndex);
0098:
0099: LPDIRECT3DVERTEXBUFFER8 pVB;
0100: pMesh->GetVertexBuffer(&pVB);
0101: pVB->Lock(0,0,(BYTE**)&pSrc,0);
0102: pMeshVB->Lock(0,0,(BYTE**)&pDest,0);
0103: MeshRadius = 0.0f;
0104: for(i=0;i<nMeshVertices;i++){
0105: pDest->x = pSrc->x;
0106: pDest->y = pSrc->y;
0107: pDest->z = pSrc->z;
0108: pDest->nx = pSrc->nx;
0109: pDest->ny = pSrc->ny;
0110: pDest->nz = pSrc->nz;
0111: pDest->tu0 = pSrc->tu0;
0112: pDest->tu0 = pSrc->tu0;
0113: // サイズの計算
0114: FLOAT radius = sqrtf( pSrc->x*pSrc->x + pSrc->y*pSrc->y + pSrc->z*pSrc->z );
0115: if (MeshRadius < radius) MeshRadius = radius;
0116:
0117: pSrc += 1;
0118: pDest += 1;
0119: }
0120: pVB->Unlock();
0121: pVB->Release();
0122: pMeshVB->Unlock();
0123:
0124: //インデックスのコピー
0125: pMesh->GetIndexBuffer(&pSrcIndex);
0126: pSrcIndex->Lock(0,0,(BYTE**)&pISrc,0);
0127: pMeshIndex->Lock(0,0,(BYTE**)&pIDest,0);
0128: CopyMemory(pIDest,pISrc,nMeshFaces * 3 * sizeof(WORD));
0129: pSrcIndex->Unlock();
0130: pMeshIndex->Unlock();
0131: pSrcIndex->Release();
0132:
0133: // pD3DXMtrlBuffer から、質感やテクスチャーの情報を読み取る
0134: D3DXMATERIAL* d3dxMaterials = (D3DXMATERIAL*)pD3DXMtrlBuffer->GetBufferPointer();
0135: pMeshTextures = new LPDIRECT3DTEXTURE8[dwNumMaterials];
0136: pMeshMaterials = new D3DMATERIAL8[dwNumMaterials];
0137:
0138: for(i = 0; i < dwNumMaterials; i++){
0139: pMeshMaterials[i] = d3dxMaterials[i].MatD3D;
0140: pMeshMaterials[i].Ambient = pMeshMaterials[i].Diffuse;
0141: hr = D3DXCreateTextureFromFile( lpD3DDev,
0142: d3dxMaterials[i].pTextureFilename,
0143: &pMeshTextures[i] );
0144: if(FAILED(hr)) pMeshTextures[i] = NULL;
0145: }
0146: RELEASE(pD3DXMtrlBuffer);
0147:
0148: RELEASE(pMesh);
0149:
0150: return S_OK;
0151: }
0152:
0153: //-----------------------------------------------------------------------------
0154: // Name: InitRender()
0155: // Desc: Load the mesh and build the material and texture arrays
0156: //-----------------------------------------------------------------------------
0157: HRESULT InitRender(LPDIRECT3DDEVICE8 lpD3DDev)
0158: {
0159: HRESULT hr;
0160:
0161: // モデルの読み込み
0162: if ( FAILED(hr = LoadXFile("nsx.x", lpD3DDev)) ) return hr;
0163:
0164: // バーテックスシェーダーを作成する
0165: if ( FAILED(CVertexShaderMgr::Load(lpD3DDev, "vs.vsh", &hVertexShader, dwDecl)) ) return hr;
0166: if ( FAILED( CPixelShaderMgr::Load(lpD3DDev, "ps.psh", &hPixelShader)) ) return hr;
0167: if ( FAILED(CVertexShaderMgr::Load(lpD3DDev, "fish.vsh", &hVertexShaderFish, dwDecl)) ) return hr;
0168: if ( FAILED( CPixelShaderMgr::Load(lpD3DDev, "fish.psh", &hPixelShaderFish)) ) return hr;
0169: if ( FAILED(CVertexShaderMgr::Load(lpD3DDev, "dpem.vsh", &hVertexShaderDPEM, dwDecl)) ) return hr;
0170: if ( FAILED( CPixelShaderMgr::Load(lpD3DDev, "dpem.psh", &hPixelShaderDPEM)) ) return hr;
0171:
0172: // 描画用テクスチャーを用意する(2枚分)
0173: if ( FAILED(hr = lpD3DDev->GetRenderTarget(&pBackbuffer))) return hr;
0174: D3DSURFACE_DESC Desc;
0175: if ( FAILED(hr = pBackbuffer->GetDesc( &Desc ))) return hr;
0176:
0177: if( FAILED(hr = lpD3DDev->GetDepthStencilSurface( &lpZbuffer ))) return hr; // 深度バッファのサーフェスを確保する
0178: for( int i = 0; i < 2; i++ ){
0179: if( FAILED(hr = lpD3DDev->CreateTexture(WIDTH,HEIGHT, 1 ,D3DUSAGE_RENDERTARGET, Desc.Format, D3DPOOL_DEFAULT, &pTexture0[i]))) return hr;// テクスチャーの生成
0180: if( FAILED(hr = pTexture0[i]->GetSurfaceLevel(0,&pTextureSurface0[i]))) return hr; // テクスチャーとサーフェスを関連づける
0181: if( FAILED(hr = lpD3DDev->SetRenderTarget(pTextureSurface0[i], lpZbuffer ))) return hr; // テクスチャー用の描画と深度バッファを関連付ける
0182:
0183: if( FAILED(hr = lpD3DDev->CreateTexture(WIDTH,HEIGHT, 1 ,D3DUSAGE_RENDERTARGET, Desc.Format, D3DPOOL_DEFAULT, &pTexture1[i]))) return hr;// テクスチャーの生成
0184: if( FAILED(hr = pTexture1[i]->GetSurfaceLevel(0,&pTextureSurface1[i]))) return hr; // テクスチャーとサーフェスを関連づける
0185: if( FAILED(hr = lpD3DDev->SetRenderTarget(pTextureSurface1[i], lpZbuffer ))) return hr; // テクスチャー用の描画と深度バッファを関連付ける
0186: }
0187: // 描画を元の画面に戻す
0188: lpD3DDev->SetRenderTarget(pBackbuffer, lpZbuffer );
0189:
0190:
0191: // 背景部分の初期化
0192: InitBg(lpD3DDev);
0193:
0194: // 不変なレジスタの設定
0195: lpD3DDev->SetRenderState( D3DRS_ZENABLE, TRUE );
0196: lpD3DDev->SetRenderState( D3DRS_LIGHTING, FALSE );
0197: lpD3DDev->SetRenderState( D3DRS_ALPHABLENDENABLE, FALSE);
0198: lpD3DDev->SetVertexShaderConstant(12, &D3DXVECTOR4(1.0f/1.41421356f, 0.5f, 1.0f, 2.0f), 1);
0199:
0200:
0201: return S_OK;
0202: }
0203: //-----------------------------------------------------------------------------
0204: // Name: Render()
0205: // Desc: Draws the scene
0206: //-----------------------------------------------------------------------------
0207: const float z_min = 0.5f;
0208: const float z_max = 100.0f;
0209: D3DXVECTOR4 lightDir(1.0f, 1.0f, 0.5f, 0.0f);
0210:
0211: VOID DrawModel(LPDIRECT3DDEVICE8 lpD3DDev, unsigned int flag, unsigned int center_flag, int back)
0212: {
0213: D3DXMATRIX mWorld, mView, mProj;
0214: D3DXMATRIX mWorld0;
0215: D3DXMATRIX mWorld1;
0216: D3DXMATRIX m;
0217: D3DXVECTOR4 vl;
0218: DWORD i;
0219:
0220: // ------------------------------------------------------------------------
0221: // ワールド行列
0222: // ------------------------------------------------------------------------
0223:
0224: // 外側もでる
0225: int t = timeGetTime()%314159;
0226: D3DXMatrixTranslation(&m, 1.5f*MeshRadius,0,0);
0227: D3DXMatrixRotationY( &mWorld0, t/1000.0f );
0228: //D3DXMatrixRotationY( &mWorld0, -0.2*PI/2 ); // 撮影角度
0229: mWorld0 = m * mWorld0;
0230:
0231: // 内側もでる
0232: D3DXMatrixRotationY( &mWorld1, -t/3000.0f );
0233: //D3DXMatrixRotationY( &mWorld1, 1.4f*PI/2 ); // 撮影角度
0234:
0235: // ------------------------------------------------------------------------
0236: // ビュー行列
0237: // ------------------------------------------------------------------------
0238:
0239: D3DXVECTOR3 eye(0.0f,1.4f*MeshRadius,2.5f*MeshRadius);
0240: D3DXVECTOR3 lookAt(0.0f, 0.0f, 0.0f);
0241: D3DXVECTOR3 up(0.0f, 1.0f, 0.0f);
0242:
0243: switch(center_flag){
0244: case RENDER_CAR0:
0245: eye.x = mWorld0._41;
0246: eye.y = mWorld0._42+0.4f*MeshRadius;
0247: eye.z = mWorld0._43;
0248: lookAt.x = eye.x;
0249: lookAt.y = eye.y;
0250: if(back){
0251: lookAt.z = eye.z-1.0f;
0252: }else{
0253: lookAt.z = eye.z+1.0f;
0254: }
0255: break;
0256: case RENDER_CAR1:
0257: eye.x = mWorld1._41;
0258: eye.y = mWorld1._42+0.4f*MeshRadius;
0259: eye.z = mWorld1._43;
0260: lookAt.x = eye.x;
0261: lookAt.y = eye.y;
0262: if(back){
0263: lookAt.z = eye.z-1.0f;
0264: }else{
0265: lookAt.z = eye.z+1.0f;
0266: }
0267: break;
0268: case RENDER_BG:
0269: default:
0270: break;
0271: }
0272: lpD3DDev->SetVertexShaderConstant(16, &eye, 1);
0273: D3DXMatrixLookAtLH(&mView, &eye, &lookAt, &up);
0274:
0275: D3DXVECTOR3 ne = lookAt-eye;
0276: D3DXVec3Normalize(&ne,&ne);
0277:
0278: // 射影行列(比較用)
0279: D3DXMatrixPerspectiveFovLH(&mProj
0280: , D3DXToRadian(60.0f) // 視野角
0281: , (float)WIDTH/(float)HEIGHT // アスペクト比
0282: , 0.1f, 100.f // 最近接距離,最遠方距離
0283: );
0284: D3DXMatrixTranspose( &mProj , &mProj);
0285: lpD3DDev->SetVertexShaderConstant(4,&mProj, 4);
0286:
0287: lpD3DDev->SetVertexShaderConstant(15, &D3DXVECTOR4(z_max/(z_max-z_min), -z_max*z_min/(z_max-z_min), 0.0f, 0.0f), 1);
0288:
0289:
0290: //
0291: // 外側もでる描画
0292: //
0293: lpD3DDev->SetStreamSource(0, pMeshVB, sizeof(D3D_CUSTOMVERTEX));
0294: lpD3DDev->SetIndices(pMeshIndex,0);
0295:
0296: if(flag&RENDER_CAR0){
0297: D3DXVECTOR3 nw = D3DXVECTOR3(mWorld0._41,mWorld0._42,mWorld0._43)-eye;
0298: D3DXVec3Normalize(&nw,&nw);
0299: if(-0.7f<nw.x*ne.x+nw.y*ne.y+nw.z*ne.z){
0300: m = mWorld0 * mView;
0301: D3DXMatrixTranspose( &m , &m);
0302: lpD3DDev->SetVertexShaderConstant(0,&m, 4);
0303: D3DXMatrixTranspose( &m , &mWorld0);
0304: lpD3DDev->SetVertexShaderConstant(8,&m, 4);
0305:
0306: D3DXMatrixInverse( &m, NULL, &mWorld0);
0307: D3DXVec4Transform(&vl, &lightDir, &m);
0308: D3DXVec4Normalize(&vl, &vl);
0309: vl[3] = 0.1f;// w成分は環境色の強さ
0310: lpD3DDev->SetVertexShaderConstant(13, &vl, 1);
0311:
0312: for(i=0;i<dwNumMaterials;i++){
0313: //色をセット
0314: D3DXVECTOR4 vl;
0315: vl.x = pMeshMaterials[i].Diffuse.r;
0316: vl.y = pMeshMaterials[i].Diffuse.g;
0317: vl.z = pMeshMaterials[i].Diffuse.b;
0318: lpD3DDev->SetVertexShaderConstant(14, &vl, 1);
0319:
0320: lpD3DDev->DrawIndexedPrimitive(D3DPT_TRIANGLELIST,
0321: pSubsetTable[i].VertexStart,
0322: pSubsetTable[i].VertexCount,
0323: pSubsetTable[i].FaceStart * 3,
0324: pSubsetTable[i].FaceCount);
0325: }
0326: }
0327: }
0328: //
0329: // モデル2
0330: //
0331: if(flag&RENDER_CAR1){
0332: D3DXVECTOR3 nw = D3DXVECTOR3(mWorld1._41,mWorld1._42,mWorld1._43)-eye;
0333: D3DXVec3Normalize(&nw,&nw);
0334: if(-0.7f<nw.x*ne.x+nw.y*ne.y+nw.z*ne.z){
0335: m = mWorld1 * mView;
0336: D3DXMatrixTranspose( &m , &m);
0337: lpD3DDev->SetVertexShaderConstant(0,&m, 4);
0338: D3DXMatrixTranspose( &m , &mWorld1);
0339: lpD3DDev->SetVertexShaderConstant(8,&m, 4);
0340:
0341: D3DXMatrixInverse( &m, NULL, &mWorld1);
0342: D3DXVec4Transform(&vl, &lightDir, &m);
0343: D3DXVec4Normalize(&vl, &vl);
0344: vl[3] = 0.1f;// w成分は環境色の強さ
0345: lpD3DDev->SetVertexShaderConstant(13, &vl, 1);
0346:
0347: for(i=0;i<dwNumMaterials;i++){
0348: //色をセット
0349: D3DXVECTOR4 vl;
0350: vl.x = pMeshMaterials[i].Diffuse.r;
0351: vl.y = pMeshMaterials[i].Diffuse.g;
0352: vl.z = pMeshMaterials[i].Diffuse.b;
0353: lpD3DDev->SetVertexShaderConstant(14, &vl, 1);
0354:
0355: lpD3DDev->DrawIndexedPrimitive(D3DPT_TRIANGLELIST,
0356: pSubsetTable[i].VertexStart,
0357: pSubsetTable[i].VertexCount,
0358: pSubsetTable[i].FaceStart * 3,
0359: pSubsetTable[i].FaceCount);
0360: }
0361: }
0362: }
0363:
0364: //
0365: // 背景描画
0366: //
0367: if(flag&RENDER_BG){
0368: D3DXMatrixScaling(&mWorld, 3.0f, 3.0f, 3.0f);
0369: m = mWorld * mView;
0370: D3DXMatrixTranspose( &m , &m);
0371: lpD3DDev->SetVertexShaderConstant(0,&m, 4);
0372:
0373: lpD3DDev->SetVertexShaderConstant(13, &D3DXVECTOR4(0.0f, 0.0f, 0.0f, 0.0f), 1);
0374: lpD3DDev->SetVertexShaderConstant(14, &D3DXVECTOR4(0.0f, 0.0f, 0.0f, 0.0f), 1);
0375: DrawBg(lpD3DDev);
0376: }
0377: }
0378: //-----------------------------------------------------------------------------
0379: // Name: Render()
0380: // Desc: Draws the scene
0381: //-----------------------------------------------------------------------------
0382: VOID Render(LPDIRECT3DDEVICE8 lpD3DDev)
0383: {
0384: // ------------------------------------------------------------------------
0385: // 真中の車(CAR0)のテクスチャーの作成
0386: // ------------------------------------------------------------------------
0387: // step1 環境マップ1
0388: lpD3DDev->SetVertexShader(hVertexShaderFish);
0389: lpD3DDev->SetPixelShader(hPixelShaderFish);
0390:
0391: lpD3DDev->SetRenderTarget(pTextureSurface0[0], lpZbuffer);
0392: lpD3DDev->Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, 0x004080, 1.0f, 0L);
0393: lpD3DDev->SetTexture( 0, NULL );
0394: DrawModel(lpD3DDev, RENDER_CAR1|RENDER_BG, RENDER_CAR0, 0);
0395:
0396: // step2 環境マップ2
0397: lpD3DDev->SetRenderTarget(pTextureSurface0[1], lpZbuffer);
0398: lpD3DDev->Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, 0x004080, 1.0f, 0L);
0399: lpD3DDev->SetTexture( 0, NULL );
0400: DrawModel(lpD3DDev, RENDER_CAR1|RENDER_BG, RENDER_CAR0, 1);
0401:
0402: // ------------------------------------------------------------------------
0403: // 外側の車(CAR1)のテクスチャーの作成
0404: // ------------------------------------------------------------------------
0405: // step1 環境マップ1
0406: lpD3DDev->SetRenderTarget(pTextureSurface1[0], lpZbuffer);
0407: lpD3DDev->Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, 0x004080, 1.0f, 0L);
0408: lpD3DDev->SetTexture( 0, NULL );
0409: DrawModel(lpD3DDev, RENDER_CAR0|RENDER_BG, RENDER_CAR1, 0);
0410: // step2 環境マップ2
0411: lpD3DDev->SetRenderTarget(pTextureSurface1[1], lpZbuffer);
0412: lpD3DDev->Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, 0x004080, 1.0f, 0L);
0413: lpD3DDev->SetTexture( 0, NULL );
0414: DrawModel(lpD3DDev, RENDER_CAR0|RENDER_BG, RENDER_CAR1, 1);
0415: // ------------------------------------------------------------------------
0416: // スクリーンに描画
0417: // ------------------------------------------------------------------------
0418: // 描画を戻す
0419: lpD3DDev->SetRenderTarget(pBackbuffer, lpZbuffer );
0420: lpD3DDev->Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, 0x000000, 1.0f, 0L);
0421: lpD3DDev->SetVertexShader(hVertexShaderDPEM);
0422: lpD3DDev->SetPixelShader(hPixelShaderDPEM);
0423:
0424: // step1 車0描画
0425: lpD3DDev->SetTexture( 0, pTexture0[0] );
0426: lpD3DDev->SetTexture( 1, pTexture0[1] );
0427: DrawModel(lpD3DDev, RENDER_CAR0, RENDER_BG, -1);
0428:
0429: // step2 車1描画
0430: lpD3DDev->SetTexture( 0, pTexture1[0] );
0431: lpD3DDev->SetTexture( 1, pTexture1[1] );
0432: DrawModel(lpD3DDev, RENDER_CAR1, RENDER_BG, -1);
0433:
0434: // step3 背景描画
0435: lpD3DDev->SetVertexShader(hVertexShader);
0436: lpD3DDev->SetPixelShader(hPixelShader);
0437: lpD3DDev->SetTexture( 0, NULL );
0438: lpD3DDev->SetTexture( 1, NULL );
0439: lpD3DDev->SetTexture( 2, NULL );
0440: DrawModel(lpD3DDev, RENDER_BG, RENDER_BG, -1);
0441:
0442: // ------------------------------------------------------------------------
0443: // 念のため、他のレンダーでおかしくならないように
0444: // ------------------------------------------------------------------------
0445: lpD3DDev->SetTexture( 0, NULL );
0446: lpD3DDev->SetTexture( 1, NULL );
0447: lpD3DDev->SetPixelShader(0);
0448:
0449: #if 1
0450: // 描画した画面をテクスチャーとして描く
0451: {
0452: struct TLVERTEX
0453: {
0454: float x,y,z,rhw;
0455: float tu,tv;
0456: };
0457: #define FVF_TLVERTEX (D3DFVF_XYZRHW | D3DFVF_TEX1)
0458: lpD3DDev->SetTextureStageState(0,D3DTSS_COLOROP, D3DTOP_SELECTARG1);
0459: lpD3DDev->SetTextureStageState(0,D3DTSS_COLORARG1, D3DTA_TEXTURE);
0460: lpD3DDev->SetTextureStageState(1,D3DTSS_COLOROP, D3DTOP_DISABLE);
0461: float scale = 128.0f;
0462: TLVERTEX Vertex[4] = {
0463: // x y z rhw tu tv
0464: { 0, 0,0, 1, 0, 0,},
0465: {scale, 0,0, 1, 1, 0,},
0466: {scale,scale,0, 1, 1, 1,},
0467: { 0,scale,0, 1, 0, 1,},
0468: };
0469: lpD3DDev->SetTexture( 0, pTexture0[0] );
0470: lpD3DDev->SetVertexShader( FVF_TLVERTEX );
0471: lpD3DDev->SetPixelShader(0);
0472: lpD3DDev->DrawPrimitiveUP( D3DPT_TRIANGLEFAN, 2, Vertex, sizeof( TLVERTEX ) );
0473: }
0474: {
0475: struct TLVERTEX
0476: {
0477: float x,y,z,rhw;
0478: float tu,tv;
0479: };
0480: #define FVF_TLVERTEX (D3DFVF_XYZRHW | D3DFVF_TEX1)
0481: lpD3DDev->SetTextureStageState(0,D3DTSS_COLOROP, D3DTOP_SELECTARG1);
0482: lpD3DDev->SetTextureStageState(0,D3DTSS_COLORARG1, D3DTA_TEXTURE);
0483: lpD3DDev->SetTextureStageState(1,D3DTSS_COLOROP, D3DTOP_DISABLE);
0484: float scale = 128.0f;
0485: TLVERTEX Vertex[4] = {
0486: // x y z rhw tu tv
0487: { scale, 0,0, 1, 0, 0,},
0488: {2*scale, 0,0, 1, 1, 0,},
0489: {2*scale,scale,0, 1, 1, 1,},
0490: { scale,scale,0, 1, 0, 1,},
0491: };
0492: lpD3DDev->SetTexture( 0, pTexture0[1] );
0493: lpD3DDev->SetVertexShader( FVF_TLVERTEX );
0494: lpD3DDev->SetPixelShader(0);
0495: lpD3DDev->DrawPrimitiveUP( D3DPT_TRIANGLEFAN, 2, Vertex, sizeof( TLVERTEX ) );
0496: }
0497: {
0498: struct TLVERTEX
0499: {
0500: float x,y,z,rhw;
0501: float tu,tv;
0502: };
0503: #define FVF_TLVERTEX (D3DFVF_XYZRHW | D3DFVF_TEX1)
0504: lpD3DDev->SetTextureStageState(0,D3DTSS_COLOROP, D3DTOP_SELECTARG1);
0505: lpD3DDev->SetTextureStageState(0,D3DTSS_COLORARG1, D3DTA_TEXTURE);
0506: lpD3DDev->SetTextureStageState(1,D3DTSS_COLOROP, D3DTOP_DISABLE);
0507: float scale = 128.0f;
0508: TLVERTEX Vertex[4] = {
0509: // x y z rhw tu tv
0510: {2*scale, 0,0, 1, 0, 0,},
0511: {3*scale, 0,0, 1, 1, 0,},
0512: {3*scale,scale,0, 1, 1, 1,},
0513: {2*scale,scale,0, 1, 0, 1,},
0514: };
0515: lpD3DDev->SetTexture( 0, pTexture1[0] );
0516: lpD3DDev->SetVertexShader( FVF_TLVERTEX );
0517: lpD3DDev->SetPixelShader(0);
0518: lpD3DDev->DrawPrimitiveUP( D3DPT_TRIANGLEFAN, 2, Vertex, sizeof( TLVERTEX ) );
0519: }
0520: {
0521: struct TLVERTEX
0522: {
0523: float x,y,z,rhw;
0524: float tu,tv;
0525: };
0526: #define FVF_TLVERTEX (D3DFVF_XYZRHW | D3DFVF_TEX1)
0527: lpD3DDev->SetTextureStageState(0,D3DTSS_COLOROP, D3DTOP_SELECTARG1);
0528: lpD3DDev->SetTextureStageState(0,D3DTSS_COLORARG1, D3DTA_TEXTURE);
0529: lpD3DDev->SetTextureStageState(1,D3DTSS_COLOROP, D3DTOP_DISABLE);
0530: float scale = 128.0f;
0531: TLVERTEX Vertex[4] = {
0532: // x y z rhw tu tv
0533: {3*scale, 0,0, 1, 0, 0,},
0534: {4*scale, 0,0, 1, 1, 0,},
0535: {4*scale,scale,0, 1, 1, 1,},
0536: {3*scale,scale,0, 1, 0, 1,},
0537: };
0538: lpD3DDev->SetTexture( 0, pTexture1[1] );
0539: lpD3DDev->SetVertexShader( FVF_TLVERTEX );
0540: lpD3DDev->SetPixelShader(0);
0541: lpD3DDev->DrawPrimitiveUP( D3DPT_TRIANGLEFAN, 2, Vertex, sizeof( TLVERTEX ) );
0542: }
0543: #endif
0544: }
0545: //-----------------------------------------------------------------------------
0546: // メッシュオブジェクト削除
0547: //-----------------------------------------------------------------------------
0548: void DeleteMeshObject(void)
0549: {
0550: DWORD i;
0551:
0552: if(pMeshVB == NULL) return;
0553:
0554: for(i=0; i<dwNumMaterials; i++){
0555: RELEASE(pMeshTextures[i]);
0556: }
0557: delete[] pMeshTextures;
0558: delete[] pMeshMaterials;
0559: delete[] pSubsetTable;
0560:
0561: RELEASE(pMeshVB);
0562: RELEASE(pMeshIndex);
0563: }
0564: //-----------------------------------------------------------------------------
0565: // Name: CleanRender()
0566: // Desc: 後始末
0567: //-----------------------------------------------------------------------------
0568: void CleanRender(LPDIRECT3DDEVICE8 lpD3DDev)
0569: {
0570: CleanBg(lpD3DDev);
0571:
0572: for(int i = 0; i < 2; i++){
0573: RELEASE(pTexture0[i]);
0574: RELEASE(pTexture1[i]);
0575: RELEASE(pTextureSurface0[i]);
0576: RELEASE(pTextureSurface1[i]);
0577: }
0578: RELEASE(pBackbuffer);
0579:
0580: CPixelShaderMgr::Release(lpD3DDev, &hPixelShaderDPEM);
0581: CVertexShaderMgr::Release(lpD3DDev, &hVertexShaderDPEM);
0582: CPixelShaderMgr::Release(lpD3DDev, &hPixelShaderFish);
0583: CVertexShaderMgr::Release(lpD3DDev, &hVertexShaderFish);
0584: CPixelShaderMgr::Release(lpD3DDev, &hPixelShader);
0585: CVertexShaderMgr::Release(lpD3DDev, &hVertexShader);
0586:
0587: DeleteMeshObject();
0588: }
0589: