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: // Collision 0030: cgProgramContainer *pCollVC = 0; 0031: cgBindIter * trans_iter = 0; 0032: cgBindIter * velocity_iter = 0; 0033: cgBindIter * viewproj_matrix_iter = 0; 0034: cgBindIter * color_iter = 0; 0035: 0036: // Burn 0037: cgProgramContainer *pBurnVC = 0; 0038: cgProgramContainer *pBurnPC = 0; 0039: cgBindIter * BurnTex0_iter = 0; 0040: cgBindIter * BurnTex1_iter = 0; 0041: cgBindIter * BurnTex2_iter = 0; 0042: 0043: // Black spot 0044: cgProgramContainer *pBlackVC = 0; 0045: 0046: CMyMesh mesh; // ground 0047: CMyView view; // camera 0048: CBulletMgr bullet; // bullet 0049: float mouse[2]={150.f,200.f}; // cursol position 0050: 0051: D3DXMATRIX gProj; // Projectio matrix 0052: 0053: LPDIRECT3DSURFACE8 pBackbuffer = NULL; 0054: LPDIRECT3DTEXTURE8 pTexture=NULL; 0055: LPDIRECT3DSURFACE8 pTextureSurface=NULL; 0056: 0057: // catmap 0058: LPDIRECT3DTEXTURE8 pCatTexture[2]={NULL,NULL}; 0059: LPDIRECT3DSURFACE8 pCatTextureSurface[2]={NULL,NULL}; 0060: LPDIRECT3DTEXTURE8 pCatSeedTexture=NULL; 0061: 0062: // envmap 0063: LPDIRECT3DTEXTURE8 pEnvTexture=NULL; 0064: LPDIRECT3DSURFACE8 pEnvTextureSurface=NULL; 0065: 0066: // Result of the collision check 0067: LPDIRECT3DTEXTURE8 pHitTexture[2]={NULL,NULL}; 0068: LPDIRECT3DSURFACE8 pHitTextureSurface[2]={NULL,NULL}; 0069: LPDIRECT3DTEXTURE8 pBurnTexture=NULL; 0070: LPDIRECT3DSURFACE8 pBurnTextureSurface=NULL; 0071: 0072: // Black spot 0073: LPDIRECT3DTEXTURE8 pBlackTexture=NULL; 0074: LPDIRECT3DSURFACE8 pBlackTextureSurface=NULL; 0075: 0076: 0077: // ---------------------------------------------------------------------------- 0078: // Vertex format 0079: // ---------------------------------------------------------------------------- 0080: struct TLVERTEX 0081: { 0082: float x,y,z,rhw; 0083: float tu,tv; 0084: }; 0085: #define FVF_TLVERTEX (D3DFVF_XYZRHW | D3DFVF_TEX1) 0086: 0087: // ---------------------------------------------------------------------------- 0088: void InitBg(LPDIRECT3DDEVICE8 lpD3DDev); 0089: void DrawBg(LPDIRECT3DDEVICE8 lpD3DDev, D3DXMATRIX &mVP, bool texture); 0090: void CleanBg(LPDIRECT3DDEVICE8 lpD3DDev); 0091: 0092: 0093: //----------------------------------------------------------------------------- 0094: // Name: InitRender() 0095: //----------------------------------------------------------------------------- 0096: HRESULT InitRender(LPDIRECT3DDEVICE8 lpD3DDev) 0097: { 0098: HRESULT hr; 0099: DWORD i; 0100: 0101: cgVertexDefinition vertex_attributes[] = { 0102: {D3DVSDT_FLOAT4, "position", 0}, 0103: {D3DVSDT_FLOAT2, "texcoord0", 0}, 0104: CGVERTEXDEFINITIONEND 0105: }; 0106: 0107: // ================================================== 0108: // Initialization of the sky 0109: // ================================================== 0110: InitBg(lpD3DDev); 0111: 0112: // ================================================== 0113: // read the ground mesh 0114: // ================================================== 0115: mesh.Load(lpD3DDev, "map.x"); 0116: 0117: // ================================================== 0118: // Initializatioon of the Cg 0119: // ================================================== 0120: cg.AddFilePath(".."); 0121: pContextContainer = cg.CreateContextContainer(lpD3DDev); 0122: 0123: // ================================================== 0124: // Almost fixed function 0125: // ================================================== 0126: pVertexProgramContainer = pContextContainer->LoadCGProgramFromFile( 0127: "vs.cg", "Vertex Shader", cgDX8VertexProfile, vertex_attributes); 0128: 0129: if (pVertexProgramContainer == NULL) {// error 0130: const char * listing = pContextContainer->GetLastListing(); 0131: if (listing == 0) listing = "Could not find cgc.exe."; 0132: cg.NotePad("頂点シェーダープログラムの生成に失敗しました\n\n", listing); 0133: exit(1); // end 0134: } 0135: vertex_mat_iter = pVertexProgramContainer->GetParameterBindByName("worldviewproj_matrix"); 0136: 0137: pPixelProgramContainer = pContextContainer->LoadCGProgramFromFile( 0138: "ps.cg", "test", cgDX8PixelProfile); 0139: if (NULL == pPixelProgramContainer) { // error 0140: const char * error_text = pContextContainer->GetLastListing(); 0141: cg.NotePad("ピクセルシェーダープログラムの生成に失敗しました\n\n\n", error_text); 0142: exit(1); // end 0143: } 0144: tex0_iter = pPixelProgramContainer->GetTextureBindByName("tex0"); 0145: tex1_iter = pPixelProgramContainer->GetTextureBindByName("tex1"); 0146: 0147: // ================================================== 0148: // Collision Shader 0149: // ================================================== 0150: pCollVC = pContextContainer->LoadCGProgramFromFile( 0151: "CollisionV.cg", "Vertex Shader", cgDX8VertexProfile, vertex_attributes); 0152: if (NULL == pCollVC) { 0153: const char * listing = pContextContainer->GetLastListing(); 0154: if (listing == 0) listing = "Could not find cgc.exe."; 0155: cg.NotePad("頂点シェーダープログラムの生成に失敗しました\n\n", listing); 0156: exit(1); 0157: } 0158: trans_iter = pCollVC->GetParameterBindByName("trans"); 0159: velocity_iter = pCollVC->GetParameterBindByName("velocity"); 0160: viewproj_matrix_iter= pCollVC->GetParameterBindByName("viewproj_matrix"); 0161: color_iter = pCollVC->GetParameterBindByName("color"); 0162: 0163: // ================================================== 0164: // This program creates the fire effect 0165: // ================================================== 0166: pBurnVC = pContextContainer->LoadCGProgramFromFile( 0167: "BurnV.cg", "Vertex Shader", cgDX8VertexProfile, vertex_attributes); 0168: if (NULL == pBurnVC) { 0169: const char * listing = pContextContainer->GetLastListing(); 0170: if (listing == 0) listing = "Could not find cgc.exe."; 0171: cg.NotePad("頂点シェーダープログラムの生成に失敗しました\n\n", listing); 0172: exit(1); 0173: } 0174: 0175: pBurnPC = pContextContainer->LoadCGProgramFromFile( 0176: "BurnP.cg", "test", cgDX8PixelProfile); 0177: if (NULL == pBurnPC) { 0178: const char * error_text = pContextContainer->GetLastListing(); 0179: cg.NotePad("ピクセルシェーダープログラムの生成に失敗しました\n\n\n", error_text); 0180: exit(1); 0181: } 0182: BurnTex0_iter = pBurnPC->GetTextureBindByName("tex0"); 0183: BurnTex1_iter = pBurnPC->GetTextureBindByName("tex1"); 0184: BurnTex2_iter = pBurnPC->GetTextureBindByName("tex2"); 0185: 0186: // ================================================== 0187: // This program creates the black spots 0188: // ================================================== 0189: pBlackVC = pContextContainer->LoadCGProgramFromFile( 0190: "BlackV.cg", "Vertex Shader", cgDX8VertexProfile, vertex_attributes); 0191: if (NULL == pBlackVC) { 0192: const char * listing = pContextContainer->GetLastListing(); 0193: if (listing == 0) listing = "Could not find cgc.exe."; 0194: cg.NotePad("頂点シェーダープログラムの生成に失敗しました\n\n", listing); 0195: exit(1); 0196: } 0197: // ================================================== 0198: // Texture for the seed of the fire (CatMap) 0199: // ================================================== 0200: D3DXCreateTextureFromFileEx(lpD3DDev, "fire.bmp",0,0,0,0,D3DFMT_A8R8G8B8, 0201: D3DPOOL_MANAGED, D3DX_FILTER_LINEAR, D3DX_FILTER_LINEAR, 0202: 0, NULL, NULL, &pCatSeedTexture); 0203: 0204: 0205: // ================================================== 0206: // Create Rendering Texture 0207: // ================================================== 0208: // Backup back buffers 0209: D3DSURFACE_DESC Desc; 0210: LPDIRECT3DSURFACE8 lpZbuffer = NULL; 0211: if( FAILED(hr = lpD3DDev->GetRenderTarget(&pBackbuffer))) return hr; 0212: if( FAILED(hr = pBackbuffer->GetDesc( &Desc ))) return hr; 0213: if( FAILED(hr = lpD3DDev->GetDepthStencilSurface( &lpZbuffer ))) return hr; 0214: 0215: // Collision map 0216: if( FAILED(hr = lpD3DDev->CreateTexture(Desc.Width, Desc.Height, 1 0217: , D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &pTexture))) return hr; 0218: if( FAILED(hr = pTexture->GetSurfaceLevel(0,&pTextureSurface))) return hr; 0219: if( FAILED(hr = lpD3DDev->SetRenderTarget(pTextureSurface, lpZbuffer ))) return hr; 0220: 0221: // Collision result in this frame 0222: if( FAILED(hr = lpD3DDev->CreateTexture(Desc.Width, Desc.Height, 1 0223: , D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &pBurnTexture))) return hr; 0224: if( FAILED(hr = pBurnTexture->GetSurfaceLevel(0,&pBurnTextureSurface))) return hr; 0225: if( FAILED(hr = lpD3DDev->SetRenderTarget(pBurnTextureSurface, NULL ))) return hr; 0226: 0227: if( FAILED(hr = lpD3DDev->CreateTexture(Desc.Width, Desc.Height, 1 0228: , D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &pBlackTexture))) return hr; 0229: if( FAILED(hr = pBlackTexture->GetSurfaceLevel(0,&pBlackTextureSurface))) return hr; 0230: if( FAILED(hr = lpD3DDev->SetRenderTarget(pBlackTextureSurface, NULL ))) return hr; 0231: 0232: // Total collision result 0233: if( FAILED(hr = lpD3DDev->CreateTexture(Desc.Width, Desc.Height, 1 0234: , D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &pEnvTexture))) return hr; 0235: if( FAILED(hr = pEnvTexture->GetSurfaceLevel(0,&pEnvTextureSurface))) return hr; 0236: if( FAILED(hr = lpD3DDev->SetRenderTarget(pEnvTextureSurface, lpZbuffer ))) return hr; 0237: 0238: for(i=0;i<2;i++){ 0239: // CatMap 0240: if( FAILED(hr = lpD3DDev->CreateTexture(128, 128, 1 0241: , D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &pCatTexture[i]))) return hr; 0242: if( FAILED(hr = pCatTexture[i]->GetSurfaceLevel(0,&pCatTextureSurface[i]))) return hr; 0243: // hit map 0244: if( FAILED(hr = lpD3DDev->CreateTexture(Desc.Width, Desc.Height, 1 0245: , D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &pHitTexture[i]))) return hr; 0246: if( FAILED(hr = pHitTexture[i]->GetSurfaceLevel(0,&pHitTextureSurface[i]))) return hr; 0247: } 0248: 0249: // Set rendering target to back buffer 0250: lpD3DDev->SetRenderTarget(pBackbuffer, lpZbuffer ); 0251: 0252: // ================================================== 0253: // Initialize render states 0254: // ================================================== 0255: lpD3DDev->SetRenderState( D3DRS_ZENABLE, TRUE ); 0256: lpD3DDev->SetRenderState( D3DRS_LIGHTING, FALSE ); 0257: lpD3DDev->SetRenderState( D3DRS_ALPHABLENDENABLE, FALSE); 0258: lpD3DDev->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_ONE); 0259: lpD3DDev->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCCOLOR); 0260: 0261: D3DXMatrixPerspectiveFovLH(&gProj 0262: ,60.0f*D3DX_PI/180.0f 0263: ,(float)WIDTH/(float)HEIGHT 0264: ,0.01f,100.0f 0265: ); 0266: 0267: return S_OK; 0268: } 0269: 0270: //----------------------------------------------------------------------------- 0271: // Name: Render() 0272: // Desc: Draws the scene 0273: // type 0 normal 0274: // type 1 burn envmap 0275: // type 2 collision depth 0276: //----------------------------------------------------------------------------- 0277: VOID DrawModel(LPDIRECT3DDEVICE8 lpD3DDev, D3DXMATRIX &mVP, DWORD type) 0278: { 0279: if(2!=type)DrawBg(lpD3DDev, mVP, 0==type); 0280: 0281: if(0==type) bullet.Render(lpD3DDev, mVP); 0282: 0283: D3DXMATRIX m; 0284: D3DXMatrixTranspose( &m, &mVP ); 0285: pVertexProgramContainer->SetShaderConstant( vertex_mat_iter, &m ); 0286: 0287: lpD3DDev->SetStreamSource(0, mesh.pVB, sizeof(D3D_CUSTOMVERTEX)); 0288: lpD3DDev->SetIndices(mesh.pIndex,0); 0289: 0290: switch(type){ 0291: case 1: 0292: pPixelProgramContainer->SetTexture(tex0_iter, pBurnTexture); 0293: pPixelProgramContainer->SetTexture(tex1_iter, NULL); 0294: break; 0295: case 2: 0296: pPixelProgramContainer->SetTexture(tex0_iter, NULL); 0297: pPixelProgramContainer->SetTexture(tex1_iter, NULL); 0298: break; 0299: default: 0300: pPixelProgramContainer->SetTexture(tex0_iter, mesh.pTextures[0]); 0301: pPixelProgramContainer->SetTexture(tex1_iter, pBlackTexture); 0302: break; 0303: } 0304: 0305: lpD3DDev->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, 0306: mesh.pSubsetTable[0].VertexStart, 0307: mesh.pSubsetTable[0].VertexCount, 0308: mesh.pSubsetTable[0].FaceStart * 3, 0309: mesh.pSubsetTable[0].FaceCount); 0310: } 0311: //----------------------------------------------------------------------------- 0312: // Name: Render() 0313: //----------------------------------------------------------------------------- 0314: static BOOL init = TRUE; 0315: VOID Render(LPDIRECT3DDEVICE8 lpD3DDev) 0316: { 0317: D3DXMATRIX mWorld, mView, mProj, m, mat; 0318: DWORD i; 0319: static DWORD id=0; 0320: LPDIRECT3DSURFACE8 lpZbuffer = NULL; 0321: lpD3DDev->GetDepthStencilSurface( &lpZbuffer ); 0322: 0323: static DWORD last = 0; 0324: DWORD now = timeGetTime(); 0325: DWORD cnt = now-last; 0326: last = now; 0327: 0328: if(init){ 0329: cnt = 0; 0330: bullet.Reset(); 0331: //----------------------------------------------------------------------------- 0332: // Clear the burning information 0333: //----------------------------------------------------------------------------- 0334: lpD3DDev->SetRenderTarget(pBurnTextureSurface, NULL ); 0335: lpD3DDev->Clear(0,NULL,D3DCLEAR_TARGET, D3DCOLOR_XRGB(0,0,0),1.0f,0); 0336: lpD3DDev->SetRenderTarget(pBackbuffer, lpZbuffer ); 0337: } 0338: 0339: //----------------------------------------------------------------------------- 0340: // Sometimes shooting a star 0341: //----------------------------------------------------------------------------- 0342: static DWORD start_cnt=0xffffffff; 0343: if(now<start_cnt || 3000<now-start_cnt){ 0344: D3DXVECTOR4 x, v; 0345: x.x = (10.0f/4096.0f)*(float)(rand()%0xfff)-5.0f; 0346: x.z = (10.0f/4096.0f)*(float)(rand()%0xfff)-5.0f; 0347: x.y = 10.0f; 0348: v.x = (10.0f/4096.0f)*(float)(rand()%0xfff)-5.0f; 0349: v.z = (10.0f/4096.0f)*(float)(rand()%0xfff)-5.0f; 0350: v.y = 0.0f; 0351: v = v - x; 0352: D3DXVec4Normalize(&v,&v); 0353: bullet.Add(x, BULLET_SPEED*v); 0354: 0355: start_cnt = now; 0356: } 0357: 0358: //----------------------------------------------------------------------------- 0359: // Move bullets 0360: //----------------------------------------------------------------------------- 0361: bullet.Update(cnt); 0362: 0363: //----------------------------------------------------------------------------- 0364: // CatMap 0365: //----------------------------------------------------------------------------- 0366: { 0367: lpD3DDev->SetRenderTarget(pCatTextureSurface[id], NULL); 0368: 0369: lpD3DDev->SetTextureStageState(0,D3DTSS_COLOROP, D3DTOP_SELECTARG1); 0370: lpD3DDev->SetTextureStageState(0,D3DTSS_COLORARG1, D3DTA_TEXTURE); 0371: lpD3DDev->SetTextureStageState(0, D3DTSS_MAGFILTER, D3DTEXF_POINT ); 0372: lpD3DDev->SetTextureStageState(0, D3DTSS_MINFILTER, D3DTEXF_POINT ); 0373: float size = 128.0f; 0374: TLVERTEX Vertex[] = { 0375: // x y z rhw tu tv 0376: {0.0f*size, 0.0f*size,0, 1, 0.0f, 0.0f,}, 0377: {0.5f*size, 0.0f*size,0, 1, 1.0f, 0.5f,}, 0378: {0.0f*size, 1.0f*size,0, 1, 1.0f, 1.0f,}, 0379: 0380: {0.5f*size, 0.0f*size,0, 1, 0.0f, 0.5f,}, 0381: {1.0f*size, 0.0f*size,0, 1, 1.0f, 1.0f,}, 0382: {0.0f*size, 1.0f*size,0, 1, 0.0f, 1.0f,}, 0383: 0384: {0.0f*size, 1.0f*size,0, 1, 0.0f, 0.0f,}, 0385: {1.0f*size, 0.0f*size,0, 1, 1.0f, 0.0f,}, 0386: {0.5f*size, 1.0f*size,0, 1, 1.0f, 0.5f,}, 0387: 0388: {0.5f*size, 1.0f*size,0, 1, 0.0f, 0.5f,}, 0389: {1.0f*size, 0.0f*size,0, 1, 0.0f, 0.0f,}, 0390: {1.0f*size, 1.0f*size,0, 1, 1.0f, 1.0f,}, 0391: }; 0392: 0393: if(init){ 0394: lpD3DDev->SetTexture( 0, pCatSeedTexture); // initialize 0395: }else{ 0396: lpD3DDev->SetTexture( 0, pCatTexture[1-id] ); // ordinary 0397: } 0398: lpD3DDev->SetVertexShader( FVF_TLVERTEX ); 0399: lpD3DDev->SetPixelShader(0); 0400: lpD3DDev->DrawPrimitiveUP( D3DPT_TRIANGLELIST, 4, Vertex, sizeof( TLVERTEX ) ); 0401: } 0402: 0403: //----------------------------------------------------------------------------- 0404: // Create Collision Map 0405: //----------------------------------------------------------------------------- 0406: lpD3DDev->SetRenderTarget(pTextureSurface, lpZbuffer); 0407: lpD3DDev->Clear(0,NULL,D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(0,0,0),1.0f,0); 0408: 0409: // Create Depth Map 0410: D3DXVECTOR3 eye = D3DXVECTOR3(0.0f,-10.0f, 0.0f); 0411: D3DXVECTOR3 lookAt = D3DXVECTOR3(0.0f, 0.0f, 0.0f); 0412: D3DXVECTOR3 up = D3DXVECTOR3(0.0f, 0.0f, 1.0f); 0413: D3DXMatrixLookAtLH(&mView, &eye, &lookAt, &up); 0414: D3DXMatrixPerspectiveFovLH(&mProj 0415: ,D3DX_PI/3.5f 0416: ,1.0f 0417: ,0.01f,100.0f 0418: ); 0419: mat = mView * mProj; 0420: lpD3DDev->SetRenderState(D3DRS_CULLMODE, D3DCULL_CW); 0421: lpD3DDev->SetRenderState(D3DRS_COLORWRITEENABLE, 0); 0422: pVertexProgramContainer->SetShaderActive(); 0423: pPixelProgramContainer->SetShaderActive(); 0424: DrawModel(lpD3DDev, mat, 2); 0425: lpD3DDev->SetRenderState(D3DRS_COLORWRITEENABLE, 0xf); 0426: lpD3DDev->SetRenderState(D3DRS_ZWRITEENABLE, FALSE); 0427: 0428: D3DXMatrixTranspose( &m, &mat ); 0429: pCollVC->SetShaderConstant( viewproj_matrix_iter, &m ); 0430: 0431: for(i=0;i<bullet.GetNum();i++){ 0432: if(!bullet.IsActive(i)) continue; 0433: D3DXVECTOR4 &x = bullet.GetPosition(i); 0434: D3DXVECTOR4 &v = bullet.GetVelosity(i); 0435: 0436: lpD3DDev->SetRenderTarget(pTextureSurface, lpZbuffer); 0437: lpD3DDev->Clear(0,NULL,D3DCLEAR_TARGET, D3DCOLOR_XRGB(0,0,0),1.0f,0); 0438: // Draw bullte from Front side 0439: lpD3DDev->SetTextureStageState(0,D3DTSS_COLOROP, D3DTOP_SELECTARG1); 0440: lpD3DDev->SetTextureStageState(0,D3DTSS_COLORARG1, D3DTA_DIFFUSE); 0441: lpD3DDev->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE); 0442: pCollVC->SetShaderActive(); 0443: lpD3DDev->SetPixelShader(0); 0444: 0445: pCollVC->SetShaderConstant( trans_iter, &x ); 0446: pCollVC->SetShaderConstant( velocity_iter, &v ); 0447: pCollVC->SetShaderConstant( color_iter, D3DXVECTOR4(1.0f,1.0f,1.0f,1.0f) ); 0448: bullet.Draw(i, lpD3DDev); 0449: 0450: // Draw bullte from Back side 0451: lpD3DDev->SetRenderState(D3DRS_CULLMODE, D3DCULL_CW); 0452: pCollVC->SetShaderConstant( color_iter, D3DXVECTOR4(0.0f,0.0f,0.0f,1.0f) ); 0453: bullet.Draw(i, lpD3DDev); 0454: lpD3DDev->SetRenderState(D3DRS_CULLMODE, D3DCULL_CCW); 0455: 0456: // Add 0457: lpD3DDev->SetRenderTarget(pBurnTextureSurface, NULL ); 0458: lpD3DDev->SetTextureStageState(0,D3DTSS_COLOROP, D3DTOP_SELECTARG1); 0459: lpD3DDev->SetTextureStageState(0,D3DTSS_COLORARG1, D3DTA_TEXTURE); 0460: lpD3DDev->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE); 0461: float size = 512.0f; 0462: TLVERTEX Vertex[4] = { 0463: // x y z rhw tu tv 0464: { 0, 0,0, 1, 1, 0,}, 0465: {size, 0,0, 1, 0, 0,}, 0466: {size, size,0, 1, 0, 1,}, 0467: { 0, size,0, 1, 1, 1,}, 0468: }; 0469: lpD3DDev->SetTexture( 0, pTexture); 0470: lpD3DDev->SetVertexShader( FVF_TLVERTEX ); 0471: lpD3DDev->SetPixelShader(0); 0472: lpD3DDev->DrawPrimitiveUP( D3DPT_TRIANGLEFAN, 2, Vertex, sizeof( TLVERTEX ) ); 0473: lpD3DDev->SetRenderState(D3DRS_ALPHABLENDENABLE, FALSE); 0474: } 0475: lpD3DDev->SetRenderState(D3DRS_ZWRITEENABLE, TRUE); 0476: lpD3DDev->SetRenderState(D3DRS_CULLMODE, D3DCULL_CCW); 0477: 0478: //----------------------------------------------------------------------------- 0479: // Create 16 box sampling of the pBurnTexture 0480: //----------------------------------------------------------------------------- 0481: lpD3DDev->SetRenderTarget(pBlackTextureSurface, NULL ); 0482: lpD3DDev->Clear(0,NULL,D3DCLEAR_TARGET, D3DCOLOR_XRGB(0,0,0),1.0f,0); 0483: lpD3DDev->SetTextureStageState(0,D3DTSS_COLOROP, D3DTOP_SELECTARG1); 0484: lpD3DDev->SetTextureStageState(1,D3DTSS_COLOROP, D3DTOP_ADD); 0485: lpD3DDev->SetTextureStageState(2,D3DTSS_COLOROP, D3DTOP_ADD); 0486: lpD3DDev->SetTextureStageState(3,D3DTSS_COLOROP, D3DTOP_ADD); 0487: lpD3DDev->SetTextureStageState(0,D3DTSS_COLORARG1, D3DTA_TEXTURE); 0488: lpD3DDev->SetTextureStageState(1,D3DTSS_COLORARG1, D3DTA_TEXTURE); 0489: lpD3DDev->SetTextureStageState(2,D3DTSS_COLORARG1, D3DTA_TEXTURE); 0490: lpD3DDev->SetTextureStageState(3,D3DTSS_COLORARG1, D3DTA_TEXTURE); 0491: lpD3DDev->SetTextureStageState(1,D3DTSS_COLORARG2, D3DTA_CURRENT); 0492: lpD3DDev->SetTextureStageState(2,D3DTSS_COLORARG2, D3DTA_CURRENT); 0493: lpD3DDev->SetTextureStageState(3,D3DTSS_COLORARG2, D3DTA_CURRENT); 0494: lpD3DDev->SetTextureStageState(0,D3DTSS_ADDRESSU, D3DTADDRESS_CLAMP); 0495: lpD3DDev->SetTextureStageState(1,D3DTSS_ADDRESSU, D3DTADDRESS_CLAMP); 0496: lpD3DDev->SetTextureStageState(2,D3DTSS_ADDRESSU, D3DTADDRESS_CLAMP); 0497: lpD3DDev->SetTextureStageState(3,D3DTSS_ADDRESSU, D3DTADDRESS_CLAMP); 0498: lpD3DDev->SetTextureStageState(0,D3DTSS_ADDRESSV, D3DTADDRESS_CLAMP); 0499: lpD3DDev->SetTextureStageState(1,D3DTSS_ADDRESSV, D3DTADDRESS_CLAMP); 0500: lpD3DDev->SetTextureStageState(2,D3DTSS_ADDRESSV, D3DTADDRESS_CLAMP); 0501: lpD3DDev->SetTextureStageState(3,D3DTSS_ADDRESSV, D3DTADDRESS_CLAMP); 0502: 0503: TLVERTEX BlackVertex[] = { 0504: // x y z rhw tu tv 0505: { -1, 1, 0.1f, 1.f, 0, 0,}, 0506: { 1, 1, 0.1f, 1.f, 1, 0,}, 0507: { 1, -1, 0.1f, 1.f, 1, 1,}, 0508: { -1, -1, 0.1f, 1.f, 0, 1,}, 0509: }; 0510: 0511: pBlackVC->SetShaderActive(); 0512: lpD3DDev->SetTexture(0, pBurnTexture); 0513: lpD3DDev->SetTexture(1, pBurnTexture); 0514: lpD3DDev->SetTexture(2, pBurnTexture); 0515: lpD3DDev->SetTexture(3, pBurnTexture); 0516: lpD3DDev->DrawPrimitiveUP( D3DPT_TRIANGLEFAN, 2, BlackVertex, sizeof( TLVERTEX ) ); 0517: lpD3DDev->SetTexture(0, NULL); 0518: lpD3DDev->SetTexture(1, NULL); 0519: lpD3DDev->SetTexture(2, NULL); 0520: lpD3DDev->SetTexture(3, NULL); 0521: 0522: //----------------------------------------------------------------------------- 0523: // Create 3D Collision map 0524: //----------------------------------------------------------------------------- 0525: eye = D3DXVECTOR3(0.0f, 2.0f, 4.0f); 0526: lookAt = D3DXVECTOR3(0.0f, 1.0f, 0.0f); 0527: up = D3DXVECTOR3(0.0f, 1.0f, 0.0f); 0528: D3DXMatrixLookAtLH(&mView, &eye, &lookAt, &up); 0529: mat = view.Get() * gProj; 0530: 0531: lpD3DDev->SetRenderTarget(pEnvTextureSurface, lpZbuffer ); 0532: lpD3DDev->Clear(0,NULL,D3DCLEAR_ZBUFFER, 0,1.0f,0); 0533: pVertexProgramContainer->SetShaderActive(); 0534: pPixelProgramContainer->SetShaderActive(); 0535: DrawModel(lpD3DDev, mat, 1); 0536: 0537: //----------------------------------------------------------------------------- 0538: // Create fire effect 0539: //----------------------------------------------------------------------------- 0540: lpD3DDev->SetRenderTarget(pHitTextureSurface[id], NULL); 0541: lpD3DDev->Clear(0,NULL,D3DCLEAR_TARGET, D3DCOLOR_XRGB(0,0,0),1.0f,0); 0542: 0543: if(!init){ 0544: lpD3DDev->SetTextureStageState(0,D3DTSS_COLOROP, D3DTOP_SELECTARG1); 0545: lpD3DDev->SetTextureStageState(0,D3DTSS_COLORARG1, D3DTA_TEXTURE); 0546: lpD3DDev->SetTextureStageState(1,D3DTSS_COLOROP, D3DTOP_SELECTARG1); 0547: lpD3DDev->SetTextureStageState(1,D3DTSS_COLORARG1, D3DTA_TEXTURE); 0548: lpD3DDev->SetTextureStageState(0, D3DTSS_MAGFILTER, D3DTEXF_POINT ); 0549: lpD3DDev->SetTextureStageState(0, D3DTSS_MINFILTER, D3DTEXF_POINT ); 0550: lpD3DDev->SetTextureStageState(1, D3DTSS_MAGFILTER, D3DTEXF_POINT ); 0551: lpD3DDev->SetTextureStageState(1, D3DTSS_MINFILTER, D3DTEXF_POINT ); 0552: lpD3DDev->SetTextureStageState(0,D3DTSS_ADDRESSU, D3DTADDRESS_CLAMP); 0553: lpD3DDev->SetTextureStageState(0,D3DTSS_ADDRESSV, D3DTADDRESS_CLAMP); 0554: lpD3DDev->SetTextureStageState(1,D3DTSS_ADDRESSU, D3DTADDRESS_CLAMP); 0555: lpD3DDev->SetTextureStageState(1,D3DTSS_ADDRESSV, D3DTADDRESS_CLAMP); 0556: TLVERTEX Vertex[] = { 0557: // x y z rhw tu tv 0558: { -1, 1, 0.1f, 1.f, 0+0.5f/512.0f, 1+0.5f/512.0f,}, 0559: { 1, 1, 0.1f, 1.f, 1+0.5f/512.0f, 1+0.5f/512.0f,}, 0560: { 1, -1, 0.1f, 1.f, 1+0.5f/512.0f, 0+0.5f/512.0f,}, 0561: { -1, -1, 0.1f, 1.f, 0+0.5f/512.0f, 0+0.5f/512.0f,}, 0562: }; 0563: 0564: pBurnVC->SetShaderActive(); 0565: pBurnPC->SetShaderActive(); 0566: pBurnPC->SetTexture(BurnTex0_iter, pHitTexture[1-id]); 0567: pBurnPC->SetTexture(BurnTex1_iter, pEnvTexture); 0568: pBurnPC->SetTexture(BurnTex2_iter, pCatTexture[id]); 0569: lpD3DDev->DrawPrimitiveUP( D3DPT_TRIANGLEFAN, 2, Vertex, sizeof( TLVERTEX ) ); 0570: } 0571: 0572: //----------------------------------------------------------------------------- 0573: // Make final result 0574: //----------------------------------------------------------------------------- 0575: lpD3DDev->SetRenderTarget(pBackbuffer, lpZbuffer ); 0576: lpD3DDev->Clear(0,NULL,D3DCLEAR_ZBUFFER, 0,1.0f,0); 0577: 0578: pVertexProgramContainer->SetShaderActive(); 0579: pPixelProgramContainer->SetShaderActive(); 0580: lpD3DDev->SetTextureStageState(1, D3DTSS_MAGFILTER, D3DTEXF_LINEAR ); 0581: lpD3DDev->SetTextureStageState(1, D3DTSS_MINFILTER, D3DTEXF_LINEAR ); 0582: DrawModel(lpD3DDev, mat, 0); 0583: 0584: // Add burned result 0585: { 0586: lpD3DDev->SetTextureStageState(0,D3DTSS_COLOROP, D3DTOP_SELECTARG1); 0587: lpD3DDev->SetTextureStageState(0,D3DTSS_COLORARG1, D3DTA_TEXTURE); 0588: lpD3DDev->SetTextureStageState(1,D3DTSS_COLOROP, D3DTOP_DISABLE); 0589: lpD3DDev->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE); 0590: float size = 512.0f; 0591: TLVERTEX Vertex[4] = { 0592: // x y z rhw tu tv 0593: { 0, 0,0, 1, 0, 0,}, 0594: {size, 0,0, 1, 1, 0,}, 0595: {size, size,0, 1, 1, 1,}, 0596: { 0, size,0, 1, 0, 1,}, 0597: }; 0598: lpD3DDev->SetTexture( 0, pHitTexture[id] ); 0599: lpD3DDev->SetVertexShader( FVF_TLVERTEX ); 0600: lpD3DDev->SetPixelShader(0); 0601: lpD3DDev->DrawPrimitiveUP( D3DPT_TRIANGLEFAN, 2, Vertex, sizeof( TLVERTEX ) ); 0602: lpD3DDev->SetRenderState(D3DRS_ALPHABLENDENABLE, FALSE); 0603: } 0604: 0605: #if 0 0606: //----------------------------------------------------------------------------- 0607: // For debugging, this part shows rendered texture. 0608: //----------------------------------------------------------------------------- 0609: { 0610: lpD3DDev->SetTextureStageState(0,D3DTSS_COLOROP, D3DTOP_SELECTARG1); 0611: lpD3DDev->SetTextureStageState(0,D3DTSS_COLORARG1, D3DTA_TEXTURE); 0612: lpD3DDev->SetTextureStageState(1,D3DTSS_COLOROP, D3DTOP_DISABLE); 0613: float scale = 128.0f; 0614: TLVERTEX Vertex[4] = { 0615: // x y z rhw tu tv 0616: { 0, 0,0, 1, 0, 0,}, 0617: {scale, 0,0, 1, 1, 0,}, 0618: {scale,scale,0, 1, 1, 1,}, 0619: { 0,scale,0, 1, 0, 1,}, 0620: }; 0621: // lpD3DDev->SetTexture( 0, pCatTexture[id] ); 0622: // lpD3DDev->SetTexture( 0, pHitTexture[id] ); 0623: // lpD3DDev->SetTexture( 0, pEnvTexture ); 0624: lpD3DDev->SetTexture( 0, pBlackTexture ); 0625: // lpD3DDev->SetTexture( 0, pBurnTexture ); 0626: // lpD3DDev->SetTexture( 0, pTexture ); 0627: lpD3DDev->SetVertexShader( FVF_TLVERTEX ); 0628: lpD3DDev->SetPixelShader(0); 0629: lpD3DDev->DrawPrimitiveUP( D3DPT_TRIANGLEFAN, 2, Vertex, sizeof( TLVERTEX ) ); 0630: } 0631: #endif 0632: init=FALSE; 0633: id=1-id; 0634: } 0635: //----------------------------------------------------------------------------- 0636: // Name: CleanRender() 0637: //----------------------------------------------------------------------------- 0638: void CleanRender(LPDIRECT3DDEVICE8 lpD3DDev) 0639: { 0640: RELEASE(pCatSeedTexture); 0641: RELEASE(pCatTextureSurface[1]); 0642: RELEASE(pCatTextureSurface[0]); 0643: RELEASE(pCatTexture[1]); 0644: RELEASE(pCatTexture[0]); 0645: 0646: RELEASE(pHitTextureSurface[1]); 0647: RELEASE(pHitTextureSurface[0]); 0648: RELEASE(pHitTexture[1]); 0649: RELEASE(pHitTexture[0]); 0650: 0651: RELEASE(pEnvTextureSurface); 0652: RELEASE(pEnvTexture); 0653: 0654: RELEASE(pBurnTextureSurface); 0655: RELEASE(pBurnTexture); 0656: 0657: RELEASE(pBlackTextureSurface); 0658: RELEASE(pBlackTexture); 0659: 0660: RELEASE(pTextureSurface); 0661: RELEASE(pTexture); 0662: RELEASE(pBackbuffer); 0663: 0664: CleanBg(lpD3DDev); 0665: } 0666: //----------------------------------------------------------------------------- 0667: // eazy camera setting 0668: //----------------------------------------------------------------------------- 0669: static void set_camera(float cam_r, float cam_theta, float cam_phi, const D3DXVECTOR4 &cam_tr) 0670: { 0671: D3DXVECTOR4 v = cam_tr; 0672: view.SetLookAt(v); 0673: v.z += cam_r * (float)cos(cam_phi) * (float)cos(cam_theta); 0674: v.x += cam_r * (float)cos(cam_phi) * (float)sin(cam_theta); 0675: v.y += cam_r * (float)sin(cam_phi); 0676: view.SetEye(v); 0677: } 0678: //----------------------------------------------------------------------------- 0679: // Name: MyMsgProc() 0680: //----------------------------------------------------------------------------- 0681: LRESULT CALLBACK MyMsgProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam) 0682: { 0683: static int type = 0; 0684: // mouse position 0685: static long prevX = 0; 0686: static long prevY = 0; 0687: long x,y,dx,dy; 0688: // camera 0689: static D3DXVECTOR4 cam_tr = D3DXVECTOR4(0.0f, 0.5f, 0.0f, 0.0f); 0690: static float cam_r = 5.0f; 0691: static float cam_theta = 0.0f; 0692: static float cam_phi = 0.1f*D3DX_PI; 0693: 0694: switch(msg){ 0695: case WM_CREATE: 0696: set_camera(cam_r, cam_theta, cam_phi, cam_tr); 0697: break; 0698: case WM_RBUTTONDOWN: 0699: type=1; 0700: prevX = (lParam << 16) >> 16; 0701: prevY = lParam >> 16; 0702: SetCapture(hWnd); 0703: break; 0704: case WM_LBUTTONDOWN: 0705: { 0706: D3DXMATRIX mat = view.Get() * gProj; 0707: D3DXVECTOR4 c = D3DXVECTOR4(mouse[0]/256.0f-1,1-mouse[1]/256.0f,1.0f,1.f); 0708: D3DXMatrixInverse(&mat, NULL, &mat); 0709: D3DXVec4Transform (&c, &c, &mat); 0710: D3DXVECTOR4 x = view.GetEye(); x.y -= 0.2f; 0711: D3DXVECTOR4 v = 100.0f*c-x; 0712: D3DXVec4Normalize(&v,&v); 0713: bullet.Add(x, BULLET_SPEED*v); 0714: } 0715: break; 0716: case WM_RBUTTONUP: 0717: type=0; 0718: ReleaseCapture(); 0719: break; 0720: case WM_MOUSEMOVE: 0721: x = (lParam << 16) >> 16; 0722: y = lParam >> 16; 0723: mouse[0] = (float)x; 0724: mouse[1] = (float)y; 0725: dx = x - prevX; 0726: dy = y - prevY; 0727: switch(type){ 0728: case 1:// camera 0729: if(wParam & MK_RBUTTON){ 0730: if(dy != 0){ 0731: cam_phi += 0.005f*dy; 0732: if( 0.499f*D3DX_PI<cam_phi)cam_phi = 0.499f*D3DX_PI; 0733: if(cam_phi<-0.000f*D3DX_PI)cam_phi =-0.000f*D3DX_PI; 0734: set_camera(cam_r, cam_theta, cam_phi, cam_tr); 0735: } 0736: if(dx != 0){ 0737: cam_theta += 0.005f*dx; 0738: set_camera(cam_r, cam_theta, cam_phi, cam_tr); 0739: } 0740: } 0741: break; 0742: } 0743: prevX = x; 0744: prevY = y; 0745: break; 0746: case 0x020A:// WM_MOUSEWHEEL 0747: cam_r += 0.001f*(float)(short)HIWORD(wParam); 0748: if(cam_r<=0.1f)cam_r = 0.1f; 0749: if(5.0f<cam_r)cam_r = 5.0f; 0750: 0751: set_camera(cam_r, cam_theta, cam_phi, cam_tr); 0752: break; 0753: case WM_KEYDOWN: 0754: switch(wParam){ 0755: case VK_SPACE: 0756: init = TRUE; 0757: break; 0758: default: 0759: break; 0760: } 0761: break; 0762: } 0763: 0764: return 0L; 0765: }