0001: // ---------------------------------------------------------------------------- 0002: // 0003: // draw.cpp - Rendering 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: 0015: 0016: LPDIRECT3DSURFACE8 pBackbuffer = NULL; 0017: LPDIRECT3DTEXTURE8 pCatSeedTexture=NULL; 0018: LPDIRECT3DTEXTURE8 pCatTexture[2]={NULL,NULL}; 0019: LPDIRECT3DSURFACE8 pCatSurface[2]={NULL,NULL}; 0020: 0021: // ---------------------------------------------------------------------------- 0022: // Vertex format 0023: // ---------------------------------------------------------------------------- 0024: struct TLVERTEX 0025: { 0026: float x,y,z,rhw; 0027: float tu,tv; 0028: }; 0029: #define FVF_TLVERTEX (D3DFVF_XYZRHW | D3DFVF_TEX1) 0030: 0031: //----------------------------------------------------------------------------- 0032: // Name: InitRender() 0033: //----------------------------------------------------------------------------- 0034: HRESULT InitRender(LPDIRECT3DDEVICE8 lpD3DDev) 0035: { 0036: DWORD i; 0037: HRESULT hr; 0038: 0039: // ================================================== 0040: // 本絵の読み込み 0041: // ================================================== 0042: hr = D3DXCreateTextureFromFileEx(lpD3DDev, "cat.bmp",0,0,0,0,D3DFMT_A8R8G8B8, 0043: D3DPOOL_MANAGED, D3DX_FILTER_LINEAR, D3DX_FILTER_LINEAR, 0044: 0, NULL, NULL, &pCatSeedTexture); 0045: 0046: 0047: // ================================================== 0048: // レンダリングターゲットの作成 0049: // ================================================== 0050: // バックバッファを保存する 0051: D3DSURFACE_DESC Desc; 0052: LPDIRECT3DSURFACE8 lpZbuffer = NULL; 0053: if( FAILED(hr = lpD3DDev->GetRenderTarget(&pBackbuffer))) return hr; 0054: if( FAILED(hr = pBackbuffer->GetDesc( &Desc ))) return hr; 0055: if( FAILED(hr = lpD3DDev->GetDepthStencilSurface( &lpZbuffer ))) return hr; 0056: 0057: for(i=0;i<2;i++){ 0058: // CatMap 0059: if( FAILED(hr = lpD3DDev->CreateTexture(128, 128, 1 0060: , D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &pCatTexture[i]))) return hr; 0061: if( FAILED(hr = pCatTexture[i]->GetSurfaceLevel(0,&pCatSurface[i]))) return hr; 0062: } 0063: 0064: 0065: // ================================================== 0066: // Initialize render states 0067: // ================================================== 0068: lpD3DDev->SetRenderState( D3DRS_ZENABLE, FALSE ); 0069: lpD3DDev->SetRenderState( D3DRS_LIGHTING, FALSE ); 0070: lpD3DDev->SetRenderState( D3DRS_ALPHABLENDENABLE, FALSE); 0071: 0072: lpD3DDev->SetTextureStageState(0,D3DTSS_COLOROP, D3DTOP_SELECTARG1); 0073: lpD3DDev->SetTextureStageState(0,D3DTSS_COLORARG1, D3DTA_TEXTURE); 0074: lpD3DDev->SetTextureStageState(0, D3DTSS_MAGFILTER, D3DTEXF_POINT ); 0075: lpD3DDev->SetTextureStageState(0, D3DTSS_MINFILTER, D3DTEXF_POINT ); 0076: 0077: return S_OK; 0078: } 0079: 0080: //----------------------------------------------------------------------------- 0081: // Name: Render() 0082: //----------------------------------------------------------------------------- 0083: VOID Render(LPDIRECT3DDEVICE8 lpD3DDev) 0084: { 0085: static BOOL init = TRUE; 0086: static DWORD id=0; 0087: LPDIRECT3DSURFACE8 lpZbuffer = NULL; 0088: lpD3DDev->GetDepthStencilSurface( &lpZbuffer ); 0089: 0090: static DWORD last = 0; 0091: DWORD now = timeGetTime(); 0092: DWORD cnt = now-last; 0093: 0094: if(init){ 0095: cnt = 0; 0096: last = now; 0097: id=0; 0098: lpD3DDev->SetRenderTarget(pCatSurface[id], NULL); 0099: float scale = 128.0f; 0100: TLVERTEX Vertex[4] = { 0101: // x y z rhw tu tv 0102: { 0, 0,0, 1, 0, 0,}, 0103: {scale, 0,0, 1, 1, 0,}, 0104: {scale,scale,0, 1, 1, 1,}, 0105: { 0,scale,0, 1, 0, 1,}, 0106: }; 0107: lpD3DDev->SetTexture( 0, pCatSeedTexture); 0108: lpD3DDev->SetVertexShader( FVF_TLVERTEX ); 0109: lpD3DDev->SetPixelShader(0); 0110: lpD3DDev->DrawPrimitiveUP( D3DPT_TRIANGLEFAN, 2, Vertex, sizeof( TLVERTEX ) ); 0111: } 0112: 0113: //----------------------------------------------------------------------------- 0114: // CatMap 0115: //----------------------------------------------------------------------------- 0116: if(3000<cnt){ 0117: id=1-id; 0118: last = now; 0119: lpD3DDev->SetRenderTarget(pCatSurface[id], NULL); 0120: 0121: float size = 128.0f; 0122: TLVERTEX Vertex[] = { 0123: // x y z rhw tu tv 0124: {0.0f*size, 0.0f*size,0, 1, 0.0f, 0.0f,}, 0125: {0.5f*size, 0.0f*size,0, 1, 1.0f, 0.5f,}, 0126: {0.0f*size, 1.0f*size,0, 1, 1.0f, 1.0f,}, 0127: 0128: {0.5f*size, 0.0f*size,0, 1, 0.0f, 0.5f,}, 0129: {1.0f*size, 0.0f*size,0, 1, 1.0f, 1.0f,}, 0130: {0.0f*size, 1.0f*size,0, 1, 0.0f, 1.0f,}, 0131: 0132: {0.0f*size, 1.0f*size,0, 1, 0.0f, 0.0f,}, 0133: {1.0f*size, 0.0f*size,0, 1, 1.0f, 0.0f,}, 0134: {0.5f*size, 1.0f*size,0, 1, 1.0f, 0.5f,}, 0135: 0136: {0.5f*size, 1.0f*size,0, 1, 0.0f, 0.5f,}, 0137: {1.0f*size, 0.0f*size,0, 1, 0.0f, 0.0f,}, 0138: {1.0f*size, 1.0f*size,0, 1, 1.0f, 1.0f,}, 0139: }; 0140: 0141: lpD3DDev->SetTexture( 0, pCatTexture[1-id] ); 0142: lpD3DDev->SetVertexShader( FVF_TLVERTEX ); 0143: lpD3DDev->SetPixelShader(0); 0144: lpD3DDev->DrawPrimitiveUP( D3DPT_TRIANGLELIST, 4, Vertex, sizeof( TLVERTEX ) ); 0145: } 0146: lpD3DDev->SetRenderTarget(pBackbuffer, lpZbuffer); 0147: 0148: //----------------------------------------------------------------------------- 0149: // 作成したテクスチャーを張る 0150: //----------------------------------------------------------------------------- 0151: { 0152: lpD3DDev->SetTextureStageState(0,D3DTSS_COLOROP, D3DTOP_SELECTARG1); 0153: lpD3DDev->SetTextureStageState(0,D3DTSS_COLORARG1, D3DTA_TEXTURE); 0154: lpD3DDev->SetTextureStageState(1,D3DTSS_COLOROP, D3DTOP_DISABLE); 0155: float scale = 512.0f; 0156: TLVERTEX Vertex[4] = { 0157: // x y z rhw tu tv 0158: { 0, 0,0, 1, 0, 0,}, 0159: {scale, 0,0, 1, 1, 0,}, 0160: {scale,scale,0, 1, 1, 1,}, 0161: { 0,scale,0, 1, 0, 1,}, 0162: }; 0163: lpD3DDev->SetTexture( 0, pCatTexture[id] ); 0164: lpD3DDev->SetVertexShader( FVF_TLVERTEX ); 0165: lpD3DDev->SetPixelShader(0); 0166: lpD3DDev->DrawPrimitiveUP( D3DPT_TRIANGLEFAN, 2, Vertex, sizeof( TLVERTEX ) ); 0167: } 0168: 0169: init=FALSE; 0170: } 0171: //----------------------------------------------------------------------------- 0172: // Name: CleanRender() 0173: //----------------------------------------------------------------------------- 0174: void CleanRender(LPDIRECT3DDEVICE8 lpD3DDev) 0175: { 0176: RELEASE(pCatSeedTexture); 0177: RELEASE(pCatSurface[1]); 0178: RELEASE(pCatSurface[0]); 0179: RELEASE(pCatTexture[1]); 0180: RELEASE(pCatTexture[0]); 0181: } 0182: