// WaterScene.cpp: implementation of the CWaterScene class. // ////////////////////////////////////////////////////////////////////// #include "WaterScene.h" #include "BaseDataDefine.h" #include "BaseGraphicsLayer.h" #include "RenderOption.h" #include "SceneManager.h" ////////////////////////////////////////////////////////////////////// // Construction/Destruction ////////////////////////////////////////////////////////////////////// long CWaterScene::m_lWaterTexture; CTexture CWaterScene::m_WaterTexture[MAX_WATERTEXTURE]; CRenderTexture CWaterScene::m_pRelectionTexture; CRenderTexture CWaterScene::m_pRippleTexture; TLVertex CWaterScene::m_RippleVertex[RippleVertexCount*RippleVertexCount]; WORD CWaterScene::m_RippleIndices[(RippleVertexCount-1)*(RippleVertexCount-1)*6]; LPDIRECT3DTEXTURE8 CWaterScene::m_pBumpMap[MAX_WATERTEXTURE]; LPDIRECT3DCUBETEXTURE8 CWaterScene::m_pCubeTexture=NULL; float CWaterScene::m_fWaveMove; DWORD CWaterScene::m_dwWaterShader=0xffffffff; DWORD CWaterScene::m_dwWaterPixelShader=0xffffffff; LPDIRECT3DVERTEXBUFFER8 CWaterScene::m_pWaterVertexBuffer=NULL; LPDIRECT3DTEXTURE8 CWaterScene::m_WaterBumpMap; float CWaterScene::m_fUpdateWaterTexture=0.0f; //DWORD CWaterScene::m_dwWaterVertexShader=0xffffffff; //DWORD CWaterScene::m_dwWaterPixelShader=0xffffffff; inline DWORD F2DW( FLOAT f ) { return *((DWORD*)&f); } char strWaterVertexShader[]= "vs.1.0\n" "dp4 oPos.x, v0, c[2]\n" "dp4 oPos.y, v0, c[3]\n" "dp4 oPos.z, v0, c[4]\n" "dp4 oPos.w, v0, c[5]\n" "dp3 r2.w, v5, v5\n" "rsq r2.w, r2.w\n" "mul r2, v5, r2.w\n" "dp3 r3.w, v6, v6\n" "rsq r3.w, r3.w\n" "mul r3, v6, r3.w\n" "mul r1, r2.zxyw, r3.yzxw\n" "mad r1, r2.yzxw, r3.zxyw, -r1\n" "dp3 r1.w, r1, r1\n" "rsq r1.w, r1.w\n" "mul r1.xyz, r1, r1.w\n" "mul r2, r2, c[13].w\n" "mul r3, r3, c[13].w\n" "dp3 oT1.x, r2, c[9]\n" "dp3 oT1.y, r3, c[9]\n" "dp3 oT1.z, r1, c[9]\n" "dp3 oT2.x, r2, c[10]\n" "dp3 oT2.y, r3, c[10]\n" "dp3 oT2.z, r1, c[10]\n" "dp3 oT3.x, r2, c[11]\n" "dp3 oT3.y, r3, c[11]\n" "dp3 oT3.z, r1, c[11]\n" "dp3 r0.x, v0, c[6]\n" "dp3 r0.y, v0, c[7]\n" "dp3 r0.zw, v0, c[8]\n" "add r4, -r0, c[12]\n" "mov oT1.w, r4.x\n" "mov oT2.w, r4.y\n" "mov oT3.w, r4.z\n" "mov oD0, c[1]\n" "mov oT0.xy, v3\n" "dp4 oFog.x, v0, c[4]\n"; /* char strWaterVertexShader[]= "vs.1.0\n" "m4x4 oPos, v0, c2\n" "mov oT0.xy, v3.xy\n" // Bump "mov r1,c13\n"//LightDirection "sub r0, c12, v0\n" //Viewer direction //Normalize "dp3 r11.x,r0.xyz,r0.xyz\n" "rsq r11.xyz,r11.x\n" "mul r0.xyz, r0.xyz, r11.xyz\n" "add r4.xyz, r0.xyz, r1.xyz\n" //Halfway //;r4 = tangent space halfway vector "dp3 r6.x, v5, r4\n" "dp3 r6.y, v6, r4\n" "dp3 r6.z, v4, r4\n" "mov oT1.xyz,r6.xyz\n"; // Halfway vector to be renormalized by cube map */ char strWaterPixelShader[]= "ps.1.0\n" "tex t0 \n" "texm3x3pad t1, t0\n" "texm3x3pad t2, t0\n" "texm3x3vspec t3,t0\n" "mul r0,c0,t3\n"; /* char strWaterPixelShader[]= "ps.1.1\n" "def c0, 0.4, 0.4, 0.4, 0.4\n" "def c1, 0.25, 0.25, 0.25, 0.25\n" "tex t0\n"//normal "tex t1\n"//normalize cube "mul r1,t0,c0\n" "dp3_sat r0,r1_bx2,t1_bx2\n"//N.H "mul r1,r0,r0\n" "mul r0,r1,r1\n" "mul r1,r0,r0\n" "mul r0,r1,r1\n" "mul r1,r0,r0\n" "mul r0,r1,c1\n"; */ CWaterScene::CWaterScene() { m_lWaterTexture=0; } CWaterScene::~CWaterScene() { } void CWaterScene::Create() { m_WaterVertex[0].v=vector3(0.0f,0.0f,0.0f); m_WaterVertex[1].v=vector3(SECTORSIZE,0.0f,0.0f); m_WaterVertex[2].v=vector3(0.0f,0.0f,SECTORSIZE); m_WaterVertex[3].v=vector3(SECTORSIZE,0.0f,SECTORSIZE); m_WaterVertex[0].tu=0.0f; m_WaterVertex[0].tv=0.0f; m_WaterVertex[1].tu=5.0f; m_WaterVertex[1].tv=0.0f; m_WaterVertex[2].tu=0.0f; m_WaterVertex[2].tv=5.0f; m_WaterVertex[3].tu=5.0f; m_WaterVertex[3].tv=5.0f; m_WaterVertex[0].tu1=0.0f; m_WaterVertex[0].tv1=0.0f; m_WaterVertex[1].tu1=5.0f; m_WaterVertex[1].tv1=0.0f; m_WaterVertex[2].tu1=0.0f; m_WaterVertex[2].tv1=5.0f; m_WaterVertex[3].tu1=5.0f; m_WaterVertex[3].tv1=5.0f; m_WaterVertex[0].spec.c=0x0; m_WaterVertex[1].spec.c=0x0; m_WaterVertex[2].spec.c=0x0; m_WaterVertex[3].spec.c=0x0; m_WaterVertex[0].diff.c=0xccccddf0; m_WaterVertex[1].diff.c=0xccccddf0; m_WaterVertex[2].diff.c=0xccccddf0; m_WaterVertex[3].diff.c=0xccccddf0; char strWaterTextureName[256]; CTexture::SetPath(NATURETEXTUREPATH); static bool bFirstInit=false; //if(m_WaterTexture[0].GetTexture()==NULL) if(!bFirstInit) { bFirstInit=true; m_fWaveMove=0.0f; //m_pRelectionTexture.Create(SHADOWSIZE,SHADOWSIZE); //m_pRippleTexture.Create(SHADOWSIZE,SHADOWSIZE); int ix,iy; for(ix=0;ixCreateVertexShader( dwWaterVertexDecl, (DWORD*)pCode->GetBufferPointer(), &m_dwWaterShader, 0 ); pCode->Release(); sprintf(strShaderPath,"%s%s",SHADERPATH,"WaterProjection.psh"); D3DXAssembleShaderFromFile(strShaderPath,0,NULL,&pCode,NULL); BaseGraphicsLayer::GetDevice()->CreatePixelShader((DWORD*)pCode->GetBufferPointer(), &m_dwWaterPixelShader); pCode->Release(); */ BaseGraphicsLayer::GetDevice()->CreateVertexBuffer(4*sizeof(Dot3Vertex), D3DUSAGE_WRITEONLY,0,D3DPOOL_MANAGED, &m_pWaterVertexBuffer); Dot3Vertex *pVertex; m_pWaterVertexBuffer->Lock(0,0,(BYTE**)&pVertex,0); pVertex[0].v=vector3(0.0f,0.0f,0.0f); pVertex[1].v=vector3(SECTORSIZE,0.0f,0.0f); pVertex[2].v=vector3(0.0f,0.0f,SECTORSIZE); pVertex[3].v=vector3(SECTORSIZE,0.0f,SECTORSIZE); pVertex[0].Normal=vector3(0.0f,1.0f,0.0f); pVertex[1].Normal=vector3(0.0f,1.0f,0.0f); pVertex[2].Normal=vector3(0.0f,1.0f,0.0f); pVertex[3].Normal=vector3(0.0f,1.0f,0.0f); pVertex[0].tu=0.0f; pVertex[0].tv=0.0f; pVertex[1].tu=43.0f; pVertex[1].tv=0.0f; pVertex[2].tu=0.0f; pVertex[2].tv=43.0f; pVertex[3].tu=43.0f; pVertex[3].tv=43.0f; CalcBasicVector3(pVertex); m_pWaterVertexBuffer->Unlock(); LPD3DXBUFFER pCode; D3DXAssembleShader(strWaterPixelShader,strlen(strWaterPixelShader),0,NULL,&pCode,NULL); BaseGraphicsLayer::GetDevice()->CreatePixelShader((DWORD*)pCode->GetBufferPointer(),&m_dwWaterPixelShader); pCode->Release(); D3DXAssembleShader(strWaterVertexShader,strlen(strWaterVertexShader),0,NULL,&pCode,NULL); BaseGraphicsLayer::GetDevice()->CreateVertexShader( dwWaterVertexDecl, (DWORD*)pCode->GetBufferPointer(), &m_dwWaterShader, 0 ); pCode->Release(); //CreateWaterBumpTexture(); } } } void CWaterScene::Render(LPDIRECT3DDEVICE8 pd3dDevice) { if(CRenderOption::m_WaterBumpEnvRendering) { matrix matWorld,matView,matProj,matWVP,matLastWVP; pd3dDevice->GetTransform(D3DTS_WORLD,matWorld); pd3dDevice->GetTransform(D3DTS_VIEW,matView); pd3dDevice->GetTransform(D3DTS_PROJECTION,matProj); matWVP=matWorld*matView; matWVP=matWVP*matProj; matLastWVP=matWVP; matWVP.Transpose(); float fZero[4]={0.0f,0.0f,0.0f,0.0f}; float fOne[4]={1.0f,1.0f,1.0f,1.0f}; vector3 *vecViewPos=BaseGraphicsLayer::m_ViewCamera.GetPosition(); float fViewPos[4]={vecViewPos->x,vecViewPos->y,vecViewPos->z,0.0f}; float fBumpScale[4]={0.0f,0.0f,0.0f,0.10f}; pd3dDevice->SetVertexShaderConstant(0,fZero,1); pd3dDevice->SetVertexShaderConstant(1,fOne,1); pd3dDevice->SetVertexShaderConstant(2,&matWVP,4); //world pd3dDevice->SetVertexShaderConstant(6,&matWorld._11,1); pd3dDevice->SetVertexShaderConstant(7,&matWorld._21,1); pd3dDevice->SetVertexShaderConstant(8,&matWorld._31,1); //Basic pd3dDevice->SetVertexShaderConstant(9,&matWorld._11,1); pd3dDevice->SetVertexShaderConstant(10,&matWorld._21,1); pd3dDevice->SetVertexShaderConstant(11,&matWorld._31,1); fViewPos[0]-=matWorld._41; fViewPos[1]-=matWorld._42; fViewPos[2]-=matWorld._43; pd3dDevice->SetVertexShaderConstant(12,fViewPos,1); pd3dDevice->SetVertexShaderConstant(13,fBumpScale,1); pd3dDevice->SetTexture(0, m_pBumpMap[m_lWaterTexture]); pd3dDevice->SetTexture(1, NULL); pd3dDevice->SetTexture(2, NULL); pd3dDevice->SetTexture(3, m_pCubeTexture); pd3dDevice->SetVertexShader(m_dwWaterShader); pd3dDevice->SetPixelShader(m_dwWaterPixelShader); float fWaterColor[4]={CSceneManager::m_WeatherManager.m_InterWaterColor.r/255.0f, CSceneManager::m_WeatherManager.m_InterWaterColor.g/255.0f, CSceneManager::m_WeatherManager.m_InterWaterColor.b/255.0f,1.0f}; pd3dDevice->SetPixelShaderConstant(0,fWaterColor,1); pd3dDevice->SetRenderState( D3DRS_ALPHABLENDENABLE, TRUE ); pd3dDevice->SetRenderState( D3DRS_SRCBLEND, D3DBLEND_SRCALPHA); pd3dDevice->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA); pd3dDevice->SetRenderState( D3DRS_FOGENABLE,TRUE); pd3dDevice->LightEnable(0,FALSE); pd3dDevice->SetRenderState( D3DRS_LIGHTING,FALSE); pd3dDevice->SetStreamSource(0,m_pWaterVertexBuffer,sizeof(Dot3Vertex)); pd3dDevice->DrawPrimitive(D3DPT_TRIANGLESTRIP,0,2); pd3dDevice->SetPixelShader(NULL); /* matrix matWorld,matView,matProj,matWVP,matLastWVP; pd3dDevice->GetTransform(D3DTS_WORLD,matWorld); pd3dDevice->GetTransform(D3DTS_VIEW,matView); pd3dDevice->GetTransform(D3DTS_PROJECTION,matProj); matWVP=matWorld*matView; matWVP=matWVP*matProj; matLastWVP=matWVP; matWVP.Transpose(); pd3dDevice->SetVertexShaderConstant(0,&matWVP,4); matrix matTex,matTexScale; matTexScale.MakeIdent(); matTexScale._11=0.5f; matTexScale._22=-0.5f; matTexScale._33=0.0f; matTexScale._41=0.5f; matTexScale._42=0.5f; matTexScale._43=1.0f; matTexScale._44=1.0f; matTex=matLastWVP*matTexScale; matTex.Transpose(); pd3dDevice->SetVertexShaderConstant(4,&matTex,4); pd3dDevice->SetStreamSource(0,m_pWaterVertexBuffer,sizeof(MultiVertex)); */ /* matrix m_matBumpMat; m_matBumpMat.MakeIdent(); static float m_fTime = 0.0f; m_fTime+=0.01f; float r = 0.04f; m_matBumpMat._11 = r * cosf( m_fTime * 9.0f ); m_matBumpMat._12 = -r * sinf( m_fTime * 9.0f ); m_matBumpMat._21 = r * sinf( m_fTime * 9.0f ); m_matBumpMat._22 = r * cosf( m_fTime * 9.0f ); pd3dDevice->SetTextureStageState( 0, D3DTSS_BUMPENVMAT00, F2DW( m_matBumpMat._11 ) ); pd3dDevice->SetTextureStageState( 0, D3DTSS_BUMPENVMAT01, F2DW( m_matBumpMat._12 ) ); pd3dDevice->SetTextureStageState( 0, D3DTSS_BUMPENVMAT10, F2DW( m_matBumpMat._21 ) ); pd3dDevice->SetTextureStageState( 0, D3DTSS_BUMPENVMAT11, F2DW( m_matBumpMat._22 ) ); //pd3dDevice->SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_BUMPENVMAP ); pd3dDevice->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE ); pd3dDevice->SetTextureStageState( 0, D3DTSS_COLORARG2, D3DTA_CURRENT ); pd3dDevice->SetTextureStageState( 1, D3DTSS_COLORARG1, D3DTA_TEXTURE ); pd3dDevice->SetTextureStageState( 1, D3DTSS_COLOROP, D3DTOP_SELECTARG1 ); pd3dDevice->SetTextureStageState( 2, D3DTSS_COLOROP, D3DTOP_DISABLE); pd3dDevice->SetTexture(0,m_WaterBumpMap); pd3dDevice->SetTexture(1,m_pRelectionTexture.GetTexture()); //pd3dDevice->SetTexture(1,m_pRippleTexture.GetTexture()); //pd3dDevice->SetVertexShader(m_dwWaterShader); pd3dDevice->SetVertexShader(MultiFVF); pd3dDevice->SetTextureStageState(0,D3DTSS_TEXCOORDINDEX,0); pd3dDevice->SetTextureStageState(1,D3DTSS_TEXCOORDINDEX,1); pd3dDevice->SetTextureStageState(1, D3DTSS_TEXTURETRANSFORMFLAGS, D3DTTFF_DISABLE); pd3dDevice->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP,2,m_WaterVertex,sizeof(MultiVertex)); for(int i=0;i<4;i++) { float tu,tv; BaseGraphicsLayer::ProjectiveTextureMapping(m_WaterVertex[i].v,tu,tv); m_WaterVertex[i].tu1=tu; m_WaterVertex[i].tv1=tv; } //pd3dDevice->DrawPrimitive(D3DPT_TRIANGLESTRIP,0,2); */ } else { /* matrix matView,matProj; pd3dDevice->GetTransform(D3DTS_VIEW,(D3DMATRIX*)&matView); pd3dDevice->GetTransform(D3DTS_PROJECTION,(D3DMATRIX*)&matProj); matrix matTexScale; matTexScale.MakeIdent(); matTexScale._11=0.5f; matTexScale._22=-0.5f; matTexScale._33=0.0f; matTexScale._41=0.5f; matTexScale._42=0.5f; matTexScale._43=1.0f; matTexScale._44=1.0f; matrix matInvView; matrix matTex2; matInvView.Inverse(matView); matrix mat,mat2; matTex2=matProj*matTexScale; pd3dDevice->SetTransform(D3DTS_TEXTURE1,(D3DMATRIX*)&matTex2); pd3dDevice->SetTextureStageState(1, D3DTSS_ADDRESSU, D3DTADDRESS_CLAMP); pd3dDevice->SetTextureStageState(1, D3DTSS_ADDRESSV, D3DTADDRESS_CLAMP); */ pd3dDevice->LightEnable(0,FALSE); pd3dDevice->SetRenderState( D3DRS_LIGHTING,FALSE); pd3dDevice->SetRenderState( D3DRS_FOGENABLE,TRUE); pd3dDevice->SetVertexShader(MultiFVF); pd3dDevice->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP,2,m_WaterVertex,sizeof(MultiVertex)); //pd3dDevice->SetTextureStageState(1, D3DTSS_ADDRESSU, D3DTADDRESS_WRAP); //pd3dDevice->SetTextureStageState(1, D3DTSS_ADDRESSV, D3DTADDRESS_WRAP); //matTexScale.MakeIdent(); //pd3dDevice->SetTransform(D3DTS_TEXTURE1,(D3DMATRIX*)&matTexScale); } } void CWaterScene::DeterminWaterTexture(LPDIRECT3DDEVICE8 pd3dDevice,bool isRelection) { if(isRelection) //pd3dDevice->SetTexture(1,m_pRelectionTexture.GetTexture()); pd3dDevice->SetTexture(1,m_pRippleTexture.GetTexture()); else pd3dDevice->SetTexture(1,NULL); pd3dDevice->SetTexture(0,m_WaterTexture[m_lWaterTexture].GetTexture()); } void CWaterScene::IncWaterTexture(float fUpdate) { //m_lWaterTexture++; if(m_lWaterTexture>=MAX_WATERTEXTURE) m_lWaterTexture=0; m_fUpdateWaterTexture+=fUpdate; m_lWaterTexture=((int)m_fUpdateWaterTexture)%MAX_WATERTEXTURE; } void CWaterScene::UpdateWave() { m_fWaveMove+=0.0007f; int ix,iy; for(ix=0;ixSetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE ); pd3dDevice->SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_SELECTARG1); pd3dDevice->SetTextureStageState( 0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE ); pd3dDevice->SetTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1); pd3dDevice->SetTextureStageState( 1, D3DTSS_COLOROP, D3DTOP_DISABLE); pd3dDevice->SetTextureStageState( 1, D3DTSS_ALPHAOP, D3DTOP_DISABLE); pd3dDevice->SetRenderState( D3DRS_LIGHTING,FALSE); pd3dDevice->SetRenderState( D3DRS_FOGENABLE ,FALSE); pd3dDevice->SetRenderState( D3DRS_ALPHABLENDENABLE,FALSE); pd3dDevice->SetVertexShader(TLVERTEXFVF); pd3dDevice->SetTexture(1,NULL); pd3dDevice->SetTexture(0,m_pRelectionTexture.GetTexture()); UpdateWave(); pd3dDevice->DrawIndexedPrimitiveUP(D3DPT_TRIANGLELIST,0,RippleVertexCount*RippleVertexCount, (RippleVertexCount-1)*(RippleVertexCount-1)*2,m_RippleIndices,D3DFMT_INDEX16,m_RippleVertex,sizeof(TLVertex)); } void CWaterScene::CreateWaterBumpTexture() { DWORD dwWidth,dwHeight; dwWidth=256; dwHeight=256; BaseGraphicsLayer::GetDevice()->CreateTexture(dwWidth,dwHeight,1,0,D3DFMT_V8U8,D3DPOOL_MANAGED,&m_WaterBumpMap); D3DLOCKED_RECT d3dlr; m_WaterBumpMap->LockRect( 0, &d3dlr, 0, 0 ); CHAR* pDst = (CHAR*)d3dlr.pBits; CHAR iDu, iDv; for( DWORD y=0; yUnlockRect(0); } #define SMALL_FLOAT 1e-12 void CWaterScene::CalcBasicVector3(Dot3Vertex *pVertex) { for(int i=0;i<4;i++) { pVertex[i].s=vector3(0.0f,0.0f,0.0f); pVertex[i].t=vector3(0.0f,0.0f,0.0f); } vector3 edge01,edge02; vector3 cp; for(i=0;i<2;i++) { Dot3Vertex& v0=pVertex[i+0]; Dot3Vertex& v1=pVertex[i+1]; Dot3Vertex& v2=pVertex[i+2]; edge01=vector3(v1.v.x-v0.v.x,v1.tu-v0.tu,v1.tv-v0.tv); edge02=vector3(v2.v.x-v0.v.x,v2.tu-v0.tu,v2.tv-v0.tv); cp=edge01^edge02; if(fabsf(cp.x) > SMALL_FLOAT) { v0.s.x+=-cp.y/cp.x; v0.t.x+=-cp.z/cp.x; v1.s.x+=-cp.y/cp.x; v1.t.x+=-cp.z/cp.x; v2.s.x+=-cp.y/cp.x; v2.t.x+=-cp.z/cp.x; } edge01=vector3(v1.v.y-v0.v.y,v1.tu-v0.tu,v1.tv-v0.tv); edge02=vector3(v2.v.y-v0.v.y,v2.tu-v0.tu,v2.tv-v0.tv); cp=edge01^edge02; if(fabsf(cp.x) > SMALL_FLOAT) { v0.s.y+=-cp.y/cp.x; v0.t.y+=-cp.z/cp.x; v1.s.y+=-cp.y/cp.x; v1.t.y+=-cp.z/cp.x; v2.s.y+=-cp.y/cp.x; v2.t.y+=-cp.z/cp.x; } edge01=vector3(v1.v.z-v0.v.z,v1.tu-v0.tu,v1.tv-v0.tv); edge02=vector3(v2.v.z-v0.v.z,v2.tu-v0.tu,v2.tv-v0.tv); cp=edge01^edge02; if(fabsf(cp.x) > SMALL_FLOAT) { v0.s.z+=-cp.y/cp.x; v0.t.z+=-cp.z/cp.x; v1.s.z+=-cp.y/cp.x; v1.t.z+=-cp.z/cp.x; v2.s.z+=-cp.y/cp.x; v2.t.z+=-cp.z/cp.x; } } for(i=0;i<4;i++) { pVertex[i].s.Normalize(); pVertex[i].t.Normalize(); pVertex[i].SxT=pVertex[i].s^pVertex[i].t; pVertex[i].Normal.Normalize(); if((pVertex[i].SxT*pVertex[i].Normal) < 0.0f) { pVertex[i].SxT=-pVertex[i].SxT; } } } void CWaterScene::RenderFlare(LPDIRECT3DDEVICE8 pd3dDevice) { if(CRenderOption::m_WaterBumpEnvRendering) { matrix matWorld,matView,matProj,matWVP,matLastWVP; pd3dDevice->GetTransform(D3DTS_WORLD,matWorld); pd3dDevice->GetTransform(D3DTS_VIEW,matView); pd3dDevice->GetTransform(D3DTS_PROJECTION,matProj); matWVP=matWorld*matView; matWVP=matWVP*matProj; matLastWVP=matWVP; matWVP.Transpose(); float fZero[4]={0.0f,0.0f,0.0f,0.0f}; float fOne[4]={1.0f,1.0f,1.0f,1.0f}; vector3 *vecViewPos=BaseGraphicsLayer::m_ViewCamera.GetPosition(); float fViewPos[4]={vecViewPos->x-matWorld._41,vecViewPos->y-matWorld._42,vecViewPos->z-matWorld._43,0.0f}; float fLightDirection[4]={-1.0f,-1.0f,-1.0f,0.0f}; pd3dDevice->SetVertexShaderConstant(0,fZero,1); pd3dDevice->SetVertexShaderConstant(1,fOne,1); pd3dDevice->SetVertexShaderConstant(2,&matWVP,4); pd3dDevice->SetVertexShaderConstant(12,fViewPos,1); pd3dDevice->SetVertexShaderConstant(13,fLightDirection,1); pd3dDevice->SetTexture(0, m_pBumpMap[m_lWaterTexture]); //pd3dDevice->SetTexture(1,m_pNormalizeCubeTexture); //pd3dDevice->SetTexture(1,m_pNormalizeCubeTexture); pd3dDevice->SetTexture(1,NULL); pd3dDevice->SetTexture(2, NULL); pd3dDevice->SetTexture(3, NULL); pd3dDevice->SetTexture(3, m_pCubeTexture); /* pd3dDevice->SetVertexShader(m_dwWaterSpecularVertexShader); pd3dDevice->SetPixelShader(m_dwWaterSpecularPixelShader); */ float fWaterColor[4]={CSceneManager::m_WeatherManager.m_InterWaterColor.r/255.0f, CSceneManager::m_WeatherManager.m_InterWaterColor.g/255.0f, CSceneManager::m_WeatherManager.m_InterWaterColor.b/255.0f,1.0f}; pd3dDevice->SetPixelShaderConstant(0,fWaterColor,1); pd3dDevice->SetVertexShader(m_dwWaterShader); pd3dDevice->SetPixelShader(m_dwWaterPixelShader); pd3dDevice->SetRenderState( D3DRS_ALPHABLENDENABLE,TRUE); pd3dDevice->SetRenderState( D3DRS_SRCBLEND, D3DBLEND_ONE); pd3dDevice->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_ONE); pd3dDevice->SetTextureStageState(0, D3DTSS_ADDRESSU, D3DTADDRESS_WRAP); pd3dDevice->SetTextureStageState(0, D3DTSS_ADDRESSV, D3DTADDRESS_WRAP); pd3dDevice->SetTextureStageState(3, D3DTSS_ADDRESSU, D3DTADDRESS_CLAMP); pd3dDevice->SetTextureStageState(3, D3DTSS_ADDRESSV, D3DTADDRESS_CLAMP); pd3dDevice->SetTextureStageState(3, D3DTSS_ADDRESSW, D3DTADDRESS_CLAMP); pd3dDevice->SetStreamSource(0,m_pWaterVertexBuffer,sizeof(Dot3Vertex)); pd3dDevice->SetRenderState( D3DRS_FOGENABLE,TRUE); pd3dDevice->DrawPrimitive(D3DPT_TRIANGLESTRIP,0,2); pd3dDevice->SetPixelShader(NULL); } }