0001: // ----------------------------------------------------------------------------
0002: //
0003: // draw.cpp - 描画部分
0004: //
0005: // Copyright (c) 2002 IMAGIRE Takashi (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: #include "load.h"
0015:
0016: // モデル用
0017: LPDIRECT3DVERTEXBUFFER8 pMeshVB = NULL;
0018: LPDIRECT3DINDEXBUFFER8 pMeshIndex = NULL;
0019: D3DXATTRIBUTERANGE *pSubsetTable = NULL;
0020: DWORD nMeshFaces = 0;
0021: DWORD nMeshVertices = 0;
0022: D3DMATERIAL8 *pMeshMaterials = NULL; // メッシュの質感
0023: LPDIRECT3DTEXTURE8 *pMeshTextures = NULL; // メッシュのテクスチャー
0024: DWORD dwNumMaterials = 0L; // マテリアルの数
0025: FLOAT MeshRadius; // メッシュの大きさ
0026:
0027: // レンダリングテクスチャーの設定
0028: #define RENDER_SIZE 512.0f // レンダリングサイズ
0029: LPDIRECT3DTEXTURE8 pTexture;
0030: LPDIRECT3DSURFACE8 pTextureSurface;
0031: LPDIRECT3DSURFACE8 pBackbuffer = NULL;
0032: DWORD hVertexShader=~0;
0033: DWORD hPixelShader=~0;
0034:
0035:
0036: // 最後の一枚絵の描画用
0037: DWORD hFinalVertexShader=~0;
0038: DWORD hFinalPixelShader=~0;
0039: LPDIRECT3DVERTEXBUFFER8 pFinalVB = NULL;
0040: LPDIRECT3DINDEXBUFFER8 pFinalIB = NULL;
0041:
0042: typedef struct {
0043: float x,y,z;
0044: float tu,tv;
0045: }D3D_FINAL_VERTEX;
0046: #define D3DFVF_FINAL_VERTEX (D3DFVF_XYZ | D3DFVF_TEX1)
0047:
0048: DWORD dwFinalDecl[] = {
0049: D3DVSD_STREAM(0),
0050: D3DVSD_REG(D3DVSDE_POSITION, D3DVSDT_FLOAT3 ), //D3DVSDE_POSITION, 0
0051: D3DVSD_REG(D3DVSDE_TEXCOORD0,D3DVSDT_FLOAT2 ), //D3DVSDE_TEXCOORD0, 7
0052: D3DVSD_END()
0053: };
0054:
0055:
0056: // ----------------------------------------------------------------------------
0057: // 外部関数
0058: void InitBg(LPDIRECT3DDEVICE8 lpD3DDev);
0059: void DrawBg(LPDIRECT3DDEVICE8 lpD3DDev);
0060: void CleanBg(LPDIRECT3DDEVICE8 lpD3DDev);
0061:
0062:
0063:
0064: // ----------------------------------------------------------------------------
0065: // Name: LoadXFile(char* filename, LPDIRECT3DDEVICE8 lpD3DDev)
0066: // Desc: X-Fileの読み込み
0067: //-----------------------------------------------------------------------------
0068: HRESULT LoadXFile(char* filename, LPDIRECT3DDEVICE8 lpD3DDev)
0069: {
0070: LPD3DXMESH pMesh, pMeshOpt;
0071: LPD3DXBUFFER pD3DXMtrlBuffer = NULL;
0072: DWORD i;
0073: HRESULT hr;
0074:
0075: hr = D3DXLoadMeshFromX(filename, D3DXMESH_MANAGED,
0076: lpD3DDev, NULL,
0077: &pD3DXMtrlBuffer, &dwNumMaterials,
0078: &pMesh);
0079: if(FAILED(hr)) return E_FAIL;
0080:
0081: //並び替えておく
0082: pMesh->Optimize(D3DXMESHOPT_ATTRSORT, NULL, NULL, NULL, NULL, &pMeshOpt);
0083: RELEASE(pMesh);
0084:
0085: //アトリビュートテーブル
0086: pMeshOpt->GetAttributeTable(NULL,&dwNumMaterials);
0087: pSubsetTable = new D3DXATTRIBUTERANGE[dwNumMaterials];
0088: pMeshOpt->GetAttributeTable(pSubsetTable, &dwNumMaterials);
0089:
0090: // FVF変換
0091: hr = pMeshOpt->CloneMeshFVF(pMeshOpt->GetOptions(), D3DFVF_VERTEX, lpD3DDev, &pMesh);
0092: if(FAILED(hr)) return E_FAIL;
0093: RELEASE(pMeshOpt);
0094: D3DXComputeNormals(pMesh, NULL);
0095:
0096: //Vertex Bufferにコピーする
0097: D3DVERTEX* pSrc;
0098: D3D_CUSTOMVERTEX* pDest;
0099: LPDIRECT3DINDEXBUFFER8 pSrcIndex;
0100: WORD* pISrc;
0101: WORD* pIDest;
0102:
0103: DWORD nMeshVertices = pMesh->GetNumVertices();
0104: DWORD nMeshFaces = pMesh->GetNumFaces();
0105: lpD3DDev->CreateVertexBuffer(nMeshVertices * sizeof(D3D_CUSTOMVERTEX),0,D3DFVF_CUSTOMVERTEX,D3DPOOL_MANAGED,&pMeshVB);
0106: lpD3DDev->CreateIndexBuffer(nMeshFaces * 3 * sizeof(WORD),0,D3DFMT_INDEX16,D3DPOOL_MANAGED,&pMeshIndex);
0107:
0108: LPDIRECT3DVERTEXBUFFER8 pVB;
0109: pMesh->GetVertexBuffer(&pVB);
0110: pVB->Lock(0,0,(BYTE**)&pSrc,0);
0111: pMeshVB->Lock(0,0,(BYTE**)&pDest,0);
0112: MeshRadius = 0.0f;
0113: for(i=0;i<nMeshVertices;i++){
0114: pDest->x = pSrc->x;
0115: pDest->y = pSrc->y;
0116: pDest->z = pSrc->z;
0117: pDest->nx = pSrc->nx;
0118: pDest->ny = pSrc->ny;
0119: pDest->nz = pSrc->nz;
0120: pDest->tu0 = pSrc->tu0;
0121: pDest->tu0 = pSrc->tu0;
0122: // サイズの計算
0123: FLOAT radius = sqrtf( pSrc->x*pSrc->x + pSrc->y*pSrc->y + pSrc->z*pSrc->z );
0124: if (MeshRadius < radius) MeshRadius = radius;
0125:
0126: pSrc += 1;
0127: pDest += 1;
0128: }
0129: pVB->Unlock();
0130: pVB->Release();
0131: pMeshVB->Unlock();
0132:
0133: //インデックスのコピー
0134: pMesh->GetIndexBuffer(&pSrcIndex);
0135: pSrcIndex->Lock(0,0,(BYTE**)&pISrc,0);
0136: pMeshIndex->Lock(0,0,(BYTE**)&pIDest,0);
0137: CopyMemory(pIDest,pISrc,nMeshFaces * 3 * sizeof(WORD));
0138: pSrcIndex->Unlock();
0139: pMeshIndex->Unlock();
0140: pSrcIndex->Release();
0141:
0142: // pD3DXMtrlBuffer から、質感やテクスチャーの情報を読み取る
0143: D3DXMATERIAL* d3dxMaterials = (D3DXMATERIAL*)pD3DXMtrlBuffer->GetBufferPointer();
0144: pMeshTextures = new LPDIRECT3DTEXTURE8[dwNumMaterials];
0145: pMeshMaterials = new D3DMATERIAL8[dwNumMaterials];
0146:
0147: for(i = 0; i < dwNumMaterials; i++){
0148: pMeshMaterials[i] = d3dxMaterials[i].MatD3D;
0149: pMeshMaterials[i].Ambient = pMeshMaterials[i].Diffuse;
0150: hr = D3DXCreateTextureFromFile( lpD3DDev,
0151: d3dxMaterials[i].pTextureFilename,
0152: &pMeshTextures[i] );
0153: if(FAILED(hr)) pMeshTextures[i] = NULL;
0154: }
0155: RELEASE(pD3DXMtrlBuffer);
0156:
0157: RELEASE(pMesh);
0158:
0159: return S_OK;
0160: }
0161: //-----------------------------------------------------------------------------
0162: // Name: InitRenderTexture()
0163: // Desc: レンダリングテクスチャー用の下準備
0164: //-----------------------------------------------------------------------------
0165: HRESULT InitRenderTexture(LPDIRECT3DDEVICE8 lpD3DDev)
0166: {
0167: HRESULT hr;
0168: DWORD i;
0169:
0170: // バーテックスシェーダーを作成する
0171: hr=CVertexShaderMgr::Load(lpD3DDev, "vs.vsh", &hVertexShader, dwDecl);
0172: if( FAILED(hr) ) return hr;
0173: hr=CPixelShaderMgr::Load(lpD3DDev, "ps.psh", &hPixelShader);
0174: if( FAILED(hr) ) return hr;
0175: hr=CVertexShaderMgr::Load(lpD3DDev, "final.vsh", &hFinalVertexShader, dwFinalDecl);
0176: if( FAILED(hr) ) return hr;
0177: hr=CPixelShaderMgr::Load(lpD3DDev, "final.psh", &hFinalPixelShader);
0178: if( FAILED(hr) ) return hr;
0179:
0180: // 頂点バッファの作成
0181: D3D_FINAL_VERTEX *pDest;
0182: WORD *pIndex;
0183: hr = lpD3DDev->CreateVertexBuffer( 4 * sizeof(D3D_FINAL_VERTEX),
0184: D3DUSAGE_WRITEONLY, D3DFVF_FINAL_VERTEX, D3DPOOL_MANAGED,
0185: &pFinalVB );
0186: // 頂点をセットアップ
0187: pFinalVB->Lock ( 0, 0, (BYTE**)&pDest, 0 );
0188: for (i = 0; i < 4; i++) {
0189: pDest->x = (i == 0 || i == 1)?-1:(float)1;
0190: pDest->y = (i == 0 || i == 2)?-1:(float)1;
0191: pDest->z = 0.5f;
0192: pDest->tu = (i == 2 || i == 3)?1:(float)0;
0193: pDest->tv = (i == 0 || i == 2)?1:(float)0;
0194: pDest++;
0195: }
0196: pFinalVB->Unlock ();
0197: // インデックスをセットアップ
0198: hr = lpD3DDev->CreateIndexBuffer( 6 * sizeof(WORD),
0199: 0,
0200: D3DFMT_INDEX16, D3DPOOL_MANAGED,
0201: &pFinalIB );
0202: pFinalIB->Lock ( 0, 0, (BYTE**)&pIndex, 0 );
0203: pIndex[0] = 0; pIndex[1] = 1; pIndex[2] = 2;
0204: pIndex[3] = 1; pIndex[4] = 3; pIndex[5] = 2;
0205: pFinalIB->Unlock ();
0206:
0207: // -------------------------------------------------------------------------
0208: // 定数レジスタの設定
0209: // -------------------------------------------------------------------------
0210: float const inv_w = 1.0f / (float)RENDER_SIZE;
0211: float const inv_h = 1.0f / (float)RENDER_SIZE;
0212: lpD3DDev->SetVertexShaderConstant(20, &D3DXVECTOR4 (0.0f*inv_w, 0.0f*inv_h, 0.0f, 0.0f), 1);
0213: lpD3DDev->SetVertexShaderConstant(21, &D3DXVECTOR4 (2.0f*inv_w, 0.0f*inv_h, 0.0f, 0.0f), 1);
0214: lpD3DDev->SetVertexShaderConstant(22, &D3DXVECTOR4 (0.0f*inv_w, 2.0f*inv_h, 0.0f, 0.0f), 1);
0215: lpD3DDev->SetVertexShaderConstant(23, &D3DXVECTOR4 (2.0f*inv_w, 2.0f*inv_h, 0.0f, 0.0f), 1);
0216: // 便利な定数
0217: lpD3DDev->SetVertexShaderConstant(12, &D3DXVECTOR4 (0.0f, 0.5f, 1.0f, 2.0f), 1);
0218:
0219: // -------------------------------------------------------------------------
0220: // 描画用テクスチャーを用意する
0221: // -------------------------------------------------------------------------
0222: D3DSURFACE_DESC Desc;
0223: LPDIRECT3DSURFACE8 lpZbuffer = NULL;
0224: if( FAILED(hr = lpD3DDev->GetRenderTarget(&pBackbuffer))) return hr;
0225: if( FAILED(hr = pBackbuffer->GetDesc( &Desc ))) return hr;
0226:
0227: // 深度バッファのサーフェスを確保する
0228: if( FAILED(hr = lpD3DDev->GetDepthStencilSurface( &lpZbuffer ))) return hr;
0229:
0230: // テクスチャーの生成
0231: if( FAILED(hr = lpD3DDev->CreateTexture(RENDER_SIZE, RENDER_SIZE, 1
0232: , D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8
0233: , D3DPOOL_DEFAULT, &pTexture))) return hr;
0234: // テクスチャーとサーフェスを関連づける
0235: if( FAILED(hr = pTexture->GetSurfaceLevel(0,&pTextureSurface))) return hr;
0236: // テクスチャー用の描画と深度バッファを関連付ける
0237: if( FAILED(hr = lpD3DDev->SetRenderTarget(pTextureSurface, lpZbuffer)))
0238: return hr;
0239:
0240: // 描画を元の画面に戻す
0241: lpD3DDev->SetRenderTarget(pBackbuffer, lpZbuffer );
0242:
0243: return S_OK;
0244: }
0245: //-----------------------------------------------------------------------------
0246: // Name: InitRender()
0247: // Desc: Load the mesh and build the material and texture arrays
0248: //-----------------------------------------------------------------------------
0249: D3DXVECTOR4 lightDir(1.0f, 1.0f, 0.5f, 0.0f);
0250:
0251: HRESULT InitRender(LPDIRECT3DDEVICE8 lpD3DDev)
0252: {
0253: HRESULT hr;
0254:
0255: // モデルの読み込み
0256: if ( FAILED(hr = LoadXFile("nsx.x", lpD3DDev)) ) return hr;
0257:
0258: // レンダリングテクスチャー用の初期化
0259: InitRenderTexture(lpD3DDev);
0260:
0261: // 背景部分の初期化
0262: InitBg(lpD3DDev);
0263:
0264: // 不変なレジスタの設定
0265: lpD3DDev->SetRenderState( D3DRS_ZENABLE, TRUE );
0266: for (DWORD i = 0; i < 4; ++i) {
0267: lpD3DDev->SetTextureStageState(i, D3DTSS_MAGFILTER, D3DTEXF_LINEAR);
0268: lpD3DDev->SetTextureStageState(i, D3DTSS_MINFILTER, D3DTEXF_LINEAR);
0269: lpD3DDev->SetTextureStageState(i, D3DTSS_MIPFILTER, D3DTEXF_NONE);
0270: lpD3DDev->SetTextureStageState(i,D3DTSS_ADDRESSU, D3DTADDRESS_CLAMP);
0271: lpD3DDev->SetTextureStageState(i,D3DTSS_ADDRESSV, D3DTADDRESS_CLAMP);
0272: }
0273: return S_OK;
0274: }
0275: //-----------------------------------------------------------------------------
0276: // Name: DrawModel()
0277: // Desc: Draw Models
0278: //-----------------------------------------------------------------------------
0279:
0280: VOID DrawModel(LPDIRECT3DDEVICE8 lpD3DDev)
0281: {
0282: D3DXMATRIX mWorld, mView, mProj, m;
0283: D3DXVECTOR4 vl;
0284: DWORD i;
0285:
0286: // ビュー行列
0287: D3DXVECTOR3 eye = D3DXVECTOR3(0.0f,18,30);
0288: D3DXVECTOR3 lookAt = D3DXVECTOR3(0.0f, 0.0f, 0.0f);
0289: D3DXVECTOR3 up = D3DXVECTOR3(0.0f, 1.0f, 0.0f);
0290: D3DXMatrixLookAtLH(&mView, &eye, &lookAt, &up);
0291:
0292: // 射影行列
0293: D3DXMatrixPerspectiveFovLH(&mProj
0294: ,60.0f*PI/180.0f // 視野角
0295: ,(float)WIDTH/(float)HEIGHT // アスペクト比
0296: ,0.01f,100.0f // 最近接距離,最遠方距離
0297: );
0298:
0299: //
0300: // 背景描画
0301: //
0302: D3DXMatrixScaling(&mWorld, 3.0f, 3.0f, 3.0f);
0303: m = mWorld * mView * mProj;
0304: D3DXMatrixTranspose( &m , &m);
0305: lpD3DDev->SetVertexShaderConstant(0,&m, 4);
0306: lpD3DDev->SetVertexShaderConstant(14, &D3DXVECTOR4(0,0,0,0), 1);
0307:
0308: D3DXMatrixInverse( &m, NULL, &mWorld);
0309: D3DXVec4Transform(&vl, &lightDir, &m);
0310: D3DXVec4Normalize(&vl, &vl);
0311: vl[3] = 0.3f;
0312: lpD3DDev->SetVertexShaderConstant(13, &vl, 1);
0313:
0314: DrawBg(lpD3DDev);
0315:
0316: //
0317: // 外側もでる描画
0318: //
0319: lpD3DDev->SetRenderState( D3DRS_LIGHTING, TRUE );
0320:
0321: lpD3DDev->SetStreamSource(0, pMeshVB, sizeof(D3D_CUSTOMVERTEX));
0322: lpD3DDev->SetIndices(pMeshIndex,0);
0323:
0324: int t = timeGetTime();
0325: D3DXMatrixTranslation(&m, 1.5f*MeshRadius, 0,0);
0326: D3DXMatrixRotationY( &mWorld, t/1000.0f );
0327: //D3DXMatrixRotationY( &mWorld, -0.2*PI/2 );
0328: mWorld = m * mWorld;
0329: m = mWorld * mView * mProj;
0330: D3DXMatrixTranspose( &m , &m);
0331: lpD3DDev->SetVertexShaderConstant(0,&m, 4);
0332:
0333: D3DXMatrixInverse( &m, NULL, &mWorld);
0334: D3DXVec4Transform(&vl, &lightDir, &m);
0335: D3DXVec4Normalize(&vl, &vl);
0336: vl[3] = 0.3f;
0337: lpD3DDev->SetVertexShaderConstant(13, &vl, 1);
0338:
0339: for(i=0;i<dwNumMaterials;i++){
0340: D3DXVECTOR4 vl;
0341: vl.x = pMeshMaterials[i].Diffuse.r;
0342: vl.y = pMeshMaterials[i].Diffuse.g;
0343: vl.z = pMeshMaterials[i].Diffuse.b;
0344: lpD3DDev->SetVertexShaderConstant(14, &vl, 1);
0345:
0346: lpD3DDev->SetMaterial( &pMeshMaterials[i] );
0347: lpD3DDev->SetTexture(0,pMeshTextures[i]);
0348: lpD3DDev->DrawIndexedPrimitive(D3DPT_TRIANGLELIST,
0349: pSubsetTable[i].VertexStart,
0350: pSubsetTable[i].VertexCount,
0351: pSubsetTable[i].FaceStart * 3,
0352: pSubsetTable[i].FaceCount);
0353: }
0354: //
0355: // 内側もでる描画
0356: //
0357: D3DXMatrixRotationY( &mWorld, -t/3000.0f );
0358: //D3DXMatrixRotationY( &mWorld, -1.4f*PI/2 );
0359: m = mWorld * mView * mProj;
0360: D3DXMatrixTranspose( &m , &m);
0361: lpD3DDev->SetVertexShaderConstant(0,&m, 4);
0362:
0363: D3DXMatrixInverse( &m, NULL, &mWorld);
0364: D3DXVec4Transform(&vl, &lightDir, &m);
0365: D3DXVec4Normalize(&vl, &vl);
0366: vl[3] = 0.3f;
0367: lpD3DDev->SetVertexShaderConstant(13, &vl, 1);
0368:
0369: for(i=0;i<dwNumMaterials;i++){
0370: D3DXVECTOR4 vl;
0371: vl.x = pMeshMaterials[i].Diffuse.r;
0372: vl.y = pMeshMaterials[i].Diffuse.g;
0373: vl.z = pMeshMaterials[i].Diffuse.b;
0374: lpD3DDev->SetVertexShaderConstant(14, &vl, 1);
0375:
0376: lpD3DDev->SetMaterial( &pMeshMaterials[i] );
0377: lpD3DDev->SetTexture(0,pMeshTextures[i]);
0378: lpD3DDev->DrawIndexedPrimitive(D3DPT_TRIANGLELIST,
0379: pSubsetTable[i].VertexStart,
0380: pSubsetTable[i].VertexCount,
0381: pSubsetTable[i].FaceStart * 3,
0382: pSubsetTable[i].FaceCount);
0383: }
0384: lpD3DDev->SetRenderState( D3DRS_LIGHTING, FALSE );
0385: }
0386: //-----------------------------------------------------------------------------
0387: // Name: Render()
0388: // Desc: Draw the scene
0389: //-----------------------------------------------------------------------------
0390: VOID Render(LPDIRECT3DDEVICE8 lpD3DDev)
0391: {
0392: DWORD i;
0393:
0394: LPDIRECT3DSURFACE8 lpZbuffer = NULL;
0395:
0396: lpD3DDev->GetDepthStencilSurface( &lpZbuffer );
0397:
0398: // -----------------------------------------------------
0399: // 深度エッジと色の作成
0400: // -----------------------------------------------------
0401: // テクスチャーに描画
0402: lpD3DDev->SetRenderTarget(pTextureSurface, lpZbuffer);
0403: lpD3DDev->Clear(0,NULL, D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(0,0,0),1.0f,0);
0404: lpD3DDev->SetTextureStageState(0,D3DTSS_COLOROP, D3DTOP_MODULATE);
0405: lpD3DDev->SetTextureStageState(0,D3DTSS_COLORARG1, D3DTA_TEXTURE);
0406: lpD3DDev->SetTextureStageState(0,D3DTSS_COLORARG2, D3DTA_DIFFUSE);
0407: lpD3DDev->SetTextureStageState(1,D3DTSS_COLOROP, D3DTOP_DISABLE);
0408: lpD3DDev->SetVertexShader(hVertexShader);
0409: lpD3DDev->SetPixelShader(hPixelShader);
0410: DrawModel(lpD3DDev);
0411:
0412: // 描画をバックバッファに戻す
0413: lpD3DDev->SetRenderTarget(pBackbuffer, lpZbuffer );
0414: for (i = 0; i < 4; i++) {
0415: lpD3DDev->SetTextureStageState(i, D3DTSS_ADDRESSU, D3DTADDRESS_CLAMP);
0416: lpD3DDev->SetTextureStageState(i, D3DTSS_ADDRESSV, D3DTADDRESS_CLAMP);
0417: lpD3DDev->SetTextureStageState(i, D3DTSS_COLOROP, D3DTOP_SELECTARG1);
0418: lpD3DDev->SetTextureStageState(i, D3DTSS_COLORARG1, D3DTA_TEXTURE);
0419: lpD3DDev->SetTexture( i, pTexture ); // テクスチャー
0420: }
0421:
0422: lpD3DDev->SetVertexShader(hFinalVertexShader);
0423: lpD3DDev->SetPixelShader(hFinalPixelShader);
0424: lpD3DDev->SetStreamSource( 0, pFinalVB, sizeof(D3D_FINAL_VERTEX) );
0425: lpD3DDev->SetIndices(pFinalIB,0);
0426: lpD3DDev->DrawIndexedPrimitive( D3DPT_TRIANGLELIST, 0, 4, 0, 2 );
0427:
0428: lpD3DDev->SetPixelShader(0);
0429: lpD3DDev->SetTexture( 0, NULL);
0430: lpD3DDev->SetTexture( 1, NULL);
0431: lpD3DDev->SetTexture( 2, NULL);
0432: lpD3DDev->SetTexture( 3, NULL);
0433:
0434: #if 1
0435: // 描画した画面をテクスチャーとして描く
0436: {
0437: struct TLVERTEX
0438: {
0439: float x,y,z,rhw;
0440: float tu,tv;
0441: };
0442: #define FVF_TLVERTEX (D3DFVF_XYZRHW | D3DFVF_TEX1)
0443: lpD3DDev->SetTextureStageState(0,D3DTSS_COLOROP, D3DTOP_SELECTARG1);
0444: lpD3DDev->SetTextureStageState(0,D3DTSS_COLORARG1, D3DTA_TEXTURE);
0445: lpD3DDev->SetTextureStageState(1,D3DTSS_COLOROP, D3DTOP_DISABLE);
0446: float scale = 512.0f;
0447: TLVERTEX Vertex[4] = {
0448: // x y z rhw tu tv
0449: { 0, 0,0, 1, 0, 0,},
0450: {scale/2, 0,0, 1, 0.5, 0,},
0451: {scale/2,scale,0, 1, 0.5, 1,},
0452: { 0,scale,0, 1, 0, 1,},
0453: };
0454: lpD3DDev->SetTexture( 0, pTexture );
0455: lpD3DDev->SetVertexShader( FVF_TLVERTEX );
0456: lpD3DDev->SetPixelShader(0);
0457: lpD3DDev->DrawPrimitiveUP( D3DPT_TRIANGLEFAN, 2, Vertex, sizeof( TLVERTEX ) );
0458: }
0459: #endif
0460: }
0461: //-----------------------------------------------------------------------------
0462: // メッシュオブジェクト削除
0463: //-----------------------------------------------------------------------------
0464: void DeleteMeshObject(void)
0465: {
0466: DWORD i;
0467:
0468: if(pMeshVB == NULL) return;
0469:
0470: for(i=0; i<dwNumMaterials; i++){
0471: RELEASE(pMeshTextures[i]);
0472: }
0473: delete[] pMeshTextures;
0474: delete[] pMeshMaterials;
0475: delete[] pSubsetTable;
0476:
0477: RELEASE(pMeshVB);
0478: RELEASE(pMeshIndex);
0479: }
0480: //-----------------------------------------------------------------------------
0481: // Name: CleanRender()
0482: // Desc: 後始末
0483: //-----------------------------------------------------------------------------
0484: void CleanRender(LPDIRECT3DDEVICE8 lpD3DDev)
0485: {
0486: CleanBg(lpD3DDev);
0487:
0488: RELEASE(pTextureSurface);
0489: RELEASE(pTexture);
0490: RELEASE(pBackbuffer);
0491:
0492: RELEASE(pFinalIB);
0493: RELEASE(pFinalVB);
0494: CPixelShaderMgr::Release(lpD3DDev, &hFinalPixelShader);
0495: CVertexShaderMgr::Release(lpD3DDev, &hFinalVertexShader);
0496: CPixelShaderMgr::Release(lpD3DDev, &hPixelShader);
0497: CVertexShaderMgr::Release(lpD3DDev, &hVertexShader);
0498:
0499: DeleteMeshObject();
0500: }
0501: