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: #include "load.h" 0015: 0016: #include "Cg/cgD3D.h" 0017: 0018: // Cg Env 0019: cgDirect3D cg; 0020: cgContextContainer * pContextContainer = 0; 0021: 0022: // Ordinal shader 0023: cgProgramContainer *pVertexProgramContainer = 0; 0024: cgBindIter * vertex_mat_iter = 0; 0025: cgProgramContainer *pPixelProgramContainer = 0; 0026: cgBindIter * tex0_iter = 0; 0027: cgBindIter * tex1_iter = 0; 0028: 0029: // Burn 0030: cgProgramContainer *pBurnVC = 0; 0031: cgProgramContainer *pBurnPC = 0; 0032: cgBindIter * BurnTex0_iter = 0; 0033: cgBindIter * BurnTex1_iter = 0; 0034: cgBindIter * BurnTex2_iter = 0; 0035: 0036: // Black spot 0037: cgProgramContainer *pBlackVC = 0; 0038: 0039: CMyMesh mesh; // ground 0040: CMyView view; // camera 0041: 0042: D3DXMATRIX gProj; // Projectio matrix 0043: 0044: LPDIRECT3DSURFACE8 pBackbuffer = NULL; 0045: 0046: // catmap 0047: LPDIRECT3DTEXTURE8 pCatTexture[2]={NULL,NULL}; 0048: LPDIRECT3DSURFACE8 pCatTextureSurface[2]={NULL,NULL}; 0049: LPDIRECT3DTEXTURE8 pCatSeedTexture=NULL; 0050: 0051: // envmap 0052: LPDIRECT3DTEXTURE8 pEnvTexture=NULL; 0053: LPDIRECT3DSURFACE8 pEnvTextureSurface=NULL; 0054: 0055: // Result of the Fire 0056: LPDIRECT3DTEXTURE8 pFireTexture[2]={NULL,NULL}; 0057: LPDIRECT3DSURFACE8 pFireTextureSurface[2]={NULL,NULL}; 0058: LPDIRECT3DTEXTURE8 pBurnTexture=NULL; 0059: 0060: // Black spot 0061: LPDIRECT3DTEXTURE8 pBlackTexture=NULL; 0062: LPDIRECT3DSURFACE8 pBlackTextureSurface=NULL; 0063: 0064: 0065: // ---------------------------------------------------------------------------- 0066: // Vertex format 0067: // ---------------------------------------------------------------------------- 0068: struct TLVERTEX 0069: { 0070: float x,y,z,rhw; 0071: float tu,tv; 0072: }; 0073: #define FVF_TLVERTEX (D3DFVF_XYZRHW | D3DFVF_TEX1) 0074: 0075: // ---------------------------------------------------------------------------- 0076: void InitBg(LPDIRECT3DDEVICE8 lpD3DDev); 0077: void DrawBg(LPDIRECT3DDEVICE8 lpD3DDev, D3DXMATRIX &mVP, bool texture); 0078: void CleanBg(LPDIRECT3DDEVICE8 lpD3DDev); 0079: 0080: 0081: //----------------------------------------------------------------------------- 0082: // Name: InitRender() 0083: //----------------------------------------------------------------------------- 0084: HRESULT InitRender(LPDIRECT3DDEVICE8 lpD3DDev) 0085: { 0086: HRESULT hr; 0087: DWORD i; 0088: 0089: cgVertexDefinition vertex_attributes[] = { 0090: {D3DVSDT_FLOAT4, "position", 0}, 0091: {D3DVSDT_FLOAT2, "texcoord0", 0}, 0092: CGVERTEXDEFINITIONEND 0093: }; 0094: 0095: // ================================================== 0096: // Initialization of the sky 0097: // ================================================== 0098: InitBg(lpD3DDev); 0099: 0100: // ================================================== 0101: // read the ground mesh 0102: // ================================================== 0103: mesh.Load(lpD3DDev, "map.x"); 0104: 0105: // ================================================== 0106: // Initializatioon of the Cg 0107: // ================================================== 0108: cg.AddFilePath(".."); 0109: pContextContainer = cg.CreateContextContainer(lpD3DDev); 0110: 0111: // ================================================== 0112: // Almost fixed function 0113: // ================================================== 0114: pVertexProgramContainer = pContextContainer->LoadCGProgramFromFile( 0115: "vs.cg", "Vertex Shader", cgDX8VertexProfile, vertex_attributes); 0116: 0117: if (pVertexProgramContainer == NULL) {// error 0118: const char * listing = pContextContainer->GetLastListing(); 0119: if (listing == 0) listing = "Could not find cgc.exe."; 0120: cg.NotePad("頂点シェーダープログラムの生成に失敗しました\n\n", listing); 0121: exit(1); // end 0122: } 0123: vertex_mat_iter = pVertexProgramContainer->GetParameterBindByName("worldviewproj_matrix"); 0124: 0125: pPixelProgramContainer = pContextContainer->LoadCGProgramFromFile( 0126: "ps.cg", "test", cgDX8PixelProfile); 0127: if (NULL == pPixelProgramContainer) { // error 0128: const char * error_text = pContextContainer->GetLastListing(); 0129: cg.NotePad("ピクセルシェーダープログラムの生成に失敗しました\n\n\n", error_text); 0130: exit(1); // end 0131: } 0132: tex0_iter = pPixelProgramContainer->GetTextureBindByName("tex0"); 0133: tex1_iter = pPixelProgramContainer->GetTextureBindByName("tex1"); 0134: 0135: // ================================================== 0136: // This program creates the fire effect 0137: // ================================================== 0138: pBurnVC = pContextContainer->LoadCGProgramFromFile( 0139: "BurnV.cg", "Vertex Shader", cgDX8VertexProfile, vertex_attributes); 0140: if (NULL == pBurnVC) { 0141: const char * listing = pContextContainer->GetLastListing(); 0142: if (listing == 0) listing = "Could not find cgc.exe."; 0143: cg.NotePad("頂点シェーダープログラムの生成に失敗しました\n\n", listing); 0144: exit(1); 0145: } 0146: 0147: pBurnPC = pContextContainer->LoadCGProgramFromFile( 0148: "BurnP.cg", "test", cgDX8PixelProfile); 0149: if (NULL == pBurnPC) { 0150: const char * error_text = pContextContainer->GetLastListing(); 0151: cg.NotePad("ピクセルシェーダープログラムの生成に失敗しました\n\n\n", error_text); 0152: exit(1); 0153: } 0154: BurnTex0_iter = pBurnPC->GetTextureBindByName("tex0"); 0155: BurnTex1_iter = pBurnPC->GetTextureBindByName("tex1"); 0156: BurnTex2_iter = pBurnPC->GetTextureBindByName("tex2"); 0157: 0158: // ================================================== 0159: // This program creates the black spots 0160: // ================================================== 0161: pBlackVC = pContextContainer->LoadCGProgramFromFile( 0162: "BlackV.cg", "Vertex Shader", cgDX8VertexProfile, vertex_attributes); 0163: if (NULL == pBlackVC) { 0164: const char * listing = pContextContainer->GetLastListing(); 0165: if (listing == 0) listing = "Could not find cgc.exe."; 0166: cg.NotePad("頂点シェーダープログラムの生成に失敗しました\n\n", listing); 0167: exit(1); 0168: } 0169: // ================================================== 0170: // Texture for the seed of the fire (CatMap) 0171: // ================================================== 0172: D3DXCreateTextureFromFileEx(lpD3DDev, "fire.bmp",0,0,0,0,D3DFMT_A8R8G8B8, 0173: D3DPOOL_MANAGED, D3DX_FILTER_LINEAR, D3DX_FILTER_LINEAR, 0174: 0, NULL, NULL, &pCatSeedTexture); 0175: 0176: D3DXCreateTextureFromFileEx(lpD3DDev, "t-pot.bmp",0,0,0,0,D3DFMT_A8R8G8B8, 0177: D3DPOOL_MANAGED, D3DX_FILTER_LINEAR, D3DX_FILTER_LINEAR, 0178: 0, NULL, NULL, &pBurnTexture); 0179: 0180: 0181: // ================================================== 0182: // Create Rendering Texture 0183: // ================================================== 0184: // Backup back buffers 0185: D3DSURFACE_DESC Desc; 0186: LPDIRECT3DSURFACE8 lpZbuffer = NULL; 0187: if( FAILED(hr = lpD3DDev->GetRenderTarget(&pBackbuffer))) return hr; 0188: if( FAILED(hr = pBackbuffer->GetDesc( &Desc ))) return hr; 0189: if( FAILED(hr = lpD3DDev->GetDepthStencilSurface( &lpZbuffer ))) return hr; 0190: 0191: if( FAILED(hr = lpD3DDev->CreateTexture(Desc.Width, Desc.Height, 1 0192: , D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &pBlackTexture))) return hr; 0193: if( FAILED(hr = pBlackTexture->GetSurfaceLevel(0,&pBlackTextureSurface))) return hr; 0194: if( FAILED(hr = lpD3DDev->SetRenderTarget(pBlackTextureSurface, NULL ))) return hr; 0195: 0196: // Total Fire result 0197: if( FAILED(hr = lpD3DDev->CreateTexture(Desc.Width, Desc.Height, 1 0198: , D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &pEnvTexture))) return hr; 0199: if( FAILED(hr = pEnvTexture->GetSurfaceLevel(0,&pEnvTextureSurface))) return hr; 0200: if( FAILED(hr = lpD3DDev->SetRenderTarget(pEnvTextureSurface, lpZbuffer ))) return hr; 0201: 0202: for(i=0;i<2;i++){ 0203: // CatMap 0204: if( FAILED(hr = lpD3DDev->CreateTexture(128, 128, 1 0205: , D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &pCatTexture[i]))) return hr; 0206: if( FAILED(hr = pCatTexture[i]->GetSurfaceLevel(0,&pCatTextureSurface[i]))) return hr; 0207: // Fire map 0208: if( FAILED(hr = lpD3DDev->CreateTexture(Desc.Width, Desc.Height, 1 0209: , D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &pFireTexture[i]))) return hr; 0210: if( FAILED(hr = pFireTexture[i]->GetSurfaceLevel(0,&pFireTextureSurface[i]))) return hr; 0211: } 0212: 0213: // Set rendering target to back buffer 0214: lpD3DDev->SetRenderTarget(pBackbuffer, lpZbuffer ); 0215: 0216: // ================================================== 0217: // Initialize render states 0218: // ================================================== 0219: lpD3DDev->SetRenderState( D3DRS_ZENABLE, TRUE ); 0220: lpD3DDev->SetRenderState( D3DRS_LIGHTING, FALSE ); 0221: lpD3DDev->SetRenderState( D3DRS_ALPHABLENDENABLE, FALSE); 0222: lpD3DDev->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_ONE); 0223: lpD3DDev->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCCOLOR); 0224: 0225: D3DXMatrixPerspectiveFovLH(&gProj 0226: ,60.0f*D3DX_PI/180.0f 0227: ,(float)WIDTH/(float)HEIGHT 0228: ,0.01f,100.0f 0229: ); 0230: 0231: return S_OK; 0232: } 0233: 0234: //----------------------------------------------------------------------------- 0235: // Name: Render() 0236: // Desc: Draws the scene 0237: // type 0 normal 0238: // type 1 burn envmap 0239: //----------------------------------------------------------------------------- 0240: VOID DrawModel(LPDIRECT3DDEVICE8 lpD3DDev, D3DXMATRIX &mVP, DWORD type) 0241: { 0242: DrawBg(lpD3DDev, mVP, 0==type); 0243: 0244: D3DXMATRIX m; 0245: D3DXMatrixTranspose( &m, &mVP ); 0246: pVertexProgramContainer->SetShaderConstant( vertex_mat_iter, &m ); 0247: 0248: lpD3DDev->SetStreamSource(0, mesh.pVB, sizeof(D3D_CUSTOMVERTEX)); 0249: lpD3DDev->SetIndices(mesh.pIndex,0); 0250: 0251: switch(type){ 0252: case 1: 0253: pPixelProgramContainer->SetTexture(tex0_iter, pBurnTexture); 0254: pPixelProgramContainer->SetTexture(tex1_iter, NULL); 0255: break; 0256: default: 0257: pPixelProgramContainer->SetTexture(tex0_iter, mesh.pTextures[0]); 0258: pPixelProgramContainer->SetTexture(tex1_iter, pBlackTexture); 0259: break; 0260: } 0261: 0262: lpD3DDev->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, 0263: mesh.pSubsetTable[0].VertexStart, 0264: mesh.pSubsetTable[0].VertexCount, 0265: mesh.pSubsetTable[0].FaceStart * 3, 0266: mesh.pSubsetTable[0].FaceCount); 0267: } 0268: //----------------------------------------------------------------------------- 0269: // Name: Render() 0270: //----------------------------------------------------------------------------- 0271: VOID Render(LPDIRECT3DDEVICE8 lpD3DDev) 0272: { 0273: D3DXMATRIX mWorld, mView, mProj, m, mat; 0274: static DWORD id=0; 0275: static BOOL init = TRUE; 0276: LPDIRECT3DSURFACE8 lpZbuffer = NULL; 0277: lpD3DDev->GetDepthStencilSurface( &lpZbuffer ); 0278: 0279: //----------------------------------------------------------------------------- 0280: // CatMap 0281: //----------------------------------------------------------------------------- 0282: { 0283: lpD3DDev->SetRenderTarget(pCatTextureSurface[id], NULL); 0284: 0285: lpD3DDev->SetTextureStageState(0,D3DTSS_COLOROP, D3DTOP_SELECTARG1); 0286: lpD3DDev->SetTextureStageState(0,D3DTSS_COLORARG1, D3DTA_TEXTURE); 0287: lpD3DDev->SetTextureStageState(0, D3DTSS_MAGFILTER, D3DTEXF_POINT ); 0288: lpD3DDev->SetTextureStageState(0, D3DTSS_MINFILTER, D3DTEXF_POINT ); 0289: float size = 128.0f; 0290: TLVERTEX Vertex[] = { 0291: // x y z rhw tu tv 0292: {0.0f*size, 0.0f*size,0, 1, 0.0f, 0.0f,}, 0293: {0.5f*size, 0.0f*size,0, 1, 1.0f, 0.5f,}, 0294: {0.0f*size, 1.0f*size,0, 1, 1.0f, 1.0f,}, 0295: 0296: {0.5f*size, 0.0f*size,0, 1, 0.0f, 0.5f,}, 0297: {1.0f*size, 0.0f*size,0, 1, 1.0f, 1.0f,}, 0298: {0.0f*size, 1.0f*size,0, 1, 0.0f, 1.0f,}, 0299: 0300: {0.0f*size, 1.0f*size,0, 1, 0.0f, 0.0f,}, 0301: {1.0f*size, 0.0f*size,0, 1, 1.0f, 0.0f,}, 0302: {0.5f*size, 1.0f*size,0, 1, 1.0f, 0.5f,}, 0303: 0304: {0.5f*size, 1.0f*size,0, 1, 0.0f, 0.5f,}, 0305: {1.0f*size, 0.0f*size,0, 1, 0.0f, 0.0f,}, 0306: {1.0f*size, 1.0f*size,0, 1, 1.0f, 1.0f,}, 0307: }; 0308: 0309: if(init){ 0310: lpD3DDev->SetTexture( 0, pCatSeedTexture); // initialize 0311: }else{ 0312: lpD3DDev->SetTexture( 0, pCatTexture[1-id] ); // ordinary 0313: } 0314: lpD3DDev->SetVertexShader( FVF_TLVERTEX ); 0315: lpD3DDev->SetPixelShader(0); 0316: lpD3DDev->DrawPrimitiveUP( D3DPT_TRIANGLELIST, 4, Vertex, sizeof( TLVERTEX ) ); 0317: } 0318: 0319: //----------------------------------------------------------------------------- 0320: // Create 16 box sampling of the pBurnTexture 0321: //----------------------------------------------------------------------------- 0322: lpD3DDev->SetRenderTarget(pBlackTextureSurface, NULL ); 0323: lpD3DDev->Clear(0,NULL,D3DCLEAR_TARGET, D3DCOLOR_XRGB(0,0,0),1.0f,0); 0324: lpD3DDev->SetTextureStageState(0,D3DTSS_COLOROP, D3DTOP_SELECTARG1); 0325: lpD3DDev->SetTextureStageState(1,D3DTSS_COLOROP, D3DTOP_ADD); 0326: lpD3DDev->SetTextureStageState(2,D3DTSS_COLOROP, D3DTOP_ADD); 0327: lpD3DDev->SetTextureStageState(3,D3DTSS_COLOROP, D3DTOP_ADD); 0328: lpD3DDev->SetTextureStageState(0,D3DTSS_COLORARG1, D3DTA_TEXTURE); 0329: lpD3DDev->SetTextureStageState(1,D3DTSS_COLORARG1, D3DTA_TEXTURE); 0330: lpD3DDev->SetTextureStageState(2,D3DTSS_COLORARG1, D3DTA_TEXTURE); 0331: lpD3DDev->SetTextureStageState(3,D3DTSS_COLORARG1, D3DTA_TEXTURE); 0332: lpD3DDev->SetTextureStageState(1,D3DTSS_COLORARG2, D3DTA_CURRENT); 0333: lpD3DDev->SetTextureStageState(2,D3DTSS_COLORARG2, D3DTA_CURRENT); 0334: lpD3DDev->SetTextureStageState(3,D3DTSS_COLORARG2, D3DTA_CURRENT); 0335: lpD3DDev->SetTextureStageState(0,D3DTSS_ADDRESSU, D3DTADDRESS_CLAMP); 0336: lpD3DDev->SetTextureStageState(1,D3DTSS_ADDRESSU, D3DTADDRESS_CLAMP); 0337: lpD3DDev->SetTextureStageState(2,D3DTSS_ADDRESSU, D3DTADDRESS_CLAMP); 0338: lpD3DDev->SetTextureStageState(3,D3DTSS_ADDRESSU, D3DTADDRESS_CLAMP); 0339: lpD3DDev->SetTextureStageState(0,D3DTSS_ADDRESSV, D3DTADDRESS_CLAMP); 0340: lpD3DDev->SetTextureStageState(1,D3DTSS_ADDRESSV, D3DTADDRESS_CLAMP); 0341: lpD3DDev->SetTextureStageState(2,D3DTSS_ADDRESSV, D3DTADDRESS_CLAMP); 0342: lpD3DDev->SetTextureStageState(3,D3DTSS_ADDRESSV, D3DTADDRESS_CLAMP); 0343: 0344: TLVERTEX BlackVertex[] = { 0345: // x y z rhw tu tv 0346: { -1, 1, 0.1f, 1.f, 0, 0,}, 0347: { 1, 1, 0.1f, 1.f, 1, 0,}, 0348: { 1, -1, 0.1f, 1.f, 1, 1,}, 0349: { -1, -1, 0.1f, 1.f, 0, 1,}, 0350: }; 0351: 0352: pBlackVC->SetShaderActive(); 0353: lpD3DDev->SetTexture(0, pBurnTexture); 0354: lpD3DDev->SetTexture(1, pBurnTexture); 0355: lpD3DDev->SetTexture(2, pBurnTexture); 0356: lpD3DDev->SetTexture(3, pBurnTexture); 0357: lpD3DDev->DrawPrimitiveUP( D3DPT_TRIANGLEFAN, 2, BlackVertex, sizeof( TLVERTEX ) ); 0358: lpD3DDev->SetTexture(0, NULL); 0359: lpD3DDev->SetTexture(1, NULL); 0360: lpD3DDev->SetTexture(2, NULL); 0361: lpD3DDev->SetTexture(3, NULL); 0362: 0363: //----------------------------------------------------------------------------- 0364: // Create 3D Burn map 0365: //----------------------------------------------------------------------------- 0366: D3DXVECTOR3 eye = D3DXVECTOR3(0.0f, 2.0f, 4.0f); 0367: D3DXVECTOR3 lookAt = D3DXVECTOR3(0.0f, 1.0f, 0.0f); 0368: D3DXVECTOR3 up = D3DXVECTOR3(0.0f, 1.0f, 0.0f); 0369: D3DXMatrixLookAtLH(&mView, &eye, &lookAt, &up); 0370: mat = view.Get() * gProj; 0371: 0372: lpD3DDev->SetRenderTarget(pEnvTextureSurface, lpZbuffer ); 0373: lpD3DDev->Clear(0,NULL,D3DCLEAR_ZBUFFER, 0,1.0f,0); 0374: pVertexProgramContainer->SetShaderActive(); 0375: pPixelProgramContainer->SetShaderActive(); 0376: DrawModel(lpD3DDev, mat, 1); 0377: 0378: //----------------------------------------------------------------------------- 0379: // Create fire effect 0380: //----------------------------------------------------------------------------- 0381: lpD3DDev->SetRenderTarget(pFireTextureSurface[id], NULL); 0382: lpD3DDev->Clear(0,NULL,D3DCLEAR_TARGET, D3DCOLOR_XRGB(0,0,0),1.0f,0); 0383: 0384: if(!init){ 0385: lpD3DDev->SetTextureStageState(0,D3DTSS_COLOROP, D3DTOP_SELECTARG1); 0386: lpD3DDev->SetTextureStageState(0,D3DTSS_COLORARG1, D3DTA_TEXTURE); 0387: lpD3DDev->SetTextureStageState(1,D3DTSS_COLOROP, D3DTOP_SELECTARG1); 0388: lpD3DDev->SetTextureStageState(1,D3DTSS_COLORARG1, D3DTA_TEXTURE); 0389: lpD3DDev->SetTextureStageState(0, D3DTSS_MAGFILTER, D3DTEXF_POINT ); 0390: lpD3DDev->SetTextureStageState(0, D3DTSS_MINFILTER, D3DTEXF_POINT ); 0391: lpD3DDev->SetTextureStageState(1, D3DTSS_MAGFILTER, D3DTEXF_POINT ); 0392: lpD3DDev->SetTextureStageState(1, D3DTSS_MINFILTER, D3DTEXF_POINT ); 0393: lpD3DDev->SetTextureStageState(0,D3DTSS_ADDRESSU, D3DTADDRESS_CLAMP); 0394: lpD3DDev->SetTextureStageState(0,D3DTSS_ADDRESSV, D3DTADDRESS_CLAMP); 0395: lpD3DDev->SetTextureStageState(1,D3DTSS_ADDRESSU, D3DTADDRESS_CLAMP); 0396: lpD3DDev->SetTextureStageState(1,D3DTSS_ADDRESSV, D3DTADDRESS_CLAMP); 0397: TLVERTEX Vertex[] = { 0398: // x y z rhw tu tv 0399: { -1, 1, 0.1f, 1.f, 0+0.5f/512.0f, 1+0.5f/512.0f,}, 0400: { 1, 1, 0.1f, 1.f, 1+0.5f/512.0f, 1+0.5f/512.0f,}, 0401: { 1, -1, 0.1f, 1.f, 1+0.5f/512.0f, 0+0.5f/512.0f,}, 0402: { -1, -1, 0.1f, 1.f, 0+0.5f/512.0f, 0+0.5f/512.0f,}, 0403: }; 0404: 0405: pBurnVC->SetShaderActive(); 0406: pBurnPC->SetShaderActive(); 0407: pBurnPC->SetTexture(BurnTex0_iter, pFireTexture[1-id]); 0408: pBurnPC->SetTexture(BurnTex1_iter, pEnvTexture); 0409: pBurnPC->SetTexture(BurnTex2_iter, pCatTexture[id]); 0410: lpD3DDev->DrawPrimitiveUP( D3DPT_TRIANGLEFAN, 2, Vertex, sizeof( TLVERTEX ) ); 0411: } 0412: 0413: //----------------------------------------------------------------------------- 0414: // Make final result 0415: //----------------------------------------------------------------------------- 0416: lpD3DDev->SetRenderTarget(pBackbuffer, lpZbuffer ); 0417: lpD3DDev->Clear(0,NULL,D3DCLEAR_ZBUFFER, 0,1.0f,0); 0418: 0419: pVertexProgramContainer->SetShaderActive(); 0420: pPixelProgramContainer->SetShaderActive(); 0421: lpD3DDev->SetTextureStageState(1, D3DTSS_MAGFILTER, D3DTEXF_LINEAR ); 0422: lpD3DDev->SetTextureStageState(1, D3DTSS_MINFILTER, D3DTEXF_LINEAR ); 0423: DrawModel(lpD3DDev, mat, 0); 0424: 0425: // Add burned result 0426: { 0427: lpD3DDev->SetTextureStageState(0,D3DTSS_COLOROP, D3DTOP_SELECTARG1); 0428: lpD3DDev->SetTextureStageState(0,D3DTSS_COLORARG1, D3DTA_TEXTURE); 0429: lpD3DDev->SetTextureStageState(1,D3DTSS_COLOROP, D3DTOP_DISABLE); 0430: lpD3DDev->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE); 0431: float size = 512.0f; 0432: TLVERTEX Vertex[4] = { 0433: // x y z rhw tu tv 0434: { 0, 0,0, 1, 0, 0,}, 0435: {size, 0,0, 1, 1, 0,}, 0436: {size, size,0, 1, 1, 1,}, 0437: { 0, size,0, 1, 0, 1,}, 0438: }; 0439: lpD3DDev->SetTexture( 0, pFireTexture[id] ); 0440: lpD3DDev->SetVertexShader( FVF_TLVERTEX ); 0441: lpD3DDev->SetPixelShader(0); 0442: lpD3DDev->DrawPrimitiveUP( D3DPT_TRIANGLEFAN, 2, Vertex, sizeof( TLVERTEX ) ); 0443: lpD3DDev->SetRenderState(D3DRS_ALPHABLENDENABLE, FALSE); 0444: } 0445: 0446: #if 1 0447: //----------------------------------------------------------------------------- 0448: // For debugging, this part shows rendered texture. 0449: //----------------------------------------------------------------------------- 0450: DWORD i; 0451: for(i=0;i<4;i++){ 0452: lpD3DDev->SetTextureStageState(0,D3DTSS_COLOROP, D3DTOP_SELECTARG1); 0453: lpD3DDev->SetTextureStageState(0,D3DTSS_COLORARG1, D3DTA_TEXTURE); 0454: lpD3DDev->SetTextureStageState(1,D3DTSS_COLOROP, D3DTOP_DISABLE); 0455: float scale = 128.0f; 0456: TLVERTEX Vertex[4] = { 0457: // x y z rhw tu tv 0458: { 0, 0,0, 1, 0, 0,}, 0459: {scale, 0,0, 1, 1, 0,}, 0460: {scale,scale,0, 1, 1, 1,}, 0461: { 0,scale,0, 1, 0, 1,}, 0462: }; 0463: for(DWORD j=0;j<4;j++){ 0464: Vertex[j].x += i*scale; 0465: } 0466: switch(i){ 0467: case 0: 0468: lpD3DDev->SetTexture( 0, pCatTexture[id] ); 0469: break; 0470: case 1: 0471: lpD3DDev->SetTexture( 0, pEnvTexture ); 0472: break; 0473: case 2: 0474: lpD3DDev->SetTexture( 0, pFireTexture[id] ); 0475: break; 0476: case 3: 0477: lpD3DDev->SetTexture( 0, pBlackTexture ); 0478: break; 0479: } 0480: 0481: // lpD3DDev->SetTexture( 0, pBurnTexture ); 0482: lpD3DDev->SetVertexShader( FVF_TLVERTEX ); 0483: lpD3DDev->SetPixelShader(0); 0484: lpD3DDev->DrawPrimitiveUP( D3DPT_TRIANGLEFAN, 2, Vertex, sizeof( TLVERTEX ) ); 0485: } 0486: #endif 0487: init=FALSE; 0488: id=1-id; 0489: } 0490: //----------------------------------------------------------------------------- 0491: // Name: CleanRender() 0492: //----------------------------------------------------------------------------- 0493: void CleanRender(LPDIRECT3DDEVICE8 lpD3DDev) 0494: { 0495: RELEASE(pCatSeedTexture); 0496: RELEASE(pCatTextureSurface[1]); 0497: RELEASE(pCatTextureSurface[0]); 0498: RELEASE(pCatTexture[1]); 0499: RELEASE(pCatTexture[0]); 0500: 0501: RELEASE(pFireTextureSurface[1]); 0502: RELEASE(pFireTextureSurface[0]); 0503: RELEASE(pFireTexture[1]); 0504: RELEASE(pFireTexture[0]); 0505: 0506: RELEASE(pEnvTextureSurface); 0507: RELEASE(pEnvTexture); 0508: 0509: RELEASE(pBurnTexture); 0510: 0511: RELEASE(pBlackTextureSurface); 0512: RELEASE(pBlackTexture); 0513: 0514: RELEASE(pBackbuffer); 0515: 0516: CleanBg(lpD3DDev); 0517: } 0518: //----------------------------------------------------------------------------- 0519: // eazy camera setting 0520: //----------------------------------------------------------------------------- 0521: static void set_camera(float cam_r, float cam_theta, float cam_phi, const D3DXVECTOR4 &cam_tr) 0522: { 0523: D3DXVECTOR4 v = cam_tr; 0524: view.SetLookAt(v); 0525: v.z += cam_r * (float)cos(cam_phi) * (float)cos(cam_theta); 0526: v.x += cam_r * (float)cos(cam_phi) * (float)sin(cam_theta); 0527: v.y += cam_r * (float)sin(cam_phi); 0528: view.SetEye(v); 0529: } 0530: //----------------------------------------------------------------------------- 0531: // Name: MyMsgProc() 0532: //----------------------------------------------------------------------------- 0533: LRESULT CALLBACK MyMsgProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam) 0534: { 0535: static int type = 0; 0536: // mouse position 0537: static long prevX = 0; 0538: static long prevY = 0; 0539: long x,y,dx,dy; 0540: // camera 0541: static D3DXVECTOR4 cam_tr = D3DXVECTOR4(0.0f, 0.5f, 0.0f, 0.0f); 0542: static float cam_r = 5.0f; 0543: static float cam_theta = D3DX_PI; 0544: static float cam_phi = 0.3f*D3DX_PI; 0545: 0546: switch(msg){ 0547: case WM_CREATE: 0548: set_camera(cam_r, cam_theta, cam_phi, cam_tr); 0549: break; 0550: case WM_RBUTTONDOWN: 0551: type=1; 0552: prevX = (lParam << 16) >> 16; 0553: prevY = lParam >> 16; 0554: SetCapture(hWnd); 0555: break; 0556: case WM_RBUTTONUP: 0557: type=0; 0558: ReleaseCapture(); 0559: break; 0560: case WM_MOUSEMOVE: 0561: x = (lParam << 16) >> 16; 0562: y = lParam >> 16; 0563: dx = x - prevX; 0564: dy = y - prevY; 0565: switch(type){ 0566: case 1:// camera 0567: if(wParam & MK_RBUTTON){ 0568: if(dy != 0){ 0569: cam_phi += 0.005f*dy; 0570: if( 0.499f*D3DX_PI<cam_phi)cam_phi = 0.499f*D3DX_PI; 0571: if(cam_phi<-0.000f*D3DX_PI)cam_phi =-0.000f*D3DX_PI; 0572: set_camera(cam_r, cam_theta, cam_phi, cam_tr); 0573: } 0574: if(dx != 0){ 0575: cam_theta += 0.005f*dx; 0576: set_camera(cam_r, cam_theta, cam_phi, cam_tr); 0577: } 0578: } 0579: break; 0580: } 0581: prevX = x; 0582: prevY = y; 0583: break; 0584: case 0x020A:// WM_MOUSEWHEEL 0585: cam_r += 0.001f*(float)(short)HIWORD(wParam); 0586: if(cam_r<=0.1f)cam_r = 0.1f; 0587: if(7.0f<cam_r)cam_r = 7.0f; 0588: 0589: set_camera(cam_r, cam_theta, cam_phi, cam_tr); 0590: break; 0591: } 0592: 0593: return 0L; 0594: }